halo 的技术博客

返回

如果有人告诉你「波动越大的股票,长期收益越低」,你会觉得他在反常识——毕竟资本资产定价模型(CAPM)的核心就是「高风险高收益」。但金融学里有一条被反复验证的异象(anomaly)特质波动率(Idiosyncratic Volatility, IVOL)越高的股票,长期收益反而越低。Ang et al. (2006, 2009) 用几十个市场证明它存在,而它几十年不被「套利消灭」的原因,恰恰指向一个更深的命题——套利限制(Limits to Arbitrage)

本文从零估计 IVOL、验证异象、做多空因子,并诚实检验它到底是真 alpha 还是被规模/流动性伪装的。

数据声明:全文为自洽合成——每只股票有不同日度特质波动 σᵢ,并主动注入「低 σ → 高漂移」的低波动溢价(μᵢ = 0.0007 − 0.035·σᵢ)。目的是把 IVOL 异象的「机制与检验流程」讲清楚、跑通代码。所有量级均为合成校准,真实市场里会被摩擦、做空约束、幸存者偏差大幅改写——重点看方法,不抄量级。

一、什么是特质波动率:市场模型残差的波动#

特质波动 = 股票收益中不能被市场解释的那部分的波动。用单因子市场模型回归:

ri,t=αi+βirm,t+εi,t,IVOLi=std(εi,t)252r_{i,t} = \alpha_i + \beta_i r_{m,t} + \varepsilon_{i,t},\qquad \text{IVOL}_i = \text{std}(\varepsilon_{i,t})\cdot\sqrt{252}

ε\varepsilon 就是特质冲击,它的标准差年化后就是 IVOL。注意:IVOL 衡量的是公司特有风险,按经典理论它该被分散掉、不该有定价——所以「高 IVOL 反而低收益」才叫异象。

合成校准下 IVOL 落在 12.8% ~ 48.8% 区间,覆盖从「稳如老狗」到「上蹿下跳」的全谱。

二、五分位检验:异象到底存不存在#

把 60 只按 IVOL 五分位分层,看年化收益是否单调:

order = np.argsort(ivol)
quintile_ann = []
for q in range(5):
    idx = order[q*12:(q+1)*12]
    r = stock_ret[:, idx].mean(axis=1)
    quintile_ann.append((np.prod(1+r)**(252/T) - 1) * 100)
# 合成校准(年化 %):Q1 最低 6.8 | Q2 4.5 | Q3 2.0 | Q4 -2.0 | Q5 最高 -2.0
python

特质波动率五分位:低 IVOL 跑赢高 IVOL

最低 IVOL 分位年化 +6.8%,最高分位 −2.0%,严格单调递减——这正是异象的签名:高风险(特质)没有高收益,反而是低收益。它直接打脸「风险越高补偿越多」的朴素直觉。

三、做多空因子 + 套利限制维度#

多低 IVOL、空高 IVOL:

long_idx  = order[:12]
short_idx = order[-12:]
ls_ret = stock_ret[:, long_idx].mean(axis=1) - stock_ret[:, short_idx].mean(axis=1)
ls_cum = np.cumprod(1 + ls_ret)
python

IVOL 多空因子净值:低波动溢价长期稳定,但波动并不小

合成校准下多空因子终值 1.81(约 7.7%/年)。但请注意:曲线并不平顺——低波动溢价是「长期有效、短期颠簸」的,不是印钞机。

关键理论问题:如果低 IVOL 真的被低估、高 IVOL 真的被高估,理性套利者早该卖空高 IVOL 股票、买入低 IVOL 股票把它抹平。为什么几十年不消失?答案在 Miller (1977) 的套利限制

高 IVOL 股票往往也是小盘、热门、被散户偏好的「彩票股」。悲观投资者想做空却做不到(融券不可得 / 费率极高 / 被逼空)。于是悲观预期无法进入价格,股价被乐观者单方面推高、被高估——高 IVOL 因此绑定了「被高估 + 未来低收益」。

套利限制:高 IVOL 股票往往也是最难的做空标的

红圈就是「高 IVOL + 高做空成本」的双重地狱:既是最该做空的(异象说它会跌),又是最难做空的(套利限制锁死)。这恰恰解释了异象的持续性

四、规模中性化:它是真 alpha 还是风格伪装?#

低 IVOL 股票常常也是大盘股,高 IVOL 常常是小盘股。那这个溢价,会不会只是「规模因子」的伪装?用回归残差正交化检验:

size_order = np.argsort(size)
size_long  = size_order[-12:]; size_short = size_order[:12]
size_ret   = stock_ret[:, size_long].mean(axis=1) - stock_ret[:, size_short].mean(axis=1)
X = np.vstack([size_ret, np.ones_like(size_ret)]).T
coef = np.linalg.lstsq(X, ls_ret, rcond=None)[0]
neutral_ls = ls_ret - X @ coef          # 剔除规模暴露后的残差因子
neutral_cum = np.cumprod(1 + neutral_ls)
python

规模中性化:剔除规模因子后 IVOL alpha 大部分仍在?

在我们的合成设定里,规模中性化后因子从 7.7%/年 缩水到 −0.9%/年——大部分溢价消失了。这未必是真实市场的普遍结论(真实文献里低波动溢价大多能部分 survive 中性化),但它演示了正确的检验流程:任何因子在宣称「真 alpha」前,都要先过一遍风格正交化。残差是否还显著,才是试金石。若你自己的回测里中性化后因子归零,那它大概率只是已知风格的线性组合。

五、六类真实陷阱(必须诚实拆穿)#

  1. 合成自证:低波动溢价是我写进数据生成器的(μ 与 σ 负相关)。真实市场里它存在但噪声大得多,绝不能直接把 7.7%/年当真。
  2. 估计窗口敏感:IVOL 用全样本残差标准差估计,隐含「波动平稳」假设。真实波动是聚集且时变的(GARCH 特性),用滚动窗口 vs 全样本、用日频 vs 周频,分出来的高/低 IVOL 股票会漂移。
  3. 做空不可得(核心):多空因子的空头腿正好是最难借券的高 IVOL 小票。现实里你建不上这个空仓,只能做「多低 IVOL」单边,收益与风险特征完全不同。
  4. 规模/流动性混淆:高 IVOL 与小规模、低流动性、彩票偏好高度纠缠。溢价可能只是对这些真实风险的补偿,而非独立异象——本文规模中性化后缩水正是这一点的缩影。
  5. 样本内过拟合:我先按 IVOL 排序、再展示「漂亮单调」,这是事后数据挖掘的典型姿势。真实研究要用 Fama-MacBeth 横截面回归 + 样本外 / 多市场复制。
  6. 波动聚集与状态依赖:IVOL 静态排序忽略了它的时变与反转。低波动溢价在危机期最猛(防御属性),在狂热牛市最弱;用固定持仓无视 regime,会在错的时候暴露错的风险。

六、落地建议#

  • 把 IVOL 当风控筛子优先于当 alpha:高 IVOL 股票 = 高特质风险 + 常被高估 + 难做空,单边多头组合里应主动低配。
  • 真要做因子,先做中性化:对你每一个「新发现」的排序因子,先对市值、行业、动量、估值做正交化,看残差还剩多少——这是区分「真信号」和「已知风格马甲」的最低门槛。
  • 理解它为何不消失:套利限制提醒你,市场无效≠你能轻松赚钱。越是「明显该被套利消灭」的异象,越可能卡在「想做空做不了」的 liquidity wall 后面。

特质波动率异象最迷人的地方,不是「低波动跑赢」这个结论,而是它把两件事缝在了一起:资产定价的失效套利者手脚被绑。看懂后者,你才真正理解为什么市场既是有效的、又处处是裂缝。

特质波动率异象与套利限制:为什么高风险的股票反而跑输
https://blog.halo26812.eu.org/blog/idiosyncratic-volatility-anomaly
Author halo
Published at 2026年7月20日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨