永续合约没有到期日, 不需要持有现货, 通过 Funding Rate 让多空双方持续互相支付资金费用来把合约价格锚定到现货. 本文介绍永续合约的核心机制, 包括 Index / Mark / Last Price 三价体系, Funding Rate 计算逻辑, 盈亏公式, 以及链上三种定价模型 (vAMM, Oracle 型, 订单簿) 的对比.
一、术语表 1.1 基础概念
术语
英文
含义
永续合约
Perpetual Swap / Perp
无到期日的衍生品合约, 追踪底层资产价格
底层资产
Underlying Asset
合约追踪的标的, 如 ETH, BTC
做多
Long
押注价格上涨, 价格涨了赚差价
做空
Short
押注价格下跌, 价格跌了赚差价
杠杆
Leverage
用少量保证金控制更大头寸. 10x 杠杆 = 用 100U 控制 1000U
头寸
Position
持有的合约仓位, 包含方向 (多/空), 大小, 开仓价格
1.2 价格体系
术语
英文
含义
指数价格
Index Price
多个现货交易所的加权平均价格, 代表 “真实市场价”
标记价格
Mark Price
协议用于计算盈亏和清算的参考价格, 通常基于指数价格 + 溢价的移动平均
最新成交价
Last Price
协议内最近一笔交易的成交价格
中间价
Mid Price
订单簿 (所有挂单的列表) 最高买价和最低卖价的平均值
溢价
Premium
本协议价格比现货贵多少 (或便宜多少). 溢价 = 中间价 - 指数价格. 正数=贵, 负数=便宜
溢价指数
Premium Index
对一段时间内的溢价做加权平均后的值, 用于计算资金费率 (见下方)
基差
Basis
标记价格与指数价格的偏差. 和溢价相关但不等价 (详见 §2.3)
1.3 资金费率
术语
英文
含义
资金费率
Funding Rate
多空双方定期互相支付的费率, 用于锚定永续价格到现货价格
资金费用
Funding Payment
实际支付金额 = 仓位大小 × 资金费率
结算周期
Funding Interval
资金费率结算频率, 通常 8h (CEX, 中心化交易所) 或 1h (部分 DeFi, 去中心化金融)
术语
英文
含义
保证金
Margin / Collateral
开仓时抵押的资金, 作为履约担保
初始保证金
Initial Margin (IM)
开仓所需的最低保证金, IM = position size / leverage
维持保证金
Maintenance Margin (MM)
持仓所需的最低保证金, 低于此触发清算
清算
Liquidation
保证金不足时强制平仓, 防止穿仓 (负债)
二、为什么需要永续合约? 2.1 传统期货 vs 永续合约
传统期货 vs 永续合约
传统期货 (Dated Futures)
开仓
持仓期
季度到期
强制交割/平仓
重新开仓
(新合约, 新费用)
到期 → 强制平仓 → 移仓成本 → 流动性分散在多个到期日
永续合约 (Perpetual Swap)
开仓
永不到期, 想持多久持多久
平仓
每 8h / 1h 结算一次 funding
无到期日 → 无移仓成本 → 流动性集中 → 靠 funding rate 锚定现货价
维度
传统期货
永续合约
到期日
有 (季度/月度)
无
价格锚定
到期日交割收敛
funding rate (资金费率) 持续锚定
移仓成本
每个到期日需要移仓
无, 一直持有
流动性
分散在多个到期日
集中在一个合约
持仓费用
无 (到期前)
funding payment (资金费用, 可正可负)
核心区别 : 传统期货用 “到期交割” 拉回价格, 永续合约用 “资金费率 (funding rate)” 持续锚定. 永续合约的 funding rate 本质上是 把到期日交割的一次性收敛, 分摊成每 8h 的微调 .
2.2 到期交割 vs Funding Rate (资金费率) 两种锚定机制的本质不同: 到期交割是 硬锚定 (hard peg) , funding rate 是 软锚定 (soft peg) :
到期交割 vs Funding Rate (资金费率)
传统期货: 硬锚定
到期日强制按 index price 现金结算
数学保证: 到期瞬间 futures = spot
类比: 考试交卷: 平时可以乱写, 但交卷时必须对
优势: 有明确的 deadline, 偏离必须归零
套利者知道终点一定来, 提前布局
劣势: 远离到期日时 basis (基差) 可以很大 (+5%~8%)
多个到期日分散流动性
永续合约: 软锚定
持续经济激励, 偏离越大费率越高
不保证任何时刻 perp = spot
类比: 持续随堂测验: 每次纠偏一点, 但不保证完全正确
优势: 日常锚定精度高 (每 8h/1h 持续修正)
流动性集中, 价格发现更连续
劣势: 极端行情可能持续偏离, 费率有上限 (clamp)
没有 deadline, 市场可以 "一直不理性"
Funding Rate 软锚定可能失效的三个环节
1
费率有上限: clamp ±0.75%/8h, 偏离 5% 时费率到顶也不够补偿, 套利者不进场
2
套利需要资金: 同时持有现货+反向仓位, 极端行情下借贷利率飙升, 成本 > funding 收入
3
没有终止条件: 传统期货到期日是 deadline, funding rate 没有, 偏离可以无限持续
真实案例 : 2021 年牛市高峰, BTC 永续溢价持续 +2%~3%, funding rate 连续几周 > +0.1%/8h (年化超过 100%), 但价格就是不收敛, 做多情绪太强, 即使付高额 funding 也不愿平仓. 同期 CME BTC 季度合约也有 +5%~8% basis (基差, 期货价与现货价的偏差), 但到期前几天 basis 快速收敛, 因为做市商知道 deadline 一定会来.
一句话总结 : 传统期货是 “考试交卷”: 平时可以乱写, 但交卷时必须对. Funding rate 是 “持续随堂测验”: 每次纠偏一点, 但没有一个时刻能保证完全正确. 日常运行中 funding rate 的锚定更平滑; 但遇到极端行情, 到期交割的硬保证是 funding rate 无法替代的.
2.3 为什么对标期货而不是股票? 期货不一定要交割实物. 加密货币期货几乎全部是 现金交割 (cash-settled) , 到期时只按 index price (指数价格) 算盈亏, 多退少补, 从来没有人真的 “交付 BTC”.
交割方式
到期时
例子
实物交割 (Physical Delivery)
真的交付商品
原油期货 → 交付原油
现金交割 (Cash Settlement)
只结算价差
BTC 季度期货 → 结算 USD 差价
所以期货的本质不是 “交割实物”, 而是: 一份关于未来价格的合约 (contract) .
永续合约对标期货而非股票, 是因为两者共享同一套 DNA:
特征
股票 (Stock)
期货 (Futures)
永续 (Perp)
持有底层资产
是 (你是股东)
否 (只是一份合约)
否
杠杆能力: 少量资金撬动大头寸
非原生 (融资: 向券商借钱买股)
原生 (交保证金即可, 比例决定杠杆)
原生
做空能力: 看跌也能赚钱
非原生 (融券: 向券商借股票来卖)
原生 (卖出合约即可)
原生
对手方
无 (你拥有资产)
有 (零和博弈)
有
到期日 (Expiry)
无
有
无
Spot (现货) 买 BTC
=
买股票
拥有资产
无杠杆
无到期
无对手方
永续做多 BTC
=
买期货合约
不拥有资产
有杠杆
有对手方
funding rate 锚定
现货 = 拥有资产本身 | 永续 = 持有一份关于价格的合约 (零和博弈)
永续合约的本质: 不交割, 不持有, 只赌价格方向
一句话 : 永续合约是 “去掉到期日的期货”, 不是 “加了杠杆的股票”. 它和期货一样, 本质是一份关于价格的 对赌合约 (contract) , 交易者从未拥有底层资产.
补充: 传统金融中的 CFD (Contract for Difference, 差价合约) 和永续合约非常像 – 也是不持有资产, 只赌价差, 有杠杆. 永续合约本质上就是加密货币版的 CFD, 但多了 funding rate (资金费率) 这个锚定机制.
2.4 永续合约 = 链上做空最简单的方式 链上做空不止永续合约一种, 但永续是成本最低、操作最简单的:
方式
操作
持续成本
复杂度
借贷做空 (Aave)
存抵押 → 借 ETH → 卖 → 等跌 → 买回 → 还
借贷利率 + 2 次 swap 费
高 (6 步)
期权做空 (Lyra)
买 PUT 期权 (看跌期权)
期权费 (注: 这里 premium 指买期权的费用, 和后文的 “溢价” 是不同含义)
中
永续做空
开 short position
funding (可能收钱)
低 (1 步)
永续合约让做空变得和做多一样简单: 开一个 short position (空头仓位), 价格跌了就赚钱.
三、价格体系: Index, Mark, Last 三个价格各有分工, 不要混淆:
三种价格的关系与用途
Index Price
现货市场加权均价
Binance 30% + OKX 25%
+ Coinbase 25% + Kraken 20%
来源: 外部 (链下/链上预言机)
Mark Price
保证金 & 清算参考价
= index + EMA(basis)
或 = index (部分 DeFi)
用途: PnL 计算, 清算判定
Last Price
最新成交价
由市场供需决定
可能偏离 index
用途: 市场实时供需参考
输入
为什么不直接用 Last Price 做一切?
Last Price 容易被操纵: 一笔大单就能瞬间拉高/砸低
如果用 last price 判定清算, 攻击者可以故意砸盘触发大规模清算后抄底
Mark Price 基于 Index (多交易所均价), 抗操纵能力远强于单一市场的 Last Price
3.1 Index Price: 真实市场价 Index price 是多个现货交易所的加权平均价格:
1 2 3 4 index_price (指数价格) = Σ(weight_i (权重) × spot_price_i (现货价格) )
链上协议获取 index price 的方式 :
CEX (Binance/OKX) : 自己算, 取多个交易所价格加权
GMX : 用 Chainlink oracle 喂价 (多个 data source 聚合)
dYdX v4 : 验证者节点各自从多个交易所拉价格, 链上达成共识
Hyperliquid : 验证者从多个 CEX 拉价格, 取中位数
3.2 Mark Price: 清算参考价 Mark price 是协议 内部 使用的价格, 用于:
计算未实现盈亏 (unrealized PnL)
判定是否触发清算
计算保证金率
1 2 3 4 5 6 mark_price (标记价格) = index_price (指数价格) + EMA (last_price (最新成交价) - index_price) mark_price = index_price
为什么 Mark ≠ Last? Last price 是单一市场内的价格, 可以被操纵. 如果用 last price 判定清算, 攻击者只需在本协议内砸盘就能批量清算他人. Mark price 锚定 index (多交易所均价), 攻击者必须同时操纵多个交易所, 成本极高.
3.3 基差移动平均 (EMA of Premium) 怎么算? EMA (Exponential Moving Average, 指数移动平均) 是一种 “算平均值” 的方法, 但 越新的数据越重要, 越旧的数据越不重要 .
先和简单平均对比:
简单平均 vs EMA: 权重对比
过去 4 次采到的溢价 (旧→新): +10, +18, +12, +15
简单平均: 权重相同
+10
25%
+18
25%
+12
25%
+15
25%
旧
新
= (10+18+12+15) / 4 = 13.75
EMA: 越新权重越大
+10
10%
+18
20%
+12
30%
+15
40%
旧
新
= 10×0.1 + 18×0.2 + 12×0.3 + 15×0.4 = 14.2
13.0
15.0
13.75
简单平均
14.2
EMA
最新值 = 15
EMA 更接近最新数据 (15), 因为新数据权重更大
递推公式:
EMA 递推公式
EMA_t = α × value_t + (1 - α) × EMA_t-1
α (alpha) = 新数据权重
value_t = 刚采到的新数据
EMA_t-1 = 上一轮平均值
EMA_t = 新平均值 (结果)
大白话 (α = 0.4): 新平均 = 40% × 新数据 + 60% × 旧平均
两部分加起来 = 40% + 60% = 100%, 永远如此
手算一遍 (α = 0.4):
EMA 手算 (α = 0.4)
起点
10
第 1 轮: 新数据 = 18
0.4×18 + 0.6×10 = 13.2
第 2 轮: 新数据 = 12
0.4×12 + 0.6×13.2 = 12.72
第 3 轮: 新数据 = 15
0.4×15 + 0.6×12.72 = 13.63
趋势:
10
18
10
18
12
15
13.2
12.72
13.63
原始数据 (跳跃)
EMA (平滑跟踪, 方向一致但幅度小)
α 的大小决定了 “反应速度”:
α 越大反应越快, 越小越稳定
α = 0.1
新数据占 10%
α = 0.4
新数据占 40%
α = 0.9
新数据占 90%
慢/稳定
快/敏感
老学究: 要看很多证据才改变看法
N=99 → α=0.02 极度平滑
普通人: 新旧都参考, 适度调整
N=10 → α=0.18 中等平滑
急性子: 听到什么就信什么
N=3 → α=0.5 快速跟踪
公式: α = 2 / (N + 1), N = 窗口期 (采样点数量)
3.4 什么是 TWAP (时间加权平均价格)? TWAP (Time-Weighted Average Price, 时间加权平均价格) 是另一种 “算平均值” 的方法. 和 EMA 的思路类似, 都是让新数据权重大于旧数据, 但实现方式不同:
EMA vs TWAP: 一句话区别
EMA: 流式
每来一个新数据, 递推算一次 (α×新 + (1-α)×旧)
TWAP: 批量
收集窗口期内所有数据, 按 "距今多近" 分配权重, 一次性算
TWAP 的核心思想 + 手算:
TWAP 公式与手算
TWAP = Σ(数据_i × 时间权重_i) / Σ(时间权重_i)
时间权重: 越近越大, 越远越小 (甚至为 0). Σ = 全部加起来
过去 4 分钟数据, 权重 = (4 - 距今分钟数):
3 分钟前 (旧)
+10
权重 1
2 分钟前
+18
权重 2
1 分钟前
+12
权重 3
刚才 (新)
+15
权重 4
权重
递增
TWAP = (10×1 + 18×2 + 12×3 + 15×4) / (1 + 2 + 3 + 4)
= (10 + 36 + 36 + 60) / 10
= 142 / 10 = 14.2
简单平均 = 13.75
TWAP = 14.2 (更接近最新值 15)
和 EMA 结果一样 (14.2), 因为示例数据和权重恰好吻合. 实际中两者结果会有差异.
EMA vs TWAP 对比:
EMA vs TWAP: 对比与选型
EMA (流式计算)
每来一个数据立刻更新
存储: 1 个数字 (旧平均已浓缩所有历史)
实时性: 来一个算一个, 立刻出结果
历史范围: 理论上无限长 (旧数据衰减但不为零)
可调整性: 差, 原始数据已 "融化", 改 α 需从头重算
适合: 实时系统
TWAP (批量计算)
收集窗口期所有数据, 一次性算
存储: 窗口内所有原始数据 (如 1920 个点)
实时性: 需要窗口期内数据才完整
历史范围: 有硬窗口 (8h 前的数据权重=0, 彻底丢弃)
可调整性: 好, 保留原始数据, 可事后改权重/剔除异常
适合: 定期结算 (每 8h 算一次资金费率)
为什么链上用 EMA, 链下用 TWAP?
链上合约 (存储 = gas, 非常贵)
→ 倾向 EMA, 只需存 1 个状态变量
例: GMX v2 资金费率用 EMA 风格累积
链下系统 (存储便宜, 需精确控制)
→ 倾向 TWAP, 存所有原始数据, 随时调整
例: Binance 标记价格 (服务器上跑, 存 1920 点)
链上和链下在同一个概念 (如资金费率) 上用不同算法, 不是因为数学上哪个更好, 而是 链上存储成本 决定了选择.
3.5 Binance 实际怎么算 Mark Price Binance 的做法更接近 TWAP 而非经典 EMA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1. 每 15 秒采样一次溢价 (premium, 本协议价格比现货贵多少): 先理解订单簿 (order book, 就是所有挂单的列表) 的两个关键价格: - best_bid (最高买价): 所有买单中出价最高的, 即 "有人愿意最多花这么多钱买" - best_ask (最低卖价): 所有卖单中要价最低的, 即 "有人愿意最少收这么多钱卖" - mid_price (中间价): 两者的平均值 = (best_bid + best_ask) / 2 例: best_bid = $ 2998 , best_ask = $ 3002 mid_price = ($ 2998 + $ 3002 ) / 2 = $ 3000 premium_i (瞬时溢价) = mid_price 和 index_price (指数价格) 的差距: premium_i = mid_price - index_price 2. 过去 8 h 内有 1920 个采样点 (8 h × 60 min × 每分钟 4 个)3. 对所有采样点做 TWAP (时间加权平均): premium_index (溢价指数) = Σ(premium_i × 时间权重_i) / Σ(时间权重_i) 时间权重_i = max (0 , 480 - 距今分钟数_i) 4. Mark Price (标记价格): mark_price = index_price + premium_index
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 数字例子: ───────────────────────────────── ETH index_price (指数价格) = $3000 过去几个采样点的溢价 (旧→新): 8 h 前: mid=$3010 , 溢价 = +$10 , 权重 = 0 (太旧, 忽略) 4 h 前: mid=$3018 , 溢价 = +$18 , 权重 = 240 15 s 前: mid=$3012 , 溢价 = +$12 , 权重 = 479 刚才: mid=$3015 , 溢价 = +$15 , 权重 = 480 ... (实际有 1920 个点, 这里只展示 4 个帮助理解) 时间加权平均后, premium_index (溢价指数) ≈ +$13 mark_price = $3000 + $13 = $3013 // mark ($3013 ) 既不是最新的 mid ($3015 ) 也不是 index ($3000 )// 而是 index + 平滑后的溢价, 抗短期操纵
3.6 为什么不直接用 EMA(last_price)? 1 2 3 4 5 6 7 8 9 方案 A: mark (标记价格) = EMA(last_price (最新成交价)) 问题: last_price 被砸盘到 $2800 , EMA 虽然平滑但会被逐渐拖下去 攻击者持续施压, 最终可以操纵 mark price 方案 B: mark = index (指数价格) + EMA(last - index ) ← 实际采用 优势: index 来自多个外部交易所, 攻击者无法操纵 EMA 只平滑 "溢价" 部分 即使本协议的 last_price 被操纵, mark price 仍然锚定 index 极端情况: 协议内被砸但外部不动 → 溢价 (premium) 变负 → EMA 拉回 → mark ≈ index
各协议对比 :
Binance : index + TWAP(溢价), 每 15s 采样, 8h 窗口
GMX : 直接 mark = chainlink_oracle_price, 无需 EMA (Oracle 本身已是多源聚合)
dYdX v4 : 验证者各自从多个 CEX 拉价格, 链上共识取中位数
Uniswap TWAP : 同样的思路, 用时间窗口内的加权平均来抗短期操纵
3.7 Basis (基差): 标记价格与指数价格的偏差 1 2 3 4 5 6 7 8 9 basis (基差) = mark_price (标记价格) - index_price (指数价格)
basis 反映市场状态, 而 funding rate 的计算基于 premium (order book 中间价与 index 的偏差), 下一节详解.
四、Funding Rate: 永续合约的灵魂 Funding rate 是永续合约最核心的创新. 它解决了一个关键问题:
没有到期日, 永续价格凭什么跟着现货走?
答: 每隔固定时间, 让 “赢的一方” 付钱给 “输的一方”, 制造经济激励, 把价格拉回来.
4.1 直觉理解
Funding Rate 核心机制
场景 A: 永续 > 现货 (溢价)
多头太多, 把永续价格推高了
多头 Long
空头 Short
funding rate > 0
多头付钱给空头
效果:
• 持有多头有成本 → 部分多头平仓
• 持有空头有收益 → 吸引新空头
→ 多空再平衡, 永续价格回落
场景 B: 永续 < 现货 (折价)
空头太多, 把永续价格压低了
多头 Long
空头 Short
funding rate < 0
空头付钱给多头
效果:
• 持有空头有成本 → 部分空头平仓
• 持有多头有收益 → 吸引新多头
→ 多空再平衡, 永续价格回升
funding rate 是一个自动的 "弹簧": 永续价格偏离现货越远, 回拉的力就越大
4.2 资金费率 (Funding Rate) 计算 资金费率的计算因协议而异, 但核心逻辑一致:
1 2 3 4 5 6 7 8 资金费率 = 溢价分量 + 利率分量 即: funding_rate = premium_component + int erest_rate_component (资金费率) (溢价分量) (利率分量)
4.3 Binance 模型 (中心化交易所标准, 也是很多 DeFi 协议的参考) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 premium_i = (mid_price - index_price) / index_price (瞬时溢价率) (中间价) (指数价格) (指数价格) premium_index = TWAP(premium_i, window =8 h) (溢价指数) (时间加权平均)(瞬时溢价率) interest_rate = 0.01 % per 8 h (利率分量) funding_rate = premium_index + clamp (interest_rate - premium_index, -0.05 %, +0.05 %) (资金费率) (溢价指数) (限幅函数)(利率分量)
4.4 资金费用 (Funding Payment) 每次结算时, 每个仓位需要支付 (或收取) 的金额:
1 2 3 4 5 6 7 8 9 10 11 12 13 资金费用 = 仓位名义价值 × 资金费率 即: funding_payment = position_size × funding_rate (资金费用) (仓位名义价值) (资金费率)// 例: 保证金 $300 , 10 x 杠杆做多 ETH @ $3000 // 仓位名义价值 = $300 × 10 = $3000 (= 1 ETH)// 资金费率 = +0.01 %// 资金费用 = $3000 × 0.01 % = $0 .30 // // 注意: 按仓位名义价值 $3000 计算, 不是按保证金 $300 // 所以 10 x 杠杆意味着 funding 对保证金的影响也被放大了 10 倍
关键 : funding 是 多空之间互相支付 , 协议不收取也不支付 funding (零和博弈). 这和借贷利率不同, Aave 的利息由借款人付给存款人, 平台抽成.
4.5 Funding Rate 的经济含义 funding rate 不仅是锚定机制, 还是 市场情绪的晴雨表 :
资金费率
市场情绪
含义
套利机会
大幅正 (>0.05%)
极度看多
多头愿意付高额费率持仓
现货买入 + 永续做空 = 赚资金费用 (详见 §3.4)
小幅正 (~0.01%)
温和看多
正常市场, 多头略多
-
0 附近
中性
多空均衡
-
小幅负
温和看空
空头略多
-
大幅负 (<-0.05%)
极度看空
空头愿意付高额费率持仓
借币卖出 (做空) + 永续做多 = 赚资金费用
4.6 资金费率套利 (Delta-Neutral, 方向中性) 核心思路: 一边做多, 一边做空, 价格涨跌对你没影响, 只赚资金费用.
当资金费率持续为正时 (多头付钱给空头), 经典套利策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 策略: 现货买入 + 永续做空 (Cash-and -Carry ) ───────────────────────────────1 . 现货市场: 买入 1 ETH ($3000 ) ← 真的持有 ETH2 . 永续合约: 做空 1 ETH ($3000 , 1 x) ← 开空头仓位 两边对冲: +1 ETH (现货持有) - 1 ETH (永续做空) = 0 ← 净敞口为零, 不赌方向 价格涨跌对你没影响: ETH 涨到 $3500 → 现货赚 $500 , 永续亏 $500 , 互相抵消 ETH 跌到 $2500 → 现货亏 $500 , 永续赚 $500 , 互相抵消 利润来源 = 资金费用: 资金费率 = +0.01 % 每 8 h 你的空头仓位每 8 h 收到: $3000 × 0.01 % = $0 .30 每天 3 次结算: $0 .30 × 3 = $0 .90 年化收益率 ≈ 0.01 % × 3 × 365 = 10.95 % 风险: - 资金费率可能转负 → 你从收钱变成付钱, 需要及时关仓 - 永续做空需要保证金, 极端行情可能被清算 - 交易所风险 (中心化交易所跑路) / 合约风险 (DeFi 智能合约漏洞)
反过来, 当资金费率持续为负时 (空头付钱给多头):
1 2 3 4 5 6 7 8 9 策略: 借币卖出 + 永续做多 ───────────────────────────────1. 借贷平台 : 借 1 ETH, 卖掉得 $3000 ← 现货做空2. 永续合约: 做多 1 ETH ← 开多头仓位 两边对冲, 净敞口 = 0 利润来源 = 你的多头仓位每 8 h 收到资金费用 额外成本 = 借贷利率
这就是为什么资金费率不会长期偏离太远, 套利者会持续把它拉回来. 费率越高, 套利利润越大, 吸引越多人来做反向对冲, 费率就被压下去了.
五、盈亏计算 (PnL) 5.1 基本公式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // 做多 (Long) PnL (盈亏) = (exit_price (平仓价) - entry_price (开仓价)) × quantity (持仓数量) = (exit_price - entry_price) / entry_price × position_size (名义价值) / / 等价写法, 详见 P02 §2.2 // 做空 (Short) PnL = (entry_price - exit_price) × quantity// 其中:// quantity = 持有的 token 数量 (如 1 ETH)// position_size = quantity × entry_price = 名义价值 (如 $3000 ) ROE (回报率) = PnL / margin (保证金) = PnL × leverage (杠杆) / position_size// 例: 10 x 杠杆做多 1 ETH @ $3000 // quantity = 1 ETH, position_size = $3000 // margin = $3000 / 10 = $300 (初始保证金)// ETH 涨到 $3150 (+5 %)// PnL = ($3150 - $3000 ) × 1 = $150 // ROE = $150 / $300 = 50 % ← 5 % 的价格变动, 10 x 杠杆 = 50 % 收益
5.2 完整 PnL (含 funding + 费用) 1 2 3 4 5 realized_PnL (已实现盈亏) = trading_PnL (交易盈亏) + Σ(funding_payments (资金费用)) - trading_fees (交易手续费)
5.3 杠杆的双面性
10x 杠杆做多 ETH @ $3000 (保证金 $300)
价格
$3300
+10% → ROE +100% ($300 → $600)
$3150
+5% → ROE +50% ($300 → $450)
$3000
开仓价 (保证金 $300)
$2850
-5% → ROE -50% ($300 → $150)
$2700
-10% → ROE -100% → 清算 (保证金归零)
10x 杠杆做多 : 价格涨 10% → 翻倍; 价格跌 10% → 清零 (清算). 杠杆放大收益的同时, 等比例放大亏损. 清算线 ≈ 1/leverage - MMR ≈ 9.5% (详见 P02 §2.3).
六、多空平衡与 Open Interest 6.1 Open Interest (OI, 未平仓合约) 1 2 3 4 5 6 open_interest (未平仓合约总量) = Σ(所有未平仓的 long positions (多头仓位) ) = Σ(所有未平仓的 short positions (空头仓位) )
6.2 OI 的意义
OI 变化
含义
OI 上升 + 价格上升
新多头入场 (看多信号增强)
OI 上升 + 价格下降
新空头入场 (看空信号增强)
OI 下降 + 价格上升
空头平仓 (空头投降)
OI 下降 + 价格下降
多头平仓 (多头投降)
6.3 链上 vs CEX 的 OI 限制
维度
CEX (Binance)
DeFi (GMX)
DeFi (dYdX)
OI 上限
动态调整
硬上限 (per asset)
硬上限 (per market)
多空平衡
市场自由决定
OI cap 限制单侧
funding rate 调节
OI 数据
API 查询
链上可读
链上可读
DeFi 特有问题 : GMX 这类 Oracle 型永续, LP 池 (GLP) 是所有交易者的对手方. 如果 90% 的人做多, LP 池就承担了巨大的空头风险. 所以 GMX 必须设置 OI cap 限制单侧持仓, 否则 LP 可能被抽干. 这个话题在 P03 (GMX) 中详细展开.
七、链上永续合约的三种定价模型 链上实现永续合约有三种主流方式, 各有优劣:
三种链上永续定价模型
Oracle 型
代表: GMX, Gains Network
定价: Chainlink Oracle
对手方: LP 池 (GLP)
市价单滑点: 无滑点
结算: 链上
+ 零滑点, UX 好
+ 简单直觉
- LP 承担方向性风险
- OI 受限于池子大小
- 依赖 Oracle 安全
→ 详见 P03
订单簿型
代表: dYdX, Hyperliquid
定价: Maker/Taker 撮合
对手方: 其他交易者
市价单滑点: 取决于深度
结算: 链上/链下
+ 真正的价格发现
+ 无 OI 天花板
- 需要做市商提供深度
- 冷门币对深度差
- 链上撮合性能要求高
→ 详见 P04 (dYdX), P06 (Hyperliquid)
vAMM 型
代表: Perp Protocol, Drift
定价: 虚拟 AMM 曲线
对手方: 虚拟池 (无真实LP)
市价单滑点: 曲线斜率决定
结算: 链上
+ 纯链上定价 (v1 无 Oracle, v2 引入辅助)
+ 无需做市商
- 虚拟池参数调节难
- 易被 squeeze
- 大额滑点高
→ 详见 P05
Oracle 型 → 用户体验优先 | 订单簿型 → 资本效率优先 | vAMM 型 → 去中心化优先
7.1 模型对比
维度
Oracle 型 (GMX)
订单簿型 (dYdX)
vAMM 型 (Perp Protocol)
价格来源
Chainlink 喂价
做市商报价撮合
虚拟 x*y=k 曲线
市价单滑点
无滑点
取决于订单簿深度
取决于虚拟池大小
LP 风险
高 (方向性风险)
无传统 LP
无真实 LP
资本效率
低 (需要大 GLP 池)
高 (做市商杠杆)
中
去中心化程度
中 (依赖 Oracle)
低~中 (链下撮合)
高 (v1 纯链上, v2 依赖 Oracle)
可扩展性
受 Oracle 币种限制
理论无限
受虚拟池参数限制
八、Funding Rate 的链上实现 不同协议对 funding rate 的实现差异很大, 这里给出核心思路:
8.1 离散结算 (CEX 风格) 1 2 3 4 5 6 7 8 9 10 11 12 if block.timestamp >= next_funding_time (下次结算时间): rate (费率) = calculate_funding_rate () for each position (仓位): payment (费用) = position.size (仓位大小) * rate if position.is_long: position.margin (保证金) -= payment else : position.margin += payment next_funding_time += 8 hours
8.2 连续累积 (DeFi 常见) 链上不可能遍历所有 position, 所以用 全局累积变量 实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // 类似 Uniswap 的 feeGrowthGlobal 思路 int256 public cumulativeFundingRate; // 全局累积资金费率 // 每次有交互时更新全局状态 function _updateFunding() internal { int256 rate = _calculateFundingRate(); // rate (费率) int256 elapsed = block.timestamp - lastFundingUpdate; // elapsed (经过时间) cumulativeFundingRate += rate * elapsed; // 累积资金费率 += 费率 × 时间 lastFundingUpdate = block.timestamp; } // 每个 position (仓位) 记录 "入场时的累积值" struct Position { int256 size; // size (仓位大小): 正=多头, 负=空头 uint256 margin; // margin (保证金) int256 entryFundingRate; // entryFundingRate (入场累积费率): 开仓时的 cumulativeFundingRate } // 计算某个 position 的 pending funding (待结算资金费用) function pendingFunding(Position memory pos) view returns (int256) { int256 fundingDelta = cumulativeFundingRate - pos.entryFundingRate; // fundingDelta (费率差值) return pos.size * fundingDelta; // size > 0 = long, size < 0 = short // fundingDelta > 0 = 多头付钱 }
这个模式和 Uniswap 的手续费累积完全一样 (Uniswap V3 的手续费累积机制). 核心思想: 不逐个更新, 而是维护一个全局累积值, 每个 position 只记录 “入场快照”. 任何时刻: pending = global_cumulative - entry_snapshot. 这样无论有多少 position, gas 成本都是 O(1).
累积值是双向变化的, 不是单调递增:
rate 是 int256 (有符号), 所以:
多头多 → premium > 0 → rate > 0 → 累积值上升
空头多 → premium < 0 → rate < 0 → 累积值下降
1 2 3 4 5 6 t=0 : cumulative = 0 t=100 : rate=+0.001 % → cumulative = 0 + = +0.1 % ↑ t=300 : rate=-0.002 % → cumulative = 0.1 % + = -0.3 % ↓ t=500 : rate=+0.001 % → cumulative = -0.3 % + = -0.1 % ↑
为什么不会跑飞: 负反馈机制:
1 2 3 4 5 累积值持续上涨 → 做多成本越来越高 → 多头平仓 → premium 下降 → rate 转负 → 累积值回落 累积值持续下跌 → 做空成本越来越高 → 空头平仓 → premium 上升 → rate 转正 → 累积值回升
funding rate 本质上是一根弹簧: 价格偏离越大, 回拉力越强. 在一个活跃市场里, 累积值会围绕某个区间波动, 自动趋于平衡.
8.3 Go: Funding Rate 计算 上面 Solidity 代码中的 cumulativeFundingRate 和 entryFundingRate 是链上合约的 storage 变量, 需要通过 RPC 调用合约的 view 函数读取. 完整的链上读取示例见 P08 (perp-data) .
这里展示拿到数据后的本地计算逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 package mainimport ( "fmt" "github.com/shopspring/decimal" )func CalcPendingFunding ( positionSize decimal.Decimal, // 仓位大小: 正=多头, 负=空头 entryFundingRate decimal.Decimal, // 开仓时记录的全局累积费率 currentCumulativeRate decimal.Decimal, // 当前全局累积费率 ) decimal.Decimal { delta := currentCumulativeRate.Sub(entryFundingRate) return positionSize.Mul(delta) }func AnnualizedRate (ratePerPeriod decimal.Decimal, periodsPerDay int ) decimal.Decimal { return ratePerPeriod. Mul(decimal.NewFromInt(int64 (periodsPerDay))). Mul(decimal.NewFromInt(365 )). Mul(decimal.NewFromInt(100 )) }func main () { rate8h := decimal.NewFromFloat(0.0001 ) fmt.Printf("CEX 8h rate: %s%%\n" , rate8h.Mul(decimal.NewFromInt(100 )).StringFixed(4 )) fmt.Printf("Annualized: %s%%\n" , AnnualizedRate(rate8h, 3 ).StringFixed(2 )) hlRate := decimal.RequireFromString("-0.0000177249" ) fmt.Printf("\nHL 1h rate: %s%%\n" , hlRate.Mul(decimal.NewFromInt(100 )).StringFixed(6 )) fmt.Printf("Annualized: %s%%\n" , AnnualizedRate(hlRate, 24 ).StringFixed(2 )) dydxRate := decimal.RequireFromString("-0.000004" ) fmt.Printf("\ndYdX 1h rate: %s%%\n" , dydxRate.Mul(decimal.NewFromInt(100 )).StringFixed(6 )) fmt.Printf("Annualized: %s%%\n" , AnnualizedRate(dydxRate, 24 ).StringFixed(2 )) size := decimal.NewFromInt(10 ) entry := decimal.RequireFromString("0.005" ) current := decimal.RequireFromString("0.008" ) pending := CalcPendingFunding(size, entry, current) fmt.Printf("\nPending funding: %s (正=需支付)\n" , pending.StringFixed(4 )) }
九、小结
概念
一句话
永续合约
无到期日的衍生品, 靠 funding rate 锚定现货
Index Price
多交易所加权均价, 代表 “真实价格”
Mark Price
协议内部参考价, 用于清算和 PnL, 抗操纵
Funding Rate
多空互付的定期费率, rate > 0 多头付空头, 是自动平衡弹簧
PnL
价差盈亏 + funding 收支 - 手续费
Open Interest
未平仓合约总量, 多头 OI = 空头 OI (零和)
三种定价模型
Oracle 型 (GMX), 订单簿型 (dYdX), vAMM 型 (Perp)
9.1 下一步
十、参考