第十五章:信息与资产定价: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 知识体系:信息如何驱动价格

下面这张图是我自己画的,把本章的核心逻辑串起来了:

信息驱动价格变动的核心逻辑 信息源 信息摩擦层 不对称 | 处理成本 | 行为偏差 | 制度限制 因子模型层 Fama-French三因子 | 动量因子 | 其他因子 资产价格 反馈回路

这张图想表达什么?信息从源头到价格,中间要经过摩擦层和因子模型层。摩擦层决定了信息传递的效率,因子模型层则帮我们量化信息对价格的影响。反馈回路说明价格本身也会影响信息的产生——比如价格上涨会吸引更多关注,产生新的信息。

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来降低摩擦成本。

好了,这一章就到这儿。信息与资产定价的关系,说白了就是一句话:市场不是完美的,信息不是免费的,而我们的工作就是找到这些不完美中的规律。

无相订单流研究社 微信Lucian808555