halo 的技术博客

返回

「我不在乎它跌多少,只要它有一天能涨十倍就行。」

这句话几乎概括了散户对左尾彩票的全部执念:宁可承受巨大的下行可能,也要买一张小概率、大赔付的「中奖券」。而市场最冷酷的地方在于——正因为有人愿意为这张券付溢价,这券本身就成了被收割的对象

偏度偏好因子(skewness preference factor)研究的就是这件事:用「预期偏度」把股票的彩票属性量化出来,做空高偏度组、做多低偏度组,收割散户为左尾付的溢价

结论先放这(基于下文自洽合成回测):按形成期偏度 iskew 五分位排序,最低偏度组未来一月平均赚 +0.39%,最高偏度组亏 −0.28%,多空组合月均 +0.64%、年化约 7.8%、夏普 1.7、最大回撤 −8.6%。信号方向与文献一致——偏度越高,未来越亏。但落到自己账户上,它要过的陷阱比 MAX、低波那些因子都更刁钻(文末单列五项)。

按偏度(iskew)五分位:越高偏度组合未来收益越低

一、预期偏度:把「像不像彩票」变成一个数字#

彩票的本质是负偏度 + 厚左尾:平时小亏、偶尔巨亏,但散户记住的是「万一它涨十倍」。对应到股价上,就是收益分布的右偏(正偏度)——过去出现过一根特别夸张的上涨大阳线,让人觉得「巨奖可期」。

Bali、Cakici 与 Whitelaw(2011)的 MAX 因子(过去一月最大单日收益)抓住的是这根「最刺激的那根阳线」;而偏度偏好研究用的是更直接的指标——偏度(skewness)本身,并且强调要区分两种偏度:

  1. 已实现偏度(realized skewness):用个股历史日收益直接算三阶标准矩。 iskewi=1Tt(ri,trˉi)3(1Tt(ri,trˉi)2)3/2\text{iskew}_i=\frac{\frac{1}{T}\sum_{t}(r_{i,t}-\bar r_i)^3}{\left(\frac{1}{T}\sum_t(r_{i,t}-\bar r_i)^2\right)^{3/2}}

  2. 预期偏度(expected skewness / coskewness):Boyer、Mitton 与 Vorkink(2010)指出,散户买的不是「过去偏度」,而是「预期未来偏度」——他们用个股收益与市场收益的**协偏度(coskewness)**近似「这只票在崩盘时会不会更惨」,用期权隐含分布或横截面建模估计的偏度,比单纯历史偏度更能捕捉彩票需求。

本文合成数据里,iskew 用形成期 60 个交易日的日收益算三阶矩,未来收益则由个股真实的「彩票倾向」gamma 驱动——偏度越高 → 未来越亏,复刻偏度偏好异象。

二、为什么高偏度反而亏:一条很短但很硬的逻辑链#

  1. 散户对「博巨奖」有超额需求,愿意为右偏、带巨阳线的股票支付溢价
  2. 溢价推高了当前价格,等于提前透支了未来的收益(就像一张被炒高的彩票,期望回报反而为负);
  3. 当炒作退潮、价格向价值回归,高偏度股票就系统性跑输

它和动量相反:动量是「涨了还会涨」,偏度异象是「涨得太刺激反而要跌」——因为驱动它的是噪声交易者的情绪,不是基本面。Boyer-Mitton-Vorkink 还发现,这种效应在散户情绪高涨时最强:大家都想买彩票时,彩票最贵,未来回归也最狠。

偏度越高 → 未来收益越低:截面分布右偏厚尾 + 偏度-收益负斜率

左图是截面 iskew 的分布:右偏、厚尾——大多数股票一个月的偏度接近 0,少数带着一根巨阳线被顶到 +0.3 以上,正是这些「尾部」构成了彩票股。右图把偏度对未来收益做散点回归,斜率为负(本模拟约 −0.11%/单位偏度),这就是因子能盈利的统计基础。

三、因子构造:形成期 / 持有期严格分离#

构造偏度偏好因子的流程只有三步,但每一步都有一个陷阱等着你:

  • Step 1 计算 iskew:用形成期(过去)的收益算偏度,绝不能用含未来的窗口
  • Step 2 截面排序:每月末按 iskew 五分位(或十分位);
  • Step 3 多空组合:多最低 20%(低偏度)、空最高 20%(高偏度),持有 1 个月,月末再平衡。

注意「多低偏度 / 空高偏度」是反直觉的——大多数人以为「偏度高 = 涨得猛 = 该买」,但因子赚的恰恰是「高偏度被高估、未来回归」的钱。

跑出来:多空月均 +0.64%、年化 7.8%、夏普 1.7、最大回撤 −8.6%、t 值约 14。t 值远超 2,说明这个横截面排序的统计显著性很强——前提是数据是真的、陷阱都避开了。

多低偏度 / 空高偏度 多空组合净值曲线

四、配图解读:四张图各说明什么#

图一(五分位):把全市场按 iskew 五等分,未来收益从最低组的正值一路滑到最高组的负值(+0.39% → −0.28%)。这条下滑曲线本身就是异象存在的证据:它和宏观、行业无关,纯粹由「过去涨得有多刺激(偏度)」驱动。

图二(分布+散点):左图显示 iskew 在截面里右偏、厚尾——少数彩票股带着 +0.3 以上的偏度;右图证明偏度对未来收益是负预测,斜率为负。

图三(多空净值):把「多低偏度 / 空高偏度」做成每月再平衡组合,净值稳定向上。注意这是横截面排序收益,和个股绝对涨跌无关——它测的是「偏度偏好」本身的定价错误。幅度(年化 ~7.8%)是合成数据量级,真实美股样本里多空通常更小但同样显著。

图四(回撤):最该警惕的一张。多空净值不是一路向上——在散户情绪狂热峰期,高偏度彩票股被继续爆买,做空端被挤、多空组合出现连续回撤(本模拟最大 −8.6%)。因子在「大家最想买彩票」的时候最难受,这是偏度因子特有的 regime 风险。

多空组合回撤:散户狂热峰期做空端被挤,最大回撤 −8.6%

五、真实陷阱:比想象中更刁钻的五项#

陷阱一:前视偏差(最容易犯)。 iskew 必须用形成期(过去)收益算,未来收益是另一个独立窗口(之后)的。绝不能用「包含未来」的窗口算偏度再拿同一窗口收益检验——那等于用答案算答案,会造出虚假的完美相关性。本文 simulate_panel 里 iskew 与 future 来自同一批 gamma 但严格分属形成期与持有期,正是这个纪律。

陷阱二:幸存者 / 退市偏差。 彩票股多是小盘、高波动、甚至濒临退市的票。回测如果只在「活到今天」的股票里算,会自动剔除已经跌没退市的极端高偏度股,系统性低估亏损。真实结论只会比回测更糟。要用「point-in-time」全样本(含退市),或至少做退市调整。

陷阱三:微盘股流动性。 高偏度集中在微盘,买卖冲击成本极高。回测用收盘价算的 +0.64%/月,实盘可能因根本买不进/卖不出而大幅缩水,甚至方向相反。实务上要对「可交易市值」设下限,并用实际买卖价差+冲击成本重算多空。

陷阱四:偏度估计噪声。 用 60 天日收益算偏度,三阶矩本身方差极大;单个股票的 iskew 噪声很重,排序会大量「排错队」。本文多空仍显著,是因为用 500 只股票横截面排序、误差被分散;但单标的或短窗口估计的偏度几乎不可用。真实研究里要对偏度做横截面标准化、或拉长窗口、或用期权隐含偏度(噪声更小但需期权数据)。

陷阱五:散户泡沫挤兑(regime 风险)。 这是偏度因子独有的陷阱。偏度偏好在散户情绪低迷时最强(彩票打折),但在情绪狂热峰期(牛市末、题材炒作),高偏度彩票股被继续爆买,做空端被挤、多空组合逆风回撤(见图四)。不能假设因子常年有效——它和情绪周期负相关,需配情绪指标做择时或风控。

(补充两项常被忽略的:市值/行业暴露——高偏度天然集中在小盘,不做中性化你的因子其实是在做多大盘;卖空约束——A 股空高偏度组几乎无法直接做,实务上多用「只做多低偏度、回避高偏度」的多头表达,alpha 会被摩擦吃掉一块。)

六、与 MAX、低波的关系:它到底是不是又一个马甲#

偏度偏好因子常被质疑是 MAX 因子或低波动因子的马甲。实证上它们相关但独立:

  • MAX:都捕捉彩票性,但偏度用的是整个收益分布的三阶矩,MAX 只看单日极值;两者相关系数中等,不是完全重叠。
  • 低波动 / 特质波动率:高偏度股往往高波动,但偏度收益在控制波动率后仍有增量(Boyer-Mitton-Vorkink 的 coskewness 就是在控制市场/规模/账面市值比/波动后的残差偏度)。

真实落地时必须对规模、行业、波动率做横截面中性化(对哑变量回归取残差)后再排序,确认偏度 alpha 是独立的,否则你只是在重复一个已知因子。

七、诚实结论#

偏度偏好因子的逻辑干净到刺眼:散户愿意为左尾彩票付溢价 → 高偏度股票被高估 → 未来回归 → 做空高偏度、做多低偏度即可收割。它是少数在多个市场、多个时期被反复证实的横截面异象,模拟里月均 +0.64%、年化约 7.8%、夏普 1.7。

但落到自己账户上,先过了前视、幸存者、微盘流动性、偏度估计噪声、散户泡沫挤兑这五关——尤其是第五关,因子在「大家最想买彩票」的时候最难受。你回测出的「稳定 alpha」,很可能只是另一个被你自己买贵的彩票。

注:全文数据为自洽合成(每只股票带偶发巨阳线的彩票跳涨,未来收益随偏度单调下降,并在情绪峰期反转),仅用于演示因子构造与检验方法。真实复现请替换为实际日收益,并对前视、退市、流动性、偏度噪声与情绪 regime 逐一做稳健性检验。

偏度偏好因子:散户为何为左尾买单、机构如何收割
https://blog.halo26812.eu.org/blog/skewness-preference-factor
Author halo
Published at 2026年7月15日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨