第 5 章 · 04 风险溢价:低波、波动率风险溢价、隔夜异常、残差动量 本节摘要:本节精读 quant-wiki docs/repo/static/strategies 下四个「风险溢价」族系的脚本: (低波动因子,3 年周收益波动排序,多最低四分位)、 (波动率风险溢价,卖 ATM 跨式 + 买 OTM 认沽作保险 + 持有指数)、 (隔夜异常,SPY 收盘前买、次日开盘卖,用 SPY/VIX/BMS 三信号触发)、 (残差动量,先把收益对 Fama-French 三因子回归取残差,再做动量)。四者分别捕捉「低波异常」「方差风险溢价」「日内 vs 隔夜情绪」「剥离风格后的纯动量」,是风险溢价研究的四个经典切入点。
本节摘要:本节精读 quant-wiki docs/repo/static/strategies 下四个「风险溢价」族系的脚本:
low-volatility-factor-effect-in-stocks.py(低波动因子,3 年周收益波动排序,多最低四分位)、volatility-risk-premium-effect.py(波动率风险溢价,卖 ATM 跨式 + 买 OTM 认沽作保险 + 持有指数)、market-sentiment-and-an-overnight-anomaly.py(隔夜异常,SPY 收盘前买、次日开盘卖,用 SPY/VIX/BMS 三信号触发)、residual-momentum-factor.py(残差动量,先把收益对 Fama-French 三因子回归取残差,再做动量)。四者分别捕捉「低波异常」「方差风险溢价」「日内 vs 隔夜情绪」「剥离风格后的纯动量」,是风险溢价研究的四个经典切入点。本节讲清每个脚本的信号构造与关键工程,重点是波动率风险溢价的期权组合与残差动量的回归剥离。
内容来源:quant-wiki docs/repo/static/strategies,真实 Python 策略脚本,知识结构化整理。
⚠️ 学习提示:本节涉及期权与衍生品,回测结果对假设(波动率模型、流动性、借券成本)极敏感。波动率风险溢价在历史上长期盈利,但 1987 年「黑色星期一」、2018 年「波动率末日」等极端事件会一次亏掉数年利润,属典型的「捡硬币」策略。
阅读完本节,你应当能够:
风险溢价是「承担某种风险所换来的长期正收益」。本节四个脚本捕捉四种不同的风险溢价:
| 脚本 | 溢价来源 | 信号 | 工具 |
|---|---|---|---|
| 低波动因子 | 低波异常(行为偏差) | 3 年周收益波动 | 股票多腿 |
| 波动率风险溢价 | 方差供给 vs 需求 | 隐含波动 - 实际波动 | 期权 + 指数 |
| 隔夜异常 | 日内/隔夜情绪差 | 收盘买、开盘卖 | ETF 日内 |
| 残差动量 | 剥离风格后的纯动量 | FF 三因子回归残差 | 股票多空 |
💡 心法:这四种溢价的共同点是「承担他人不愿承担的风险」。低波股承担「不够性感」的风险,VRP 承担「崩盘尾部」风险,隔夜承担「隔夜跳空」风险,残差承担「剥离常见风格后剩余的不确定性」。
低波动因子捕捉「低波动异常」(low-volatility anomaly):理论上高风险应有高收益,但实证上低波动股票的风险调整后收益反而更高。这一现象在全球多个市场长期存在,行为金融解释是散户的「彩票偏好」推高了高波动股票的价格。
脚本用过去 3 年(约 252 日)的周收益波动率作为排序键:
def volatility(self) -> float: closes = [x for x in self.price] # 把日线按每 5 天分组算周收益 separete_weeks = [closes[x:x+5] for x in range(0, len(closes), 5)] weekly_returns = [(x[0] - x[-1]) / x[-1] for x in separete_weeks] return np.std(weekly_returns)
这里有个工程细节:脚本不是用 21 日日波动,而是显式地把日线按 5 天切片算周收益,再取标准差。这种「周波动」比日波动更平滑,降低了微观结构噪声。
| 要素 | 实现 |
|---|---|
| 宇宙 | 前 3000 大市值股票 |
| 信号 | 3 年周收益波动率 |
| 分组 | 4 分位(quartile) |
| 多空 | 只多最低波动四分位(纯多头版) |
| 加权 | 等权 |
| 再平衡 | 月末 |
⚠️ 注意:这是「纯多头版」(long-only)——只买最低波动的股票,不做空。与 BAB 的多空对冲不同,低波纯多头组合仍承担市场 beta,牛市跑赢、熊市跑输,要按风险调整收益评估而非绝对收益。
波动率风险溢价(volatility risk premium,VRP)来自期权市场的「隐含波动率」长期高于「实际波动率」——期权买方为期权「保险属性」付溢价,卖方通过卖期权赚取这个价差。脚本的策略是卖 ATM 跨式(straddle,同时卖 call 和 put),收权利金。
裸卖跨式风险极大(崩盘时无限亏损),所以脚本用三件套对冲:
# 1. 卖 ATM 跨式,收权利金 self.Sell(atm_call[0].Symbol, options_q) self.Sell(atm_put[0].Symbol, options_q) # 2. 买 15% OTM 认沽作崩盘保险 self.Buy(otm_put[0].Symbol, options_q) # 3. 剩余资金买入指数,博上行 self.SetHoldings(self.symbol, 1)
逻辑分解:(1) 卖跨式收权利金——只要指数在到期日落在 strike 附近,权利金就是纯利润;(2) 买深度 OTM 认沽——成本较低但崩盘时能爆赚,等于给组合买「黑天鹅保险」;(3) 持有指数——剩余资金博取市场上行收益。
| 参数 | 取值 | 作用 |
|---|---|---|
| 到期日 | 距今约 30 天 | 月度滚动 |
| OTM 认沽行权价 | 标的价的 85% | 15% 跌幅才触发保护 |
| 杠杆 | 5 倍 | 期权保证金杠杆 |
| 再平衡 | 月度 | 到期前换月 |
⚠️ 致命陷阱:VRP 是典型的「胜率高、赔率低」策略——多数月份小赚,极少数月份大亏。回测时如果没遇到崩盘月,会得到「漂亮到不真实」的净值曲线。务必用足够长的历史(含 2008、2020)回测,并做最坏情景压力测试。买 OTM 认沽的成本会持续侵蚀收益,保险买少了不够保护,买多了利润全无。
研究发现美股的收益大部分来自隔夜(开盘跳空),日内反而接近零甚至为负。market-sentiment-and-an-overnight-anomaly.py 利用这一点:在收盘前买入 SPY,次日开盘卖出,纯粹吃隔夜溢价。
不是每天都做,而是用三个信号过滤:
# 信号1: SPY 价格上穿其 20 日均线 # 信号2: VIX 下穿其 20 日均线(恐慌下降) # 信号3: BMS(Brain Market Sentiment) 上穿其 20 日均线 # 三信号满足的数量决定仓位权重 for symbol in [self.spy_symbol, self.vix_symbol, self.bms_symbol]: if rolling_window.IsReady and self.GetSignal(price, rolling_window, signal_above_sma): weight += 1 / 3
每个信号满足则权重加 1/3,三信号全满足则满仓。然后:
# 收盘前下单买入 self.MarketOnCloseOrder(self.spy_symbol, q) # 次日开盘下单卖出 self.MarketOnOpenOrder(self.spy_symbol, -q)
MarketOnCloseOrder + MarketOnOpenOrder 这一对手法精确实现了「隔夜持仓」。
💡 关键观察:脚本强调「建议作为叠加层(overlay)使用,而非独立策略」。隔夜异常的绝对收益不大,但与日内策略相关性低,作为叠加层能提升组合夏普。这一提示对量化组合设计有普适意义——许多「异象」单独跑收益薄,叠加起来才显价值。
传统动量(12-1 月收益)混入了规模、价值等风格暴露:一只小盘价值股的上涨可能不是「动量」,而是「规模/价值因子」起作用。残差动量把收益对 Fama-French 三因子回归,取 alpha(残差)做动量信号,理论上更「纯」。
脚本每月对每只股票跑回归:
# 三因子: 市场、规模(SMB)、价值(HML) x = [ [x for x in market_factor], [x for x in self.size_factor_vector], [x for x in self.value_factor_vector] ] regression_model = self.MultipleLinearRegression(x, monthly_returns) alpha = regression_model.params[0] # 回归截距即残差 alpha
然后对过去 12 个月的残差 alpha 做标准化:
standardized_residual_momentum[symbol] = sum(residual_returns) / np.std(residual_returns)
最后按标准化残差动量排序,多最高 decile / 空最低 decile。
脚本本身还要先构造 SMB 与 HML 因子向量(用市值分位与 PB 分位),这是一个「迷你版 Fama-French」:
⚠️ 工程量:残差动量脚本是本章最复杂的——既要维护个股月度价格,又要实时计算 SMB/HML 因子,还要跑 36 个月回归。计算量大约是普通动量脚本的 5-10 倍。复现时建议用 statsmodels 的 OLS,并做向量化批量回归。
| 维度 | 低波动 | VRP | 隔夜异常 | 残差动量 |
|---|---|---|---|---|
| 信号 | 周波动排序 | 隐含-实际波动 | 隔夜 vs 日内 | 三因子残差 |
| 多空 | 纯多头 | 期权卖方 | 纯多头 | 多空对冲 |
| 工具 | 股票 | 期权+指数 | ETF 日内 | 股票+因子 |
| 主要风险 | 市场 beta | 崩盘尾部 | 隔夜跳空 | 因子模型误设 |
| 复杂度 | 低 | 高 | 中 | 很高 |
💡 共通心法:这四个策略都「赌某种结构性溢价」,而非某个特定方向。它们单独跑可能收益薄、波动大,但因为彼此相关性低,组合起来能显著提升整体夏普。这正是「多策略组合」思想的基础。
下一章,我们离开经典策略,转向 AI 加量化前沿:LLM 多智能体、GPT 选股、强化学习,以及前沿论文清单。