第十五章:信息与资产定价:Fama-French因子、动量因子、信息摩擦
各位,咱们今天聊点硬核的。
信息怎么变成价格的?这个问题我琢磨了十年。说实话,刚入行那会儿,我以为市场是有效的——价格已经反映了所有信息。后来做量化交易,被市场狠狠教育了几次,才明白事情没那么简单。
15.1 从CAPM到Fama-French:信息不够用了
CAPM(资本资产定价模型)是经典。它说:股票的预期收益只跟市场风险(Beta)有关。嗯,听起来很美。但我自己在回测中发现,光靠Beta根本解释不了收益差异。
举个例子。我2015年跑过一个策略,筛选低Beta的股票做多,高Beta的做空。结果呢?收益曲线跟过山车似的。为什么?因为市场里还有别的信息在驱动价格。
Fama和French两位大佬在1993年提出了三因子模型。说白了,就是加了两个额外信息维度:
- 规模因子(SMB):小市值公司比大市值公司有更高的平均收益
- 价值因子(HML):高账面市值比(价值股)比低账面市值比(成长股)收益更高
公式长这样:
E(Ri) - Rf = βi * (E(Rm) - Rf) + si * SMB + hi * HML
我个人习惯把这三个因子看成三种信息渠道:
- 市场信息(Beta)—— 整体经济环境
- 规模信息(SMB)—— 小公司的信息不对称更严重
- 价值信息(HML)—— 市场对基本面信息的过度反应或反应不足
核心观点:Fama-French三因子模型告诉我们,信息不是均匀分布的。不同股票对信息的敏感度不同,这本身就是一种信息摩擦。
15.2 动量因子:信息传递需要时间
动量因子是我最喜欢的。为什么?因为它直接挑战了有效市场假说。
动量策略很简单:买过去涨得好的股票,卖过去跌得惨的股票。持有期3-12个月。我2018年用A股数据跑过,年化超额收益大概在8%-12%之间。当然,回撤也大,2015年股灾那会儿动量策略直接崩了30%。
为什么会这样?
我个人理解是:信息传递需要时间。你想想看,一个利好消息出来,不是所有人都能立刻理解并行动。机构投资者先反应,散户后知后觉,最后才是量化程序。这个过程中,价格会慢慢消化信息,形成趋势。
动量因子的数学表达:
MOM = (Pt - Pt-12) / Pt-12
其中Pt是当前价格,Pt-12是12个月前的价格。
我曾经犯过一个错误:把动量窗口设得太短(1个月)。结果发现全是噪音,交易成本还高得吓人。后来改成6个月窗口,效果明显改善。嗯,这里要注意:动量不是越短越好。
实战技巧:动量因子在牛市中表现最好,熊市中容易崩盘。我建议搭配一个市场状态过滤器——当市场处于下跌趋势时,暂时关闭动量策略。
15.3 信息摩擦:为什么市场不是完美的
信息摩擦,说白了就是信息在传递过程中会失真、延迟、甚至被扭曲。这玩意儿在学术圈讨论了几十年,但在实战中往往被忽视。
我总结了几种常见的信息摩擦:
| 摩擦类型 | 具体表现 | 对定价的影响 |
|---|---|---|
| 信息不对称 | 内幕交易、分析师预测偏差 | 价格偏离基本面 |
| 信息处理成本 | 散户看不懂财报、机构需要分析团队 | 信息不能完全反映到价格中 |
| 行为偏差 | 过度自信、锚定效应、羊群效应 | 价格出现可预测的偏差 |
| 制度摩擦 | 涨跌停板、T+1交易、做空限制 | 信息不能及时释放 |
举个例子。2019年我研究过A股的涨停板制度。发现一个有趣的现象:涨停后第二天,股票往往继续上涨。为什么?因为涨停板限制了信息在当天的释放,部分信息被延迟到第二天。这就是制度摩擦导致的定价偏差。
注意:信息摩擦不是坏事。对量化交易员来说,摩擦意味着套利机会。但前提是你能识别并量化这些摩擦。
15.4 知识体系:信息如何驱动价格
下面这张图是我自己画的,把本章的核心逻辑串起来了:
这张图想表达什么?信息从源头到价格,中间要经过摩擦层和因子模型层。摩擦层决定了信息传递的效率,因子模型层则帮我们量化信息对价格的影响。反馈回路说明价格本身也会影响信息的产生——比如价格上涨会吸引更多关注,产生新的信息。
15.5 实战:用Python实现Fama-French因子
光说不练假把式。我给你们看一段代码,是我之前做研究时用的:
import pandas as pd
import numpy as np
import statsmodels.api as sm
def fama_french_regression(stock_returns, market_returns, smb, hml):
"""
计算Fama-French三因子模型的因子载荷
"""
# 准备数据
X = pd.DataFrame({
'market': market_returns,
'smb': smb,
'hml': hml
})
X = sm.add_constant(X)
y = stock_returns
# 回归
model = sm.OLS(y, X).fit()
return model.params # 返回alpha, beta, s, h
# 使用示例
# params = fama_french_regression(stock_ret, mkt_ret, smb_data, hml_data)
# print(f"Alpha: {params['const']:.4f}")
# print(f"Beta: {params['market']:.4f}")
# print(f"SMB: {params['smb']:.4f}")
# print(f"HML: {params['hml']:.4f}")
这段代码干的事很简单:把股票收益分解成市场、规模、价值三个部分。如果Alpha显著不为零,说明这个股票有超额收益——可能是信息摩擦导致的定价偏差。
关键点:因子载荷(Beta、SMB、HML)反映了股票对不同信息的敏感度。比如SMB载荷高的股票,对小公司的信息更敏感。这本身就是一种信息结构。
15.6 避坑指南
最后,分享几个我踩过的坑:
- 因子不是越多越好——我曾经用20个因子做多因子模型,结果过拟合得一塌糊涂。记住奥卡姆剃刀:简单的模型往往更稳健。
- 动量因子有周期性——2016-2018年动量策略表现极差,很多人放弃了。但2019年又回来了。做量化要有耐心,别因为短期回撤就否定一个因子。
- 信息摩擦会变化——2015年股灾后,监管层加强了信息披露要求,信息摩擦降低了。你的模型需要定期更新。
- 别忽视交易成本——动量策略换手率高,交易成本能吃掉一半收益。我建议用期货或ETF来降低摩擦成本。
好了,这一章就到这儿。信息与资产定价的关系,说白了就是一句话:市场不是完美的,信息不是免费的,而我们的工作就是找到这些不完美中的规律。