Signal 13 — VIX Term Structure (Carry Vol)
Cảnh báo rủi ro
Short volatility là chiến lược negative-skew, fat-tail short. Như XIV-Velocity Shares blowup 2018-02-05 (mất 96% trong 1 ngày), short vol vô hạn lỗ trong các "vol-mageddon" events. Phải hedge tail bằng OTM puts hoặc dùng position-size rất nhỏ. Không phải retail-grade signal nếu không có risk management chặt.
| Thuộc tính | Giá trị |
|---|---|
| Phân loại | Volatility Carry / Cross-Asset |
| Khung thời gian | Daily |
| Paper gốc | Carr-Wu (2009) — Variance Risk Premiums |
| Loại dữ liệu | VIX futures (VX1, VX2, VX3, VX4) |
| Hướng giao dịch | Short vol khi contango; flat khi backward |
| Capacity | Cao (VIX futures liquid) |
Ý tưởng (Concept)
VIX là chỉ số biến động ngụ ý 30 ngày trên SPX. VIX futures (VX1=front, VX2=second-month, ...) thường ở contango (~80% time): VX2 > VX1 > VIX spot. Lý do:
- Insurance premium: investors over-pay để hedge tail → implied > realized.
- Mean reversion: vol thấp hôm nay → market expect cao hơn trong tương lai.
Khi short một VIX future trong contango và roll, nó decay xuống VIX spot → bạn nhận roll yield dương (vol carry). Trung bình ~10-20% năm pre-cost, nhưng đôi khi sụp -40% trong 1 tuần khi backward đột ngột.
Khi backwardation (VX1 > VX2): thị trường panic, vol curve invert. Đây là tín hiệu stop short vol, đứng ngoài. Một số strategies long vol khi backward sâu (VRP regime switch).
Công thức (Formula)
Slope chính:
slope_1 = (VX2 - VX1) / VX1 # roll yield front
slope_2 = (VX4 - VX1) / VX1 # longer-term slopeHoặc dùng VVIX-adjusted:
roll_yield = (VX2 - VX1) / VX1 × (30 / days_to_expiry_VX1)Regime classification:
slope_1 > +0.04(deep contango) → SHORT vol, full size.0 < slope_1 < +0.04→ SHORT vol, half size.slope_1 < 0(backward) → FLAT, tránh.slope_1 < -0.05→ optionally LONG vol (mean-revert play).
Cách giao dịch (Entry/Exit Rules)
- Entry SHORT vol:
slope_1 > 4%over 3 consecutive days.- SPX trong daily uptrend (filter: SPX > 100-day MA).
- Sell VX1 hoặc buy SVXY/XIV-equivalent (cẩn thận leverage).
- Exit SHORT vol:
- Khi
slope_1 < 0(backward). - Khi
VIX spot > 22(vol đã pop, decay không còn đủ premium). - Time-based: roll mỗi 21 ngày trước expiry.
- Khi
- Stop loss: -2× daily ATR; mandatory hedge bằng OTM puts SPX (mua puts 5% OTM cho 5% notional).
- Timeframe khuyến nghị: Daily, holding 5-21 days.
Code Python (Python Implementation)
import numpy as np
import pandas as pd
def vix_slope(vx1: pd.Series, vx2: pd.Series) -> pd.Series:
"""Front-end VIX slope, ~roll yield proxy."""
return (vx2 - vx1) / vx1
def vix_regime(slope: pd.Series, vix_spot: pd.Series,
contango_thresh: float = 0.04,
vix_cap: float = 22.0) -> pd.Series:
regime = pd.Series('FLAT', index=slope.index)
contango_strong = (slope > contango_thresh) & (vix_spot < vix_cap)
contango_mild = (slope > 0) & (slope <= contango_thresh) & (vix_spot < vix_cap)
backward = slope < 0
regime[contango_strong] = 'SHORT_VOL_FULL'
regime[contango_mild] = 'SHORT_VOL_HALF'
regime[backward] = 'FLAT' # or LONG_VOL with caution
return regime
def carry_signal_pnl(spx_ret: pd.Series, vix_ret: pd.Series,
regime: pd.Series, hedge_cost: float = 0.0005) -> pd.Series:
"""Short VIX futures returns ≈ -vix_ret. Add daily hedge cost."""
sz = pd.Series(0.0, index=regime.index)
sz[regime == 'SHORT_VOL_FULL'] = 1.0
sz[regime == 'SHORT_VOL_HALF'] = 0.5
return sz.shift(1) * (-vix_ret) - sz.shift(1) * hedge_cost
# Example: pull from CBOE settlement files
# vx1, vx2, vix_spot = load_vix_data()
# slope = vix_slope(vx1, vx2)
# regime = vix_regime(slope, vix_spot)Ưu nhược điểm
Ưu điểm:
- High Sharpe (~1.5-2.0) trong calm regimes.
- Premise vững chắc: variance risk premium (Carr-Wu 2009) là hiện tượng kéo dài 30+ năm.
- Tương quan thấp với equity beta dài hạn (nhưng spike correlation khi crash).
Nhược điểm:
- Tail risk thảm họa: 2018-02-05 XIV mất 96% trong 1 ngày; 2020-03 ETF inverse-vol mất 70%. Kelly fraction ≤ 0.1.
- Crowded trade — performance đã giảm so với pre-2010.
- Phải hedge tail bằng OTM SPX puts, chi phí hedge ăn 30-50% gross premium.
- Không trực tiếp áp dụng VN30F (VN30 chưa có VIX-style index liquid). Có thể dùng làm cross-asset regime filter.