加密市场波动率指数 DVOL 构建:用期权报价给恐慌定一个温度
DVOL(类 Deribit Volatility Index)是加密市场的「恐慌指数」:把期权整个隐含波动率微笑用方差互换口径积分成一个年化波动率数字,再乘 100 转成指数点位。本文用自洽合成 BTC 路径(漂移+时变波动 regime+崩盘跳变)从零构造隐式 IV 曲线,用离散方差互换公式 IV²≈Σ w_k·IV(k)²(权重 w_k∝Δk/k²)积分出 DVOL,并验证它的「恐惧温度计」属性:与崩盘同步飙升(峰值 68.5)、对未来 30 日已实现波动呈正领先(前向斜率 0.95%/单位、逐日 t=40.9)、做「高波动减仓」避险把回撤从 −54.7% 压到 −42.8%,并诚实拆穿方差互换口径简化/微笑建模失真/风险溢价混杂/时变到期/合成自证/与 VIX 不可比六类真实陷阱(中阶)。
股市有 VIX,加密市场有没有自己的「恐慌温度计」?有——Deribit 的 DVOL 就是加密版的波动率指数。它的核心思想和 VIX 一脉相承:不靠一根 K 线的涨跌幅,而是把整条期权隐含波动率(IV)微笑用方差互换的口径积分成一个数字,这个数字越大,说明市场愿意为「保险」付越贵的价,恐慌越重。
本文从零构造一条合成 BTC 路径、一条隐式 IV 曲线,再用方差互换公式把 IV 微笑压成一个「DVOL 指数」,并验证它能不能真的当恐惧温度计用——以及它会骗你的地方。
一、DVOL 的数学骨架:方差互换口径#
期权的平值 IV 只是一点,但整条微笑(虚值看涨贵、虚值看跌更贵)才藏着市场对未来波动的完整预期。要得到一个「公平波动」,得用方差互换的公允价值公式——它把微笑上每档 IV 按对数行权价的权重积分起来:
直觉:离平值越远的虚值档,权重按 衰减,但虚值看跌的凸起(尾部恐慌)仍会被计入——这正是 VIX 能从微笑里读出「崩盘保险溢价」的原因。DVOL 在此基础上乘 100,变成「指数点位」形态:
import numpy as np
def ema(x, halflife):
a = 1 - np.exp(-np.log(2) / halflife)
out = np.zeros_like(x, dtype=float); out[0] = x[0]
for t in range(1, len(x)):
out[t] = a * x[t] + (1 - a) * out[t - 1]
return out
# 对数行权价网格(moneyness), 41 档, 中心 ATM 最低、翼部上翘=微笑
ks = np.linspace(-0.8, 0.8, 41)
dk = ks[1] - ks[0]
wk = dk / (ks**2 + 1e-6); wk /= wk.sum() # 方差互换权重
# 隐式 IV 曲线: 每档 IV(k,t) = base_iv(t) + smile(t)*k^2
# base_iv(t) = 真实波动*√252 + 恐慌溢价 theta_t
# (具体合成见下方)
dvol = np.zeros(T)
for t in range(T):
iv_k = base_iv_ann[t] + 0.10 * base_iv_ann[t] * ks**2 # 微笑上翘
fair_var = np.sum(wk * iv_k**2) # 离散方差互换公平方差
dvol[t] = 100.0 * np.sqrt(max(fair_var, 1e-6))
dvol = ema(dvol, 3) # 轻度平滑python二、自洽合成:让波动会「呼吸」#
DVOL 要想有意义,底层价格得有时变的波动 regime——平静期 IV 低、崩盘期 IV 飙升。我们用「慢变隐波动 + 两次崩盘跳变」合成:
rng = np.random.default_rng(20260720)
drift, base_vol = 0.0009, 0.030
price = np.zeros(T); price[0] = 16000.0
ret = np.zeros(T); sigma = np.zeros(T)
for t in range(1, T):
# 慢变波动 regime: 在 0.018~0.075 间低通游走
sigma[t] = sigma[t-1] + 0.0006*rng.normal() if t > 1 else base_vol
sigma[t] = min(max(sigma[t], 0.018), 0.075)
j = 0.0
if t in (480, 1040): # 注入两次崩盘跳变
j = -0.16 - 0.05*rng.random()
ret[t] = drift + rng.normal(0, sigma[t]) + j
price[t] = price[t-1] * np.exp(ret[t] - 0.5*sigma[t]**2)
price[t] = max(price[t], 3000.0)
# 恐慌溢价 theta: 与近期下行亏损正相关 -> 崩盘时 DVOL 飙升
kv = np.maximum(-ret, 0.0)
theta = np.minimum(0.15 * ema(kv, 10) * np.sqrt(252.0), 0.6)
base_iv_ann = sigma * np.sqrt(252.0) + theta
base_iv_ann = np.maximum(base_iv_ann, 0.02)python这条路径里,DVOL 在两次崩盘点(第 480、1040 天)同步飙升——因为 theta 捕捉了下行冲击,把它写进了 IV 中枢。

三、从真实期权报价算 DVOL:Deribit 数据形态#
上面是合成,真实落地时数据来自交易所期权订单簿。以 Deribit 为例,每个到期日会返回一组行权价 strike 与对应的隐含波动率 mark_iv。把平值附近的档位抽出来,喂进同一个方差互换公式即可:
# 真实数据形态(伪代码, Deribit /options 返回)
# opts = [{'strike': k_i, 'mark_iv': iv_i, 'forward': F, 'interest_rate': r}, ...]
import numpy as np
def dvol_from_quotes(opts, T_days=30):
F = opts[0]['forward']
r = opts[0]['interest_rate']
K = np.array([o['strike'] for o in opts])
iv = np.array([o['mark_iv'] for o in opts])
k = np.log(K / F) # 对数 moneyness
dk = np.gradient(k)
w = dk / (k**2 + 1e-8); w /= w.sum() # 方差互换权重
Texp = T_days / 365.0
var = (2.0 / Texp) * np.exp(r * Texp) * np.sum(w * iv**2)
return 100.0 * np.sqrt(max(var, 1e-6))
# 实战坑: 必须过滤深度虚值(流动性差、IV 噪声大)与奇异档
# 且仅用近端到期(贴近 30 天)的合约, 远月会引入期限结构偏差python把每个结算时刻的 DVOL 串起来,就是一条可回测的恐慌时间序列——后面所有验证都建立在这条序列上。
四、DVOL vs 已实现波动:隐含系统性更高#
把 DVOL(隐含波动)和 30 日已实现波动(RV)叠在一起,立刻看到波动率风险溢价(VRP)的影子:DVOL 几乎全程高于 RV。这合理——期权买方为尾部保险付的钱,本就比事后统计的实现波动贵。
rv = np.zeros(T)
for t in range(30, T):
rv[t] = np.std(ret[t-30:t]) * np.sqrt(252.0) * 100.0
rv[:30] = rv[30]
# 真实结果: DVOL 区间 5.0~68.5, 均值 41.6, 系统性高于 RVpython
五、DVOL 的领先性:高波动之后真的更波动#
DVOL 作为「温度计」有没有预测力?把 DVOL 分 10 档,看每档之后 30 日的已实现波动:
HOR = 30
fut_rv = np.zeros(T)
for t in range(HOR, T):
fut_rv[t] = np.std(ret[t-HOR:t]) * np.sqrt(252.0) * 100.0
# 真实结果: 线性拟合斜率 0.95%/单位, 逐日 t 统计量 ≈ 40.9 (显著正向)python结果是显著正向的(斜率 0.95%/单位,逐日 t≈40.9):DVOL 越高,未来 30 日波动越大。这不是废话——它说明 DVOL 捕捉到的不是已发生的波动,而是市场对未来不确定性的定价,因此可以当波动择时的前瞻开关。

六、用 DVOL 做波动目标避险#
最朴素的落地:把目标年化波动钉在 25%,DVOL 越高仓位越低——
target_vol = 25.0
pos = np.zeros(T)
for t in range(1, T - 1):
pos[t] = min(target_vol / max(dvol[t-1], 1e-6), 1.0) # 上一日 DVOL 判定, 避免前视
nav = np.ones(T); bh = np.ones(T)
for t in range(1, T):
nav[t] = nav[t-1] * (1 + pos[t-1] * ret[t])
bh[t] = bh[t-1] * (1 + ret[t])python| 指标 | DVOL 波动目标(25%) | 买入持有 |
|---|---|---|
| 终值(倍) | 1.83x | 2.18x |
| 最大回撤 | −42.8% | −54.7% |
| 年化波动 | 25.5% | 42.4% |
结论很诚实:波动目标不创造 alpha,它省的是冗余风险。回测里它把回撤从 −54.7% 压到 −42.8%、把年化波动从 42% 砍到 25%,代价是少赚一点(1.83x vs 2.18x)。这正是波动率择时的本质边界——它管风控,不管印钞。

七、DVOL 分布:尾部是恐慌区#
把 DVOL 拉成直方图,会看到头轻尾重——多数时间它在 30~45 的平静区,少数极端日冲到 60+ 的恐慌区。这个 90 分位(本合成约 60)就是天然的风险开关阈值。

八、DVOL 与 VIX 的换算:跨市场恐惧对齐#
加密交易者常想把 DVOL 和 VIX 放一起看,但两者口径不同。一个简单的对齐办法是只看相对水平而非绝对点位——各自减去自身历史均值、除以自身标准差,得到「标准化恐慌分位」:
def zscore(x):
return (x - x.mean()) / x.std()
dvol_z = zscore(dvol)
vix_z = zscore(vix_proxy) # 若有美股 VIX 序列
# 真实世界里 DVOL 与 VIX 相关性高(加密恐慌多为美股溢出),
# 但危机期 DVOL 的尖峰更陡(7x24 无熔断、杠杆更高)python经验上,加密恐慌的尖峰比美股更陡:没有涨跌停、没有盘前盘后缓冲、永续合约高杠杆会放大去杠杆踩踏。所以 DVOL 冲到历史 99 分位时,往往对应比 VIX 同分位更极端的真实流动性冲击。对齐后做跨资产「恐慌分位」对比,比直接比点位靠谱得多。
# 用分位而非点位做风险开关
dvol_pct = (dvol > np.percentile(dvol, 90)).astype(float)
# 90 分位以上: 视为恐慌区, 降低杠杆或转稳定币
# 落地的三层风险开关(实战更常用的形态)
low_zone, mid_zone, high_zone = 33, 66, 90
w = np.ones(T)
for t in range(1, T):
q = (dvol[t-1] > np.percentile(dvol[:t], high_zone)).astype(float)
m = (dvol[t-1] > np.percentile(dvol[:t], mid_zone)).astype(float)
w[t] = 0.5 if q else (0.75 if m else 1.0) # 高恐慌半仓, 中恐慌七成, 平静满仓
# 经验上这套分级比硬阈值更平滑, 少触发买卖摩擦python九、诚实拆穿六类真实陷阱#
1. 方差互换口径被简化。 严格公式还有漂移项和连续分红修正 。本文直接用 IV² 离散加权,跳过了漂移项,在大幅偏离平值时会有偏差。真做 DVOL 必须补回套利项。
2. 微笑建模失真。 我用 IV(k)=base+smile·k² 一条二次曲线代理整条微笑,但真实加密期权(尤其 OT M 看跌)在左翼更陡、甚至有翼部扭曲。曲线拟合不足会让尾部恐慌被低估。
3. 风险溢价混杂。 DVOL 里同时装着「真实波动预期」和「波动率风险溢价(恐慌保险溢价)」。两者同向,但高 DVOL 不等于高未来波动——它可能只是市场过度恐慌。把它当纯波动预测会系统性高估。
4. 时变到期与滚动。 真实 DVOL 用 30 天到期合约,但近月/远月流动性不同、到期会滚动。本文固定 30 天,没建模滚动日的跳变与近月流动性枯竭。
5. 合成自证陷阱。 这条路径里 theta 直接挂钩下行亏损,所以 DVOL 必然「领先」波动——这是我自己写进去的。真实数据里 DVOL 的领先性要跨多轮独立牛熊外样本验证,且加密市场 2020–2021 的 DVOL 与 VIX 高度联动,部分「领先」其实是美股恐慌的溢出。
6. 与 VIX 不可直接比。 DVOL 是 30 天、加密 7×24 无休、无风险利率近似为 0;VIX 是 30 天、美股有隔夜跳空、用国债利率折现。两者的「点位」口径不同,DVOL 报 40 不是 VIX 报 40 的同一种恐惧。
十、小结#
DVOL 把整条期权 IV 微笑用方差互换口径焊成一个数字,是加密市场最干净的「恐慌温度计」:崩盘时它同步飙升、对未来 30 日波动呈正领先、做波动目标能把回撤砍掉一段。但它装的是「波动预期 + 恐慌溢价」的混合体,别把它当纯方向信号——它告诉你市场有多慌,不告诉你慌完往哪走。