第 5 章

异象研究

第 1 章的核心公式把收益切成 β 和 α 两块,这一章专门研究 α。挖出一个"α 显著"的组合很容易,难的是它背后有没有站得住的金融学逻辑、在样本外还活不活得下来。本章解剖三个精选异象——预期差、基本面锚定反转、特质性波动率之谜——每个都按同一条流水线走:金融学依据 → 构造方法 → A 股实证。读完你会掌握一套评判"这个异象可不可信"的完整方法。

回顾第 1 章:给定一个多因子定价模型,如果按某个变量构建的组合能获得模型解释不了的超额收益($\alpha$ 显著不为零),它就是一个异象(anomaly)。麻烦在于,"解释不了"这件事太容易被制造出来——人们对真实定价模型的认知有限,拿财务或量价数据反复挖掘,总能挖出一堆样本内 $\alpha$ 显著的指标。这些"异象"大多是过拟合的产物,换个样本就原形毕露(第 6 章会系统讨论)。所以本章的立场是:只研究有扎实金融学依据的异象

从式 (1.3) 的视角看,异象的超额收益是"资产实际预期收益"与"模型认为它应得的收益"之间的偏离。因此,能在样本外持续存活的异象,多数都能从错误定价(mispricing)的角度讲通:市场对某些股票的定价出了错,而纠错的过程就是异象的收益来源。另一个趋势是,新近研究越来越少依赖单一变量,而是用多个变量从多个维度合成综合指标,以更稳定地捕捉错误定价——本章三个异象全部体现了这一点。

误区

"异象显著"是一句没说完的话——显著永远是相对于某个定价模型而言的。本章会反复出现同一个组合"在 Fama–French 三因子下显著、换成更强的四因子模型就不显著"的情形。这不是实证翻车,而是重要信息:它说明该异象的收益能被新加入的因子解释掉。读任何异象研究,第一个要问的问题都是"相对于哪个模型"。

检验异象必须先选定"陪审团",即定价模型。本章的实证使用三个模型:

定价模型包含因子为什么入选
CAPM市场最低门槛的基准:连 CAPM 都解释得掉的东西谈不上异象
Fama–French 三因子(FF3)市场、规模、价值海外学术界和业界最通用的基准模型
Liu–Shi–Lian 四因子(LSL4)市场、规模、价值、盈利第 4.3 节论证过:在 FF3 基础上加入盈利因子后,对 A 股潜在异象的解释力最强

细心的读者会问:为什么不用 Fama–French 五因子?原因有二。其一,第 3.7.3 节的实证显示投资因子在 A 股上并不显著,无法解释预期收益的截面差异;其二,从计量角度看,把一个不相关变量(irrelevant variable)塞进回归,虽然不破坏其他估计量的无偏性,却会推高估计量的方差、恶化检验的功效。留着它有害无益。

实施细节上,原书针对 A 股做了两处本土化:构造因子用季报数据(时效性远高于 Fama and French 1993 针对美股用的年报),并按月再平衡;所有组合同时汇报等权重市值加权两个口径——后面会看到,两个口径的差异本身就是重要线索。原书实证区间约为 2000—2019 年,本章对具体表格数据只做定性转述。

5.1估值高低中的异象

价格乘数 price multiples

"价格 ÷ 某个基本面数字"这一类比率的统称:分母告诉你公司有多少家底或赚多少钱,比率告诉你市场为每一块钱的家底出了多高的价。

市盈率(PE)、市净率(PB)、市销率(PS)、市现率(PCF)都是一个模子刻出来的:价格比上盈利、净资产、销售额或现金流。价格乘数衡量价格偏离基本面的程度——乘数越大估值越高(越"贵"),越小估值越低(越"便宜")。要注意分母为负时(如亏损公司的 PE)乘数失去意义,这类公司不适用本节的讨论。

例子

2014 年 6 月,美股上 Amazon 的 PE 高达约 511 倍,IBM 的 PE 只有约 12 倍。单看估值指标,前者贵得离谱、随时可能回调,后者是大甩卖的便宜货。可此后数年的走势完全反过来:Amazon 一路上涨成为超级牛股,IBM 长期萎靡。如果当时"卖掉贵的、抄底便宜的",会追悔莫及。教科书说估值很重要,这个例子却结结实实打了两耳光——问题出在哪?答案是:估值高低必须结合基本面来看。这正是本节要展开的内容。

价值因子不等于价值投资

价值因子是因子投资里资历最老的成员之一:第 3.4 节讲过它的起源;Asness et al.(2013)在美、英、日、欧等成熟股票市场以及股指、债券、商品期货、外汇中都发现了正的价值溢价;Kunz and Mazzoleni(2018)进一步发现不同资产类别的价值溢价相关性很低,适合分散配置。各大指数公司也都编制了价值类指数产品。

但"按估值指标买便宜股票"和大众理解的"价值投资"并不是一回事。一只股票便宜,只有两种可能:要么价格真的低于内在价值(真正的价值股),要么它本来就不值钱——便宜得有道理,这类情形俗称估值陷阱(value trap)。Piotroski(2000)统计过:低估值(高 BM)组合整体表现不错,但其中不到一半的股票能在未来两年获得正超额收益——组合的钱是少数股票赚来的,多数成员在拖后腿。

公式化价值投资 vs 价值投资 formulaic value investing

前者只看"便宜不便宜"这一个数字机械选股;后者在便宜之外还要问一句"公司本身好不好"。

Kok et al.(2017)明确区分了二者。公式化价值投资(即通过价值因子投资)单纯按估值指标选股,简单、纯粹、可批量执行,代价是会捞进大量"伪价值"股。价值投资则在估值之上叠加基本面判断——盈利能力、成长能力——寻找"优质且便宜"的股票。巴菲特 1989 年致股东信里的名言是后者的最佳注脚:以合理的价格买入优质的公司,远胜于以便宜的价格买入平庸的公司。

顺着这个思路,学术界研究价值因子时越来越强调把基本面量化进来,用"估值 + 基本面"的组合去定位估值中的错误,构造多因子模型解释不了的超额收益。其中与因子投资结合得最好的两件工具,是 Piotroski(2000)的 F-Score 和 Mohanram(2005)的 G-Score:前者度量公司基本面的好坏,后者度量成长股的想象空间是否有实据支撑。

F-Score:给基本面打九分

F-Score Piotroski F-Score

用 9 道"是/否"判断题给公司体检:赚不赚钱、现金流健不健康、债务在减不减、经营效率在升不升——答对一题得 1 分,满分 9 分,分越高公司越健康。

Piotroski(2000)的出发点是高 BM(便宜)股票池:这些公司往往正处困境,市场关注度低,财报几乎是外界了解它们的唯一窗口。他从财报中选了三大类共 9 个信号——盈利性 4 项、杠杆与流动性 3 项、运营效率 2 项——每项按规则记 0 或 1 分,加总得到 F-Score。全部用二元打分是有意为之:牺牲连续变量的强度信息,换来对离群值的稳健性和极强的可解释性,也避免了不同量纲指标如何加权的难题。

F-Score 的定义(原书表 5.1 的公式化)
$$ F_i \;=\; \sum_{k=1}^{9} F_{i,k}, \qquad F_{i,k} \in \{0, 1\},\qquad F_i \in \{0, 1, \dots, 9\} $$
$F_i$公司 $i$ 的基本面总分,取值 0~9,越高基本面越强
$F_{i,k}$第 $k$ 个信号的得分:信号成立记 1,否则记 0。9 个信号的判断条件见下表
把 9 个"体检指标"各自压成一票,然后数票。单项指标都可能失真,但 9 票拼起来的总分对"公司在变好还是变坏"相当稳健——这就是打分模型的朴素力量。

9 个信号的完整清单如下。其中 $\mathrm{ROA} = $ 净利润 ÷ 总资产,$\mathrm{CFO} = $ 经营活动现金流,带 $\Delta$ 的信号一律是与上年同期比较

类别信号记 1 分的条件为什么选它
盈利性
(4 项)
ROA$\mathrm{ROA} > 0$是否赚钱是底线。对常处困境的低估值公司,"有利润"本身就是有效信息
CFO$\mathrm{CFO} > 0$现金流比利润难粉饰,检验公司有没有真实的造血能力
ΔROA$\mathrm{ROA}_t > \mathrm{ROA}_{t-1}$盈利趋势在改善,捕捉基本面拐点
ACCRUAL$\mathrm{CFO} > $ 净利润利润的"含金量":应计利润会均值回复,靠应计撑起来的利润不可持续(Sloan 1996 的应计异象)
杠杆与
流动性
(3 项)
ΔLEVER长期负债 ÷ 总资产较上年下降困境公司被迫加杠杆是恶化信号;能去杠杆说明内部造血足够
ΔLIQUID流动比率(流动资产 ÷ 流动负债)较上年上升短期偿债能力增强,违约风险下降
EQ_OFFER本期没有增发普通股低估值时增发既稀释股东,也暴露了"内部融资不够用"的窘境
运营效率
(2 项)
ΔMARGIN毛利率较上年上升产品竞争力或成本控制在改善
ΔTURN资产周转率(营业收入 ÷ 总资产)较上年上升同样的资产做出了更多生意,经营效率提升
例子

某公司甲本期:ROA 为 4%(✓),经营现金流为正(✓),ROA 比上年提升 1 个百分点(✓),现金流大于净利润(✓);长期负债率从 22% 升到 25%(✗);流动比率从 1.4 升到 1.6(✓);本期做过一次定向增发(✗);毛利率上升(✓);资产周转率上升(✓)。合计 $F = 7$,落入高分组——基本面整体在改善,但要留意它的杠杆与融资动作。

误区

用财报数据打分,最容易犯的错是前视偏差(look-ahead bias):年报的报告期是 12 月 31 日,公告日却在次年三四月。回测时若按报告期对齐数据,等于提前几个月偷看了财报。正确做法是一律按公告日之后才允许使用;同比类信号(ΔROA 等)还要求上年同期数据在当时也已公告。练习 5.3 会专门拷问这个问题。

实证结论。Piotroski(2000)用 1976—1996 年美股数据发现:F-Score 与未来一年、两年股票收益的相关系数约为 0.12 和 0.13,按 F-Score 排序的分组收益具有显著单调性。由于 0 分和 9 分的公司都很极端,大多数公司集中在 4~5 分附近,因此他把股票分成三组:0~3 分为低分组、4~6 分为中间组、7~9 分为高分组。原书在 A 股上复现了这一构造(每月末调仓):无论等权重还是市值加权,高分组的收益都显著高于低分组,说明 F-Score 在 A 股同样能有效评价基本面。

图 5-1 | F-Score 三分组组合的月均超额收益示意(模拟数据,仅呈现"高分组显著跑赢低分组、两种加权口径方向一致"的定性结论,非原书数值)。

G-Score:给成长股挤泡沫

G-Score Mohanram G-Score

专为"贵"的股票设计的打分器:在高估值的成长股里,分辨哪些贵得有底气、哪些纯靠讲故事。

F-Score 是为便宜的困境股设计的;Mohanram(2005)的 G-Score 反过来,服务于低 BM(高估值)的成长股——正是 Amazon 这类让人"想追不敢追"的股票。它从三个维度打分:(1)盈利性:赚钱能力是否超过同行;(2)盈利稳定性:最怕业绩"坐过山车",纳入盈利波动和营收增长波动两个指标来度量成长的可持续性;(3)保守会计准则:研发、广告、资本开支这类投入在会计上被费用化,压低了当期利润,但它们直接挂钩未来的盈利——投入越大,想象空间越有实据。总分与 F-Score 同理:$G_i = \sum_{k=1}^{8} g_{i,k}$,其中每个 $g_{i,k} \in \{0,1\}$(A 股版共 8 项),$G_i$ 取值 0~8。

与 F-Score 的一个重要区别:除应计一项外,G-Score 每个指标都是与同行业股票的中位数比较后打分——成长性指标跨行业差异太大,绝对阈值没有意义。

维度信号(A 股版,共 8 项)记 1 分的条件
盈利性ROA高于行业中位数
现金流 ROA(CFO ÷ 总资产)高于行业中位数
应计$\mathrm{CFO} > $ 净利润(不做行业比较)
盈利稳定性盈利波动率低于行业中位数
营收增长率波动低于行业中位数
保守会计准则研发投入强度高于行业中位数
资本开支强度高于行业中位数
销售费用强度高于行业中位数(原版用广告费用;A 股数据可得性差,原书以销售费用替代)

实证结论。Mohanram(2005)用 1978—2001 年美股数据检验:在低 BM 股票内部,高 G-Score 组年化收益约 +3.1%,低 G-Score 组约 −17.5%——高估值股票中确实存在基本面撑得起估值的赢家,而"又贵又差"的股票收益显著为负。后者即便做空不可行,也值得列入黑名单以规避风险。原书在 A 股上按 G-Score 与 BM 做 3×3 双重排序:等权重时,低 BM 组内收益随 G-Score 单调上升,打分确实能区分好坏;但市值加权时高 G-Score 组的夏普比率反而垫底——等权结果很可能被小市值股票抬起来了。综合来看,G-Score 在 A 股有一定效果,但普适性不如 F-Score。此外 A 股 2002 年才开始披露季度利润表、2003 年才有季度现金流量表,两个波动类指标在早期严重缺失,也拖累了它的表现。

预期差:估值与基本面的错位

预期差 expectation errors

市场用价格投出的预期,和公司财报体现的真实基本面之间的落差。落差终会被纠正,纠正的方向就是超额收益的方向。

Piotroski and So(2012)提出:价值股长期战胜成长股的根源是错误定价——市场低估了价值股、高估了成长股。价格反映市场预期,基本面反映公司的基本面预期,两者不一致就存在预期差(expectation errors),而价值溢价正是预期差修正的产物。他们用 BM 代理市场预期(BM 低 = 市场预期高)、用 F-Score 代理基本面预期,各分高中低三档,构成一张九宫格:

市场预期高(低 BM)市场预期中市场预期低(高 BM)
基本面强(高 F-Score)贵得有理,无预期差被低估的价值股 → 未来正超额收益
基本面中等大致匹配
基本面弱(低 F-Score)被高估的成长股 → 未来负超额收益便宜有因,无预期差

对角线上的两个角落(好公司贵、差公司便宜)市场预期与基本面一致,价格已经反映内在价值,不该有超额收益;反对角线的两个角落才存在预期差。这个视角对价值因子本身是一记重锤:单纯按 BM 做多便宜、做空贵的组合里,真正贡献收益的只是存在预期差的那部分股票,其余成员都在"打酱油"。若果真如此,只用存在预期差的股票构建的多空组合,收益应显著强于普通价值因子。

Piotroski and So(2012)在美股上构建了三个组合来验证:(1)V/G 组合——仅按 BM 高低做多空;(2)预期差组合——做多"高 BM 且高 F-Score"(被低估)、做空"低 BM 且低 F-Score"(被高估);(3)非预期差组合——做多"高 BM 但低 F-Score"、做空"低 BM 但高 F-Score"(两端都无预期差)。结果干脆利落:预期差组合大幅跑赢 V/G 组合,而非预期差组合的收益近似为零——价值溢价确实来自预期差。

A 股实证。原书按同样的 3×3 双重排序(BM × F-Score)在 A 股复现,结论与美股高度一致:

  • 等权重下,预期差组合的月均收益约 1.4%(t 值超过 5),远高于仅按 BM 构造的组合(约 0.65%,t 值约 3);非预期差组合约 0.2%,统计上与零无异。市值加权下定性结论不变。
  • α 检验:等权重的预期差组合无论对 CAPM、FF3 还是 LSL4 都有显著 α,且随模型因子增多而递减(约从 1.4% 降到 0.7%)——模型越强解释掉越多,但解释不完。市值加权时,CAPM-α 和 FF3-α 依然显著,LSL4-α 不再显著(t 值约 1.9)。
  • 非预期差组合的 CAPM-α 几乎为零;换用更强的模型后其 α 甚至显著为负。

Piotroski and So(2012)还提供了一组"机制证据":存在预期差的股票在随后的业绩公告窗口有更显著的(正或负)收益,分析师在这些股票上的预测误差更大、预期修正也更大。这说明预期差来自投资者反应不足——对基本面优秀的价值股过度悲观,对基本面糟糕的热门成长股过度乐观,直到财报把真相拍在脸上。最后要说明:用 F-Score 度量基本面只是"尽量复现原文"的选择,未必是 A 股的最优解;但"定量刻画基本面预期、定位预期差、赚取修正收益"这条路线本身是扎实的。

要点
  • 便宜的股票分两种:被错杀的和活该便宜的。价值因子不区分,价值投资必须区分。
  • F-Score 用 9 个二元信号(盈利性 4 + 杠杆流动性 3 + 运营效率 2)给基本面打分,A 股上高分组显著跑赢低分组。
  • G-Score 面向高估值成长股,用行业相对打分衡量"贵得有没有底气";A 股上等权有效、市值加权失效,普适性弱于 F-Score。
  • 价值溢价的引擎是预期差:只有市场预期与基本面错位的股票才贡献超额收益,预期差组合显著强于普通价值组合。
  • 预期差组合的 α 在等权下对三个模型都显著;市值加权下被 LSL4 解释——异象强弱永远相对于模型与加权口径。

5.2基本面锚定反转

短期反转 short-term reversal, STR

上个月跌得最惨的股票,下个月平均反而涨得更好;上个月涨得最猛的,下个月平均更差。

以学术界和业界广泛采用的过去一个月累计收益率为排序变量,把股票分成五组——输家(Loser)、第 2~4 组、赢家(Winner)——输家组合的未来收益系统性地高于赢家组合,这就是短期反转异象。它大概是 A 股上最显著的异象:原书按此五分组画出的累计收益曲线,输家到赢家的排布清晰得近乎教科书插图。美股上它同样古老:Jegadeesh(1990)早在动量研究之前就发表了关于反转的论文。

旁注

反转和动量并不打架,它们住在不同的时间尺度上:动量用"过去 12 个月剔除最近 1 个月"的收益排序,Jegadeesh and Titman(1993)特意剔除最近一个月,躲的正是短期反转。一个月之内均值回复,几个月到一年延续趋势——两个现象共存。

实际投资中做空受限,利用反转只能从多头入手:买入前期超跌的股票。逆势接刀需要勇气,更需要辨别——股票超跌通常有三类原因:

  • 基本面恶化:公司真出了问题。这种下跌是价格向新的(更低的)内在价值靠拢,难以反转
  • 过度反应(overreaction,Lehmann 1990):投资者对信息反应过头,价格砸穿了合理位置;
  • 瞬时流动性冲击(Grossman and Miller 1988;Jegadeesh and Titman 1995):噪声交易者集中抛售,价格被暂时砸低,与信息无关。

后两类下跌会回来,第一类不会。所以一个合理的反转策略应当把基本面变化的影响从收益率里剥离出去,只对"没道理的下跌"下注。Zhu et al.(2019)沿这个思路提出了基本面锚定反转异象,在美股上大幅跑赢原始反转。

金融学依据:反转需要一个锚

锚定 anchoring

判断一个东西"高了还是低了",人总得先找个参照物;参照物选错了,"高低"的判断就是空中楼阁。

锚定效应是 Tversky and Kahneman(1974)总结的经典行为偏差:人们的估计会被一个初始参照值牵着走,且调整不足。放到反转策略里,锚定给了我们一个关键视角:"跌多了要涨回来"这句话必须回答"涨回到哪"。只有当价格偏离了某个锚,均值回复才有目标位;而最合理的锚就是基本面。价格跌离基本面锚(基本面没坏、价格暴跌)→ 偏离大概率来自过度反应或流动性冲击 → 反转可靠;价格与锚一起下移(基本面同步恶化)→ 没有偏离,无从反转。把"过去收益"与"基本面锚"结合,反转信号才从"赌均值回复"升级为"赌向锚回归"。

怎么在数学上"剥离基本面"?起点是 Da et al.(2014)的分解:

式 (5.1) · 残余收益:从收益率中减掉基本面新息
$$ \mathrm{Residual}_{t+1} \;=\; R_{t+1} - \mu_t - \mathrm{CF}_{t+1} $$
$R_{t+1}$股票在第 $t+1$ 期的收益率
$\mu_t$均衡状态下的条件预期收益率:按某个定价模型、基于 $t$ 期信息"本来就该赚"的部分
$\mathrm{CF}_{t+1}$第 $t+1$ 期现金流新息(cash-flow news)带来的收益率变化:新的基本面消息应当引起的价格变动,实操中常用分析师预期修正来估计
$\mathrm{Residual}_{t+1}$剥离"应得收益"和"基本面消息"之后的残余收益率——只剩过度反应与流动性冲击的痕迹
把一段收益拆成三块:该赚的、基本面消息带来的、剩下没道理的。反转策略只应该对第三块下注,因为只有它会回吐。

Zhu et al.(2019)指出式 (5.1) 有两个毛病。其一,价格对基本面消息的吸收是缓慢的(Hong et al. 2000;Choi and Sias 2012),只减去最新一期的新息不够,应把过去一段时间的都算上;其二,分析师覆盖不了全部股票,靠分析师预期修正估计 $\mathrm{CF}$ 会漏掉大量(尤其是小盘)股票。针对第一点,把单期新息扩成过去 $T$ 期的累计:

式 (5.2) · 改进一:累计过去 T 期的现金流新息
$$ \mathrm{Residual}_{t+1} \;=\; R_{t+1} - \mu_t - \sum_{s=0}^{T-1} \mathrm{CF}_{t+1-s} $$
$T$回看的期数:承认价格消化基本面消息需要时间,把最近 $T$ 期的新息一并剥离
$\mathrm{CF}_{t+1-s}$第 $t+1-s$ 期的现金流新息,$s = 0$ 对应最新一期
如果消息要花几个月才被价格消化完,那么"没道理的下跌"就得用几个月的消息一起来对账,只对最新一期是不够的。

针对第二点,他们干脆放弃分析师数据,改用 F-Score 作为基本面信息的代理变量——财报人人都有,覆盖全市场。Choi and Sias(2012)的证据支持这一替换:随着价格逐步吸收基本面信息,F-Score 对基本面驱动的未来收益的预测力是上升的。把 F-Score 隐含的收益率记作 $R^{\mathrm{FS}}$(原书记作 $R^{F\text{-}Score}$),替换式 (5.2) 中的累计新息项;又因为大量实证显示无论用哪个定价模型算 $\mu_t$,结果都非常稳健($\mu_t$ 的影响有限),最终连 $\mu_t$ 一起省去:

式 (5.3) / 式 (5.4) · 改进二:用 F-Score 代理基本面,并简化 μ
$$ \mathrm{Residual}_{t+1} \;=\; R_{t+1} - \mu_t - R^{\mathrm{FS}}_{t+1} \qquad (5.3) $$ $$ \mathrm{Residual}_{t+1} \;=\; R_{t+1} - R^{\mathrm{FS}}_{t+1} \qquad (5.4) $$
$R^{\mathrm{FS}}_{t+1}$F-Score 隐含的收益率:基本面强弱按其历史上对应的收益折算成的"基本面应得涨跌",用来替代难以估计的现金流新息累计项
$\mu_t$条件预期收益。实证显示换用不同定价模型结果几乎不变,故式 (5.4) 将其省去
实操中甚至不必显式估计 $R^{\mathrm{FS}}$:用"过去一个月收益 × F-Score"做双重排序,本质上就是式 (5.4) 的非参数实现——在同一 F-Score 档内比较涨跌,等于已经把基本面那部分对齐了。

传统反转说的是:短期历史收益与未来收益负相关;5.1 节的实证说的是:F-Score 与未来收益正相关。两个变量叠加,得到一张 2×2 的预期收益地图:

F-Score 高(基本面强)F-Score 低(基本面弱)
过去输家(大跌)跌得没道理 → 被低估,预期收益最高(做多端)跌得有道理,反转不可靠
过去赢家(大涨)涨得有道理,无明显预期差涨得没道理 → 被高估,预期收益最低(做空端)
基本面锚定反转 fundamental-anchored reversal, FAR

只买"基本面好却大跌"的股票、只空"基本面差却大涨"的股票——反转策略里最有把握的两个角。

受 Stein(2009)的启发,Zhu et al.(2019)定义:FAR = 做多"输家 且 高 F-Score"组合,做空"赢家 且 低 F-Score"组合。作为对照,FUR(fundamental-unanchored reversal,未经基本面锚定的反转)= 做多"输家 且 低 F-Score"、做空"赢家 且 高 F-Score"——即反转地图上"没有预期差"的两个角。如果锚定逻辑成立,FAR 应显著强于传统反转(Loser − Winner),而 FUR 应接近于零。这与 5.1.4 节的预期差组合/非预期差组合是同一个思想在不同变量上的化身:过去输家 + 高 F-Score 就是被低估的股票,过去赢家 + 低 F-Score 就是被高估的股票。

A 股实证

原书用过去一个月累计收益率(5 组)× F-Score(3 组)做独立双重排序,得到 15 个组合,每月末调仓。主要结论(定性转述,实证区间约 2000—2019 年):

  • 等权重:控制其中一个变量后,另一个变量的分组收益仍保持很好的单调性。FAR 的月均收益约 2.1%(t 值超过 7),显著高于传统反转的约 1.45%(t 值约 6);FUR 只有约 0.7%(t 值约 2.3)——锚定带来的增强非常清晰。
  • 市值加权:反转整体减弱(说明反转异象在小市值上暴露较大),但 FAR 强于传统反转的排序保持不变。
  • α 检验:等权重下,FAR 对 CAPM、FF3、LSL4 均有显著 α;15 个组合从"赢家 且 低 F"到"输家 且 高 F"的 α 呈现由显著为负到显著为正的梯度。市值加权下,FAR 对 CAPM 和 FF3 的 α 依然显著,但 LSL4-α 不再显著(月均约 0.5%,t 值约 1.6)——又一次被这个四因子模型解释掉。
  • 实战导向的拆解:FAR 的收益中空头端贡献很大(做空基本面差的赢家既贡献收益又平滑波动),而单看多头端——尤其市值加权多头——波动比多空组合高得多、收益却更低。
误区

看到等权 FAR 月均 2% 的曲线就热血上头,是新手的经典事故。三盆冷水: 这是不含任何交易成本的纸面收益,反转策略月月调仓、换手极高,成本侵蚀严重; A 股做空受限,空头端的收益和平滑作用实盘拿不到,只能做多头,而多头端收益更低、波动更高,必须严格管理风险; 等权组合和小市值倾斜在流动性差的股票上难以按收盘价成交。原书的建议是:若想利用 FAR,可在满足换手率与流动性约束的前提下适当向小市值倾斜——但那是"戴着镣铐的倾斜"。

误区

"我给反转加了个条件,样本内收益更高了,所以改进有效"——不成立。非条件反转本身已经极显著,任何增加复杂度的条件化都几乎必然改善样本内表现,这是自由参数变多的算术结果,不是发现。FAR 之所以可信,不在于收益更高,而在于剥离基本面有明确的金融学依据(超跌三来源中只有两种会回归)、且有 FUR 这个"反向对照组"近乎归零来背书。评判任何"改进版异象",都要看它有没有对照组。

要点
  • 短期反转是 A 股最显著的异象,但超跌分三种:基本面恶化不会回来,过度反应和流动性冲击才会。
  • 锚定视角:反转赌的是"向基本面锚回归",价格没有偏离锚就没有反转可赌。
  • 式 (5.1)→(5.4) 的演进:剥离现金流新息 → 累计多期 → 用 F-Score 代理(覆盖全市场)→ 省去不敏感的 μ;双重排序是它的非参数实现。
  • A 股上 FAR 显著强于传统反转,FUR 接近零——预期差再次被验证为反转收益的引擎。
  • 市值加权下 FAR 的 α 被 LSL4 解释;实盘还要面对成本、做空约束与多头端的高波动。

5.3特质性波动率

多因子模型把股票的风险切成两块:因子代表的系统性风险,和剩下的特质性风险。经典理论对后者的态度非常干脆——特质性风险可以靠分散化消掉,市场不会为它付钱,所以它不应该能预测股票的预期收益。本节的主角,就是一个把这句话按在地上摩擦的异象。

定义与计算

特质性波动率 idiosyncratic volatility, IVOL

把一只股票的日涨跌里能用市场、规模、价值三个因子解释的部分刨掉,剩下那些"只属于它自己"的波动有多大。

操作定义(沿用 Ang et al. 2006 的经典做法,也是原书 A 股实证的做法):以 Fama–French 三因子模型为基准,用过去 21 个交易日的个股日频超额收益对三因子日收益做时序回归,取残差的标准差,即为该股票当期的 IVOL;每月末滚动重算、重新排序。注意两点:其一,IVOL 是相对于模型的——换用 CAPM 或五因子模型,残差就变了,IVOL 也随之改变;其二,它与总波动率不同,总波动里还包含因子驱动的系统性部分。

第一步 · 日频 FF3 时序回归(估计窗口内)
$$ R^{e}_{i,d} \;=\; \alpha_i + \beta_i\,\mathrm{MKT}_d + s_i\,\mathrm{SMB}_d + h_i\,\mathrm{HML}_d + \varepsilon_{i,d}, \qquad d = 1, \dots, D $$
$R^{e}_{i,d}$股票 $i$ 在窗口内第 $d$ 个交易日的超额收益率(日收益减无风险利率)
$\mathrm{MKT}_d,\ \mathrm{SMB}_d,\ \mathrm{HML}_d$市场、规模、价值三个因子的日收益率
$\beta_i,\ s_i,\ h_i$股票 $i$ 对三个因子的暴露(回归系数)
$\alpha_i$回归截距:窗口内因子解释不了的日均收益
$\varepsilon_{i,d}$残差:当日收益中与三因子无关的部分,即特质性收益
$D$估计窗口长度,原书取 21 个交易日(约一个月),逐月滚动
回归是一把筛子:因子筛走"随大流"的涨跌,残差就是这只股票自己的脾气。
第二步 · IVOL:残差的标准差
$$ \mathrm{IVOL}_{i,t} \;=\; \sqrt{\frac{1}{D-4} \sum_{d=1}^{D} \hat{\varepsilon}_{i,d}^{\;2}} $$
$\hat{\varepsilon}_{i,d}$第一步回归的残差估计值。回归含截距,残差均值为零,故平方和除以自由度就是方差
$D-4$自由度:窗口长度扣掉 4 个待估参数(截距 + 三个暴露)。不少实现直接取残差的样本标准差(ddof 取 0 或 1),对排序结果几乎没有影响
$\mathrm{IVOL}_{i,t}$股票 $i$ 在 $t$ 月末的特质性波动率(日频口径;如需年化可乘 $\sqrt{252}$,排序不受影响)
IVOL 大 = 这只股票经常无缘无故大涨大跌。理论上这种风险可分散、不该定价——接下来的实证恰恰说它"被定价"了,而且方向诡异。

IVOL 之谜:高波动、低收益

特质性波动率之谜 idiosyncratic volatility puzzle

按理说 IVOL 跟未来收益应该没关系,可数据反复显示:IVOL 越高的股票,未来平均收益反而越低。

2006 年,Ang、Hodrick、Xing 和 Zhang 在 Journal of Finance 发表 The cross-section of volatility and expected returns(即 Ang et al. 2006),发现高 IVOL 股票未来预期收益显著更低——与"特质风险不定价"的理论预言直接冲突。三年后他们又在 Journal of Financial Economics 用美国之外的更多市场数据确认了这一负相关(Ang et al. 2009)。Ang et al.(2006)的谷歌学术引用量已超过 3000 次,影响力可见一斑。学术界把这种理论不容、数据顽固的负相关称作特质性波动率之谜

当然,学术界从不缺少反对派。三种立场都有代表作:

观点代表文献核心论据
负相关(主流)Ang et al.(2006, 2009)、Jiang et al.(2009)、Guo and Savickas(2010)、Chen et al.(2012)组合排序与截面回归中高 IVOL 组合未来收益显著更低,且在多国市场成立
正相关Tinic and West(1986)、Lehmann(1990)、Xu and Malkiel(2004)、Fu(2009)Fu(2009)用 EGARCH 估计条件 IVOL,得到正相关,并认为 Ang et al. 的负相关只是少数高 IVOL 股票收益反转造成的
无稳健关系Fama and MacBeth(1973)、Bali and Cakici(2008)、Li et al.(2014)、Novy-Marx(2014)结论对数据频率、加权方式、样本筛选高度敏感,难有定论
旁注

Anderson et al.(2015)则从统计上发难:Ang et al.(2006)的样本里 1987 年 10 月(股灾月)是一个极端异常点,它把异象收益的标准误压小了约一半、t 值随之虚高;剔除该点后负相关不再显著。这篇文章的工作论文版标题相当不客气,直指对方的显著性"由单个离群点驱动";正式发表时改成了温和得多的 In search of statistically valid risk factors,还在致谢里感谢了 Ang 等四位作者的建设性意见——学术圈的刀光剑影与体面,尽在这一改之间。

综合来看,多数实证支持负相关,"谜"的地位成立。有谜就有解谜人,其中最精彩的当属 Stambaugh, Yu and Yuan(2015)从套利不对称性给出的解释。

套利不对称性:谜底的候选答案

套利风险 arbitrage risk

纠错是有成本、有风险的生意:股票自己的波动越大,纠错的人越容易在半路被震下车,错价也就越难被抹平。

教科书里的套利者看到错误定价就一拥而上,把价格推回原位。现实中的套利者要考虑:价格回归之前,我扛不扛得住中途的波动?最典型的风险来自噪声交易者——套利者做空高估的股票后,噪声交易者可能继续买入,把价格推得更高,逼得套利者追加保证金甚至止损离场。特质性波动率正是这种风险的度量:系统性波动可以用指数对冲掉,特质性波动无处可躲。所以 IVOL 越高的股票,套利越不充分,残留的错误定价越多——IVOL 与错误定价的幅度正相关。

套利不对称性 arbitrage asymmetry

看到便宜货,人人都乐意买;看到贵货,却很少有人愿意(或能够)做空。纠错的力量天生偏科:纠"低估"快,纠"高估"慢。

买入被低估的股票没有门槛;做空被高估的股票则要面对券源、费用、逼空风险、机构章程限制等重重障碍,很多投资者干脆不做。Stambaugh et al.(2015)把套利活动在低估与高估两侧的强度差异称为套利不对称性。把它与套利风险叠加,IVOL 之谜的逻辑链就通了:

  • 被低估的股票中:残留错价是"未来会涨回去"的折价。IVOL 越高 → 套利越不充分 → 折价越深 → 未来收益越高。IVOL 与收益正相关
  • 被高估的股票中:残留错价是"未来会跌回去"的溢价。IVOL 越高 → 溢价越大 → 未来收益越低。IVOL 与收益负相关
  • 由于做空更难,高估侧的套利远不如低估侧充分 → 高估侧的负相关比低估侧的正相关更陡
  • 不分组、对全市场平均时,更陡的负相关占据上风 → 截面上表现为无条件的负相关——这就是 IVOL 之谜。

换句话说:IVOL 之谜不是"特质风险被负定价",而是错误定价 × 套利限制 × 做空约束三者合谋的表象,效应应当集中在被高估的股票里。

下图把这条逻辑链做成可以拨弄的玩具。五根柱子一组代表按 IVOL 从低到高的五档;拖动滑杆改变"做空相对做多的难度倍数" $m$:$m = 1$ 时两侧对称,全市场平均线是平的(IVOL 不定价);$m$ 越大,高估侧的负相关越陡,全市场平均随 IVOL 递减的形态就越明显——之谜浮现。

图 5-2 | 套利不对称性如何制造 IVOL 之谜(示意,非真实数据)。低估组内 IVOL 与 α 正相关、高估组内负相关;做空越难(m 越大),负相关一侧越陡,全市场平均越接近"高 IVOL 低收益"。

怎么在数据里认定"谁被高估、谁被低估"?Stambaugh et al.(2015)借用了 4.1.6 节介绍 Stambaugh–Yuan 四因子模型时提到的 11 个异象:每个异象都能获得 FF3 解释不了的超额收益,其多头端股票更可能被低估、空头端更可能被高估。于是异象变量的取值就能标注错误定价的方向与大小(注意:标注的是噪声交易导致的潜在错价,不是事后确认的错价)。把 11 把尺子合成一把:

综合错误定价得分 (Stambaugh et al. 2015 的构造)
$$ P_i \;=\; \frac{1}{K} \sum_{k=1}^{K} \mathrm{rank}_k(i) $$
$K$参与合成的异象个数:美股原文 $K = 11$;原书 A 股实证因数据可得性取 $K = 8$
$\mathrm{rank}_k(i)$股票 $i$ 在第 $k$ 个异象变量下的(百分位)排名分数。排序方向统一约定为:越可能获得超额收益(越像该异象的空头端),分数越高
$P_i$11 个(或 8 个)排名的平均:综合错误定价得分,越高越可能被高估,未来预期收益越低
单个异象变量像一位偏科的评委,平均掉各自的偏科之后,留下的共识就是"这只股票整体上更像被高估还是被低估"。用排名而非原始值合成,是为了免疫量纲与离群值。

用 $P_i$ 与 IVOL 做双重排序,美股实证支持了上面的全部猜想。此外还有两组佐证:以机构持股比例度量套利限制,持股比例越低(限制越大)的股票中 IVOL 异象越显著;用 Baker and Wurgler(2006)的投资者情绪指数看时变性,情绪高涨期 IVOL 异象高度显著,情绪低迷期不再显著——情绪高涨时高估更普遍、做空的对手盘更凶,恰是套利不对称性最猖獗的时候。

A 股实证与其他解释

原书按同一套流程做 A 股实证:IVOL 用过去 21 个交易日对 FF3 的回归残差标准差;错误定价得分因数据可得性只用了 11 个异象中的 8 个(财务困境、股票净发行、复合股权净发行三个未能复现);先按错误定价分 5 组,再在组内按 IVOL 分 5 组(条件双重排序),共 25 个组合。结论:

  • 全市场平均(五个错误定价组取平均):做多最低 IVOL、做空最高 IVOL 的组合,绝对收益和 α 在绝大多数情形下都非常显著。以 FF3-α 为例,等权重月均约 1.3%(t 值超过 8),市值加权降至约 0.8% 但仍显著——低特质性波动率异象在 A 股成立。
  • 唯一的例外又是它:市值加权 + LSL4 时,α 缩到约 0.4%、t 值约 1.6,不再显著。至此,本章三个异象在市值加权下全部能被 LSL4 解释——这个"FF3 + 盈利"的四因子模型对 A 股的适用性得到了侧面印证。
  • 最被高估组内:IVOL 与收益呈清晰的负相关,与美股一致,符合套利不对称性的预言。
  • 最被低估组内:与美股不同,正相关并不完整——前三档 IVOL 内确实收益递增,但最高 IVOL 档的收益骤降,以致即便在最被低估的股票里,"做多低 IVOL、做空高 IVOL"依然显著赚钱。原书推测这与 A 股的高噪音、高换手有关,值得进一步研究。
误区

两个常见误读: "IVOL 高 = 公司差"——不对,IVOL 度量的是套利难度和错价存留空间,不是基本面质量;高 IVOL 的股票里既有被高估的也有被低估的,方向要靠错误定价得分判断。 "IVOL 是股票的固有属性"——不对,IVOL 是相对于某个定价模型的残差波动,模型换了它就变了;说"某股 IVOL 高"而不说基准模型,和说"α 显著"而不说定价模型是同一种不严谨。

套利不对称性并非唯一的解谜思路,还有两条值得知道的线索。其一,Liang and Tang(2018)把 IVOL 拆成不确定性残差波动率两部分,发现负相关主要由不确定性部分驱动。其二,Herskovic et al.(2016)发现个股 IVOL 之间存在显著的共同运动,并提出相应的因子结构——"特质"波动居然有共性,这本身就对实证资产定价有启示。

旁注

把镜头拉远,低 IVOL 异象是"低风险异象"大家族的一员——低 β 异象(betting against beta,Frazzini and Pedersen 2014)是另一位名角。对整个家族还有一种"模型漏了因子"式的解释:投资者偏好正偏度(彩票型收益)。Kraus and Litzenberger(1976)从递减的绝对风险厌恶推出效用函数三阶导为正,隐含对正偏的偏好;Harvey and Siddique(2000)证明资产的 CAPM 超额收益与其剩余协偏度(资产超额收益与市场超额收益平方的协方差,$\Cov(R_i^e, (R_M^e)^2)$)负相关。Schneider et al.(2020)据此猜想低波动异象源于遗漏了协偏度因子:他们用美股期权数据构造隐含偏度因子,加入定价模型后,包括低 IVOL 在内的常见低波动异象消失了;他们还用主成分分析提取 4 个低波动异象的第一主成分,发现隐含偏度因子几乎能完全解释它——解释力并非巧合,而是击中了共同驱动。

全章回望:三个异象的共同骨架

把三个异象并排放在一起,会看到同一副骨架反复出现:先有一个众所周知的单变量效应(价值、反转、低波动),再用一个基本面或错价维度把它"切开",超额收益总是集中在存在错误定价的那个子集里,而"没有错价"的子集充当了天然的对照组。

异象错误定价从哪来定位错价的变量组合对照组(近似归零)市值加权 + LSL4
预期差(5.1)市场对基本面反应不足:错杀价值股、追捧成长股BM × F-Score非预期差组合α 不再显著
基本面锚定反转(5.2)过度反应与流动性冲击造成的偏离基本面锚过去一月收益 × F-ScoreFUR 组合α 不再显著
低 IVOL(5.3)套利限制 + 做空约束让高估难以纠正综合错价得分 × IVOL低估组内的正相关侧α 不再显著

最后一列是全章最耐人寻味的巧合:三个异象在市值加权下都被 Liu–Shi–Lian 四因子模型解释。一种读法是这个模型确实适合 A 股;另一种读法是这些异象的可兑现部分高度依赖小市值股票——两种读法都值得带进第 6 章关于"因子还是异象"的讨论。

要点
  • IVOL = 相对 FF3 的日频回归残差标准差(21 个交易日窗口,月度滚动);它是相对于模型的量。
  • 理论说特质风险不定价,Ang et al.(2006)却发现高 IVOL 低收益——IVOL 之谜;正、反、无关三派长期争论,主流证据偏向负相关。
  • Stambaugh et al.(2015)的解释:IVOL 阻碍套利 → 错价存留;做空比做多难 → 高估侧纠错更慢 → 负相关集中在被高估的股票中,平均后呈现全局负相关。
  • 佐证:低机构持股(套利限制大)中异象更强;情绪高涨期异象显著、低迷期消失。
  • A 股:高估组内负相关复现;低估组内正相关不完整(最高 IVOL 档塌陷);市值加权下异象被 LSL4 解释。

本章练习

练习刻意有难度。代码题请准备 Python 环境(numpy / pandas),先自己写,再看提示,最后对答案。

练习 5.1 实现完整的 F-Score 打分器 代码题

下面的代码生成 800 家公司两个会计年度的模拟财务数据,以及每家公司下一年的超额收益。潜在变量 q 是公司的真实质量,打分时不可使用(现实中它不可观测)。请你:

  1. 实现函数 fscore(cur, prev),返回每家公司完整的 9 项信号得分(盈利性 4 项、杠杆与流动性 3 项、运营效率 2 项,注意同比信号要用两期数据);
  2. 按总分 0–3 / 4–6 / 7–9 分三组,统计各组下一年平均收益,检验高分组减低分组的收益差是否显著(双样本 t 检验);
  3. 计算每个单项信号与未来收益的相关系数,指出信息量最大的三个信号,并解释为什么"9 个弱信号加总"好过"挑一个最强信号"。
import numpy as np
import pandas as pd

rng = np.random.default_rng(51)
N = 800
q = rng.normal(size=N)                 # 潜在质量(仅用于造数据,打分时不可用)

def year_data(k):                      # k=0: 上年;k=1: 当年
    assets = np.exp(rng.normal(8.0, 0.8, N))
    ni  = assets * (0.020 + 0.020 * q * (1 + 0.5 * k) + rng.normal(0, 0.04, N))
    cfo = ni + assets * (0.010 * q + rng.normal(0, 0.03, N))
    return pd.DataFrame({
        "assets": assets, "net_income": ni, "cfo": cfo,
        "sales":  assets * np.clip(0.8 + 0.10 * q * k + rng.normal(0, 0.15, N), 0.1, None),
        "gross_margin": np.clip(0.30 + 0.04 * q * (1 + k) + rng.normal(0, 0.05, N), 0.01, 0.9),
        "lt_debt": assets * np.clip(0.25 - 0.04 * q * k + rng.normal(0, 0.06, N), 0.0, None),
        "cur_assets": assets * np.clip(0.45 + 0.03 * q * k + rng.normal(0, 0.08, N), 0.05, None),
        "cur_liab":  assets * np.clip(0.30 - 0.02 * q * k + rng.normal(0, 0.06, N), 0.05, None),
        "shares": 100.0 * (1 + 0.1 * ((rng.random(N) < 0.3) & (q < 0)) * k),
    })

prev, cur = year_data(0), year_data(1)          # 两个会计年度
fut_ret = pd.Series(0.10 * q + rng.normal(0, 0.30, N))   # 下一年超额收益
提示

9 项信号全部是布尔比较再 astype(int):4 项盈利性(ROA 为正、CFO 为正、ROA 同比升、CFO 大于净利润)、3 项杠杆流动性(长期负债率降、流动比率升、股本未增加)、2 项效率(毛利率升、周转率升)。同比信号用 curprev 两个 DataFrame 逐列比较即可,不需要 groupby。分组用 pd.cut,组间 t 检验记得用两组各自的方差和样本量。

参考答案
def fscore(cur, prev):
    s = pd.DataFrame(index=cur.index)
    roa_c = cur.net_income / cur.assets
    roa_p = prev.net_income / prev.assets
    # --- 盈利性 4 项 ---
    s["f1_roa"]     = (roa_c > 0).astype(int)
    s["f2_cfo"]     = (cur.cfo > 0).astype(int)
    s["f3_droa"]    = (roa_c > roa_p).astype(int)
    s["f4_accrual"] = (cur.cfo > cur.net_income).astype(int)
    # --- 杠杆与流动性 3 项 ---
    s["f5_dlever"]  = (cur.lt_debt / cur.assets < prev.lt_debt / prev.assets).astype(int)
    s["f6_dliquid"] = (cur.cur_assets / cur.cur_liab > prev.cur_assets / prev.cur_liab).astype(int)
    s["f7_eq"]      = (cur.shares <= prev.shares).astype(int)
    # --- 运营效率 2 项 ---
    s["f8_dmargin"] = (cur.gross_margin > prev.gross_margin).astype(int)
    s["f9_dturn"]   = (cur.sales / cur.assets > prev.sales / prev.assets).astype(int)
    return s

sig = fscore(cur, prev)
F = sig.sum(axis=1)

grp = pd.cut(F, [-0.5, 3.5, 6.5, 9.5], labels=["低 0-3", "中 4-6", "高 7-9"])
tab = fut_ret.groupby(grp, observed=True).agg(["count", "mean", "std"])
print(tab)

hi, lo = fut_ret[grp == "高 7-9"], fut_ret[grp == "低 0-3"]
diff = hi.mean() - lo.mean()
se = np.sqrt(hi.var(ddof=1) / len(hi) + lo.var(ddof=1) / len(lo))
print(f"高-低收益差 = {diff:.2%}, t = {diff / se:.2f}")

corrs = {c: np.corrcoef(sig[c], fut_ret)[0, 1] for c in sig.columns}
for c, v in sorted(corrs.items(), key=lambda kv: -abs(kv[1])):
    print(f"{c:12s} {v:+.3f}")

典型输出:三组收益单调上升,高-低收益差约 8~10 个百分点,t 值明显大于 2。单项相关系数都不大(多在 0.05~0.15),信息量靠前的通常是与 q 挂钩最紧的应计(f4)、去杠杆(f5)和毛利率(f8)。这正是打分模型的要义:每个信号都弱且噪声大,但噪声近似独立,9 个加总后信噪比按 $\sqrt{9}$ 的量级改善;而"挑最强的一个"既丢掉了其余 8 份信息,还容易在样本内挑到运气好的那个(多重检验问题,见第 6 章)。真实数据中还需注意:财务数据要按公告日对齐(练习 5.3),且 Piotroski 的 ROA 分母是期初总资产,本题为简化用了当期值。

练习 5.2 计算 IVOL 并检验五分组单调性 代码题

下面的代码模拟 500 只股票 252 个交易日的日频超额收益,数据由三因子结构驱动,并植入了 IVOL 之谜:真实特质波动越高的股票,日均 α 越低。请你:

  1. 实现函数 ivol(R_win, F_win):对窗口内每只股票做含截距的三因子 OLS,返回残差标准差(自由度用 D−4)。要求用一次 lstsq 矩阵化地解完全部 500 只股票,不许逐股循环;
  2. 逐月滚动(每月 21 个交易日):用第 m 月数据估计 IVOL,按五分位分组,计算各组第 m+1 月的平均收益;汇总 11 个月,输出各组月均收益并检验单调性,计算"低 IVOL − 高 IVOL"价差的均值与 t 值;
  3. 用秩相关比较估计出的 IVOL 与真实 sig:21 天窗口的估计噪声有多大?窗口改成 63 天有何变化?由此评论 Fu(2009)等人为什么批评一个月窗口。
import numpy as np
import pandas as pd

rng = np.random.default_rng(53)
N, T = 500, 252                        # 500 只股票,12 个"月",每月 21 个交易日
F = rng.standard_normal((T, 3)) * np.array([0.010, 0.005, 0.005])  # MKT/SMB/HML 日收益
B = np.column_stack([rng.uniform(0.6, 1.4, N),
                     rng.normal(0, 0.6, N),
                     rng.normal(0, 0.6, N)])                       # 真实因子暴露
sig = rng.uniform(0.005, 0.035, N)      # 真实特质波动(日频)
z = (sig - sig.mean()) / sig.std()
alpha = -0.0005 * z                     # 植入之谜:特质波动越高,日均 alpha 越低
R = alpha + F @ B.T + rng.standard_normal((T, N)) * sig            # T x N 日超额收益
提示

np.linalg.lstsq(X, Y)Y 可以是 D×N 矩阵——一次解出全部股票的回归系数(4×N)。残差矩阵为 Y - X @ coef,按列求平方和除以 (D−4) 再开方。滚动部分用切片 slice(m*21, (m+1)*21);月收益可简化为日收益求和。价差的 t 值 = 11 个月价差均值 ÷(价差标准差 / $\sqrt{11}$)。

参考答案
def ivol(R_win, F_win):
    D = len(F_win)
    X = np.column_stack([np.ones(D), F_win])            # D x 4
    coef, *_ = np.linalg.lstsq(X, R_win, rcond=None)    # 4 x N:一次解 500 个回归
    resid = R_win - X @ coef
    return np.sqrt((resid ** 2).sum(axis=0) / (D - X.shape[1]))

# --- (2) 逐月滚动五分组 ---
rows = []
for m in range(11):                     # 第 m 月估计,第 m+1 月持有
    est  = slice(m * 21, (m + 1) * 21)
    hold = slice((m + 1) * 21, (m + 2) * 21)
    iv  = ivol(R[est], F[est])
    ret = R[hold].sum(axis=0)           # 简化:日收益求和作月收益
    grp = pd.qcut(iv, 5, labels=False)  # 0 = 最低 IVOL ... 4 = 最高 IVOL
    rows.append(pd.Series(ret).groupby(grp).mean())
tab = pd.DataFrame(rows)                # 11 个月 x 5 组
print("各 IVOL 组月均收益(Q1 最低 ... Q5 最高):")
print(tab.mean().map(lambda v: f"{v:+.2%}"))

spread = tab[0] - tab[4]                # 低 IVOL - 高 IVOL
t = spread.mean() / (spread.std(ddof=1) / np.sqrt(len(spread)))
print(f"低-高价差 = {spread.mean():+.2%}/月, t = {t:.2f}")

# --- (3) 估计噪声 ---
def rank_corr(a, b):
    ra, rb = pd.Series(a).rank(), pd.Series(b).rank()
    return np.corrcoef(ra, rb)[0, 1]

print("21 天窗口与真实 sig 的秩相关:", round(rank_corr(ivol(R[:21],  F[:21]),  sig), 3))
print("63 天窗口与真实 sig 的秩相关:", round(rank_corr(ivol(R[:63],  F[:63]),  sig), 3))

典型输出:五组月均收益从 Q1 到 Q5 大致单调下降,低-高价差约 +2%~3%/月,t 值在 5 以上——植入的负相关被完整恢复。秩相关方面,21 天窗口约 0.9、63 天窗口更接近 1:一个月窗口只有 21 个观测、却要估 4 个参数,残差标准差本身噪声不小(相对误差约 $1/\sqrt{2(D-4)}$,即约 17%)。这正是 Fu(2009)一派批评的入口:用如此嘈杂的滞后值当"预期 IVOL",测的可能是短期冲击而非风险水平——他改用 EGARCH 估计条件波动后符号就翻了。方法细节能翻转结论,这是异象研究的常态。

练习 5.3 FAR 策略回测框架与前视偏差排雷 设计题

为"基本面锚定反转"策略设计一个月频回测框架:写出从数据输入到绩效输出的完整伪代码(数据表、每月末的处理步骤、组合构建与收益结算规则);然后指出这个流程中最容易引入前视偏差的三个环节,并给出每个环节的正确做法。

提示

顺着数据的时间戳想:财报什么时候才"可见"?同比信号需要哪两份财报都可见?排序用的价格和成交用的价格分别是哪一天的?样本池是用今天的名单还是当时的名单?

参考答案
# 输入:日行情(含停牌/涨跌停标志、复权因子的历史版本)、
#       财报数据库(必须含公告日期、且保留披露时的原始版本)、
#       股本变动记录、时点化的上市/退市/ST 名单
for 每个月末 t:
    1. 构建样本池:只用 t 时点已知的状态——
       剔除当时已退市/当日停牌/上市不满 6 个月的股票
    2. F-Score(t):取"公告日 <= t"的最新财报,
       及其上年同期财报(也要求公告日 <= t),按 9 项规则打分
    3. 反转变量:t 之前 21 个交易日的累计收益
      (用 t 时点可得的复权价格计算)
    4. 独立双重排序:反转 5 组 x F-Score 3 组 → 15 个组合
    5. 建仓与结算:按 t+1 月第一个可交易日的价格成交,
       剔除 t 日涨跌停/停牌而实际无法成交的股票;
       持有至 t+1 月末,记录等权与市值加权两口径收益
    6. 记录换手率,扣减佣金、印花税与冲击成本
输出:FAR / FUR / 传统反转的净值曲线、
      Newey-West t 值、分年度与分市值稳健性检验

三个最危险的前视环节:

① 财报时点错配。把报告期(如 12-31)当成可用时点,而年报实际在次年三四月才公告——信号提前了几个月。同比信号还要求上年同期财报在当时也已公告;若数据库只保留追溯重述后的最新版本,用的更是"未来修正过"的数字。正确做法:一律按公告日之后可用,保留披露时点的原始快照(point-in-time 数据库)。

② 排序价格与成交价格混用。用 t 月末收盘价算完反转信号,又假设按同一收盘价建仓——对反转策略尤其致命,因为反转收益的一部分恰好发生在随后的开盘;涨跌停和停牌股票在回测里"顺利成交"同样虚增收益(跌停的输家往往次日继续跌,你根本买不进)。正确做法:信号在 t 日收盘确定,成交用 t+1 日及以后的可成交价格,并按交易状态过滤。

③ 样本池的事后名单。用今天的上市名单/指数成分回溯历史(幸存者偏差:退市的差公司被悄悄删掉),或用"后来被 ST"的信息提前剔除股票,或用当前的行业分类、复权因子回填历史。正确做法:样本池、分类、复权全部时点化。

这三处的共同特征:偏差方向几乎总是高估策略收益,且对高换手、依赖财务数据的策略(正如 FAR)杀伤最大。

练习 5.4 把套利不对称性的逻辑链写完整 简答题

有人质疑:"做空难只能解释高估的股票跌得慢,凭什么能解释'高 IVOL 低收益'这个截面现象?"请从错误定价的产生写起,把套利不对称性解释 IVOL 之谜的完整逻辑链补全,并给出至少三条这个理论的可检验含义(即:如果理论为真,数据里还应该看到什么)。

参考答案

完整链条分六步:

(1) 错价的产生。噪声交易者与情绪使价格随机偏离内在价值,高估与低估两个方向都有。

(2) 纠错靠套利,而套利有成本。套利者修正错价前必须扛住中途波动。系统性波动可用指数对冲,特质性波动无法对冲,是套利者实打实的持有风险。所以 IVOL 越高,套利越不充分,存留的错价幅度越大——IVOL 与 |错价| 正相关。注意这一步只决定错价的大小,不决定方向。

(3) 方向由错价符号决定。被低估的股票,存留错价是未来的上涨空间:低估组内 IVOL 越高 → 未来收益越高(正相关)。被高估的股票,存留错价是未来的下跌空间:高估组内 IVOL 越高 → 未来收益越低(负相关)。到这一步为止,两侧对称,截面平均后应互相抵消——还推不出"之谜"。

(4) 不对称性登场。买入低估股票无门槛,做空高估股票受券源、费用、逼空风险、机构章程约束。于是低估侧纠错充分、存留错价小,高估侧纠错不充分、存留错价大:高估侧的负相关比低估侧的正相关更陡

(5) 聚合。无条件的截面关系是两侧的平均,陡的一侧胜出——全市场表现为"高 IVOL 低收益"。质疑者漏掉的正是第 (3)(4) 步的组合:做空难不是直接解释截面斜率,而是通过"让负相关一侧更陡"打破对称。

(6) 因此之谜不是风险定价现象,而是错误定价 × 套利限制 × 做空约束的合成表象。

可检验含义(任三条):① 按错误定价分组后,负相关应集中在最被高估的组,低估组内应转为正相关(美股成立;A 股高估侧成立、低估侧不完整);② 套利限制越大的股票(机构持股低、流动性差)IVOL 异象越强;③ 投资者情绪高涨期(高估更普遍、做空更难)异象更显著,低迷期减弱乃至消失;④ 做空约束放松的自然实验(如融券标的扩容)后,高估侧的负相关应减弱;⑤ IVOL 异象的收益应主要来自空头端而非多头端。

练习 5.5 F-Score 的收益:风险补偿还是错误定价? 简答题

高 F-Score 组合跑赢低 F-Score 组合,可以有两种解释:高分股票承担了某种系统性风险(风险补偿),或市场没看懂财报(错误定价)。请设计两个能区分这两种解释的检验,写清每个检验在两种假说下分别预期看到什么结果;最后说明为什么无论做多少检验,都不可能把两种解释"彻底"分开。

参考答案

检验一:超额收益的时间分布。风险补偿是持有风险的报酬,应随持有时间均匀累积,与信息事件无关;错误定价的纠正则需要"真相大白"的时刻,收益应集中在随后的业绩公告窗口——市场在公告日发现自己错了。操作:计算高-低 F-Score 组合年度收益中,落在各次公告窗口(如公告日 ±2 天)内的比例;再检验分析师预测误差能否被 F-Score 预测(若市场预期正确,误差应不可预测)。Piotroski(2000)与 Piotroski and So(2012)的证据都指向公告集中与可预测误差——支持错误定价。

检验二:风险暴露与"坏时候"的表现。风险补偿假说要求高收益伴随更高的风险承担:高 F-Score 组合应在某种坏状态(衰退、危机、流动性枯竭)表现系统性更差。但 F-Score 的构造恰恰筛选财务更健康、困境风险更低的公司。操作:对高-低组合做多因子回归看载荷方向;比较危机期与正常期的相对表现;检验组合收益与困境代理变量(信用利差变化等)的协方差。若发现"更高收益 + 更低或相近的风险暴露 + 坏时候不更差",风险故事无法自洽;若高分组在坏时候明显更惨,则风险解释有据。辅助的第三把刀:横截面异质性——错误定价预言效应集中在套利限制大、信息环境差的股票(小市值、低机构持股、低分析师覆盖),风险溢价则不应依赖这些变量。

为什么分不彻底:联合假说问题(第 1 章)。判定"错误定价"必须先假定一个正确的定价模型来算"应得收益";任何检验结果都同时受"市场是否有效"和"模型是否正确"两个假设支配。风险派永远可以主张存在一个未被纳入的状态变量让高 F-Score 股票在某种未观测的坏状态更危险。检验能做的是不断压缩某一方解释的生存空间,而非给出数学意义上的判决。

练习 5.6 预期差策略在低覆盖小盘股上的困境 简答题

预期差策略需要同时度量"市场预期"和"基本面预期"。在分析师覆盖很少甚至为零的小盘股上,这个策略会遇到哪些问题?逐条分析问题的来源,并说明 Zhu et al.(2019)用 F-Score 替代分析师数据的做法解决了其中哪些、没解决哪些。

参考答案

问题一:预期的度量失真。依赖分析师的方案(一致预期、预期修正)在低覆盖股票上要么缺失、要么由一两位分析师构成——噪声大、更新慢。更隐蔽的是选择偏差:小盘股的覆盖是被"选中"的,券商发起覆盖往往伴随看多立场,存量预期系统性偏乐观;用这种预期算出的"预期差"分不清是市场错了还是数据脏了。

问题二:修正缺少催化剂。预期差赚的是"修正"的钱,而修正需要信息事件触发。低覆盖股票信息传播慢(本章引用的 Hong et al. 2000 正是讲小盘股的坏消息扩散更慢),预期差可能长期不收敛:错价更大,但兑现更慢、路径更颠簸,资金成本与中途风险随之上升——机会与陷阱同源。

问题三:可执行性。小盘股流动性差、冲击成本高;做空端在 A 股基本不可得(融券券源集中在大盘股),策略只剩多头一半;A 股小盘还叠加壳价值与题材炒作,价格中"基本面锚"的占比本来就低,锚定逻辑被稀释。

F-Score 替代解决了什么:覆盖问题——财报全市场强制披露,基本面预期的度量不再依赖分析师,选择偏差和缺失问题消失;这正是 Zhu et al.(2019)指出式 (5.1) 第二个缺陷后的对策。没解决什么:市场预期端仍要靠价格类变量(BM、过去收益)代理,其在小盘股中被流动性与炒作污染的问题依旧;修正慢、执行难、做空缺位这些约束也一个都没少。所以低覆盖小盘股上的预期差策略,纸面 α 往往更大,可兑现 α 未必更多——两者的差额正是套利限制的价格。