halo 的技术博客

返回

引言:动量效应的发现#

动量(Momentum)是量化投资中最具代表性的异象之一。Jegadeesh和Titman在1993年的经典论文中发现,过去6-12个月表现最好的股票,在未来3-12个月会继续跑赢表现最差的股票。这一发现颠覆了有效市场假说,成为因子投资的三大支柱之一(价值、动量、质量)。

动量的理论基础#

行为金融学解释#

动量效应并非市场无效,而是投资者行为偏差的系统性和持续性体现:

  1. 反应不足(Underreaction):投资者对新信息反应迟缓,导致价格逐步调整
  2. 确认偏误(Confirmation Bias):投资者倾向于寻找支持既有观点的证据
  3. 羊群效应(Herding):机构投资者跟风操作,放大趋势
  4. 处置效应(Disposition Effect):过早卖出盈利股票、过晚止损亏损股票

风险的跨期定价#

Conrad和Kaul(1998)提出,动量收益可能源于时变的风险溢价。当公司面临持续的正面冲击时,其系统性风险(Beta)上升,要求更高的预期收益。

动量因子的构建方法#

收益计算窗口#

动量因子的核心是过去N个月的累计收益,但需剔除最近K个月以避免反转效应:

# 经典动量因子计算(Jegadeesh-Titman方法)
def calculate_momentum(price_data, lookback=12, skip=1):
    """
    price_data: DataFrame, columns=['date', 'stock', 'close']
    lookback: 回看期(月)
    skip: 剔除期(月),避免短期反转
    """
    # 计算过去12个月收益,剔除最近1个月
    momentum_score = price_data.groupby('stock')['close'].apply(
        lambda x: x.shift(skip).pct_change(lookback - skip)
    )
    return momentum_score
python

参数选择

  • 回看期:6-12个月(学术标准)
  • 剔除期:1-3个月(避免短期反转干扰)
  • 持有期:1-6个月(通常与剔除期匹配)

横截面动量 vs 时间序列动量#

横截面动量(Cross-Sectional Momentum)#

做多强势股、做空弱势股,赚取相对收益:

# 横截面动量:每月按动量评分排序,做多Top 10%,做空Bottom 10%
def cross_sectional_momentum(momentum_scores, date):
    scores_date = momentum_scores.loc[date]
    top_decile = scores_date.quantile(0.9)
    bottom_decile = scores_date.quantile(0.1)
    
    long_stocks = scores_date[scores_date >= top_decile].index
    short_stocks = scores_date[scores_date <= bottom_decile].index
    
    return long_stocks, short_stocks
python

时间序列动量(Time-Series Momentum)#

单边做多/做空,基于个股自身历史表现:

# 时间序列动量:过去收益为正则做多,为负则做空
def time_series_momentum(momentum_scores, threshold=0.0):
    signals = {}
    for stock in momentum_scores.columns:
        if momentum_scores[stock].iloc[-1] > threshold:
            signals[stock] = 1  # 做多
        elif momentum_scores[stock].iloc[-1] < -threshold:
            signals[stock] = -1  # 做空
        else:
            signals[stock] = 0  # 平仓
    return signals
python

对比

维度横截面动量时间序列动量
市场暴露市场中性和Beta中性有市场暴露
收益来源相对定价错误趋势持续性
适用性股票中性策略CTA趋势跟踪

动量因子的风险调整#

1. 剔除微盘股#

动量策略容易在流动性差的微盘股上产生虚假信号。解决方法:

  • 剔除市值后10%的股票
  • 要求日均成交额 > 1000万元

2. 控制行业暴露#

动量评分可能集中在特定行业(如2020年的新能源、2023年的AI)。解决方法:

  • 行业中性化:在每个行业内独立排序
  • 行业约束:单一行业权重不超过基准的±5%

3. 波动率缩放#

不同股票的动量信号可靠性不同。高波动股票的动量收益可能被噪音淹没。解决方法:

  • 收益/波动率(即夏普比率)替代原始收益
  • 对动量评分进行波动率倒数加权

动量与其他因子的结合#

动量 + 价值 = 价值动量(Value Momentum)#

Asness等(2013)发现,价值因子和动量因子负相关(价值陷阱vs动量崩盘)。结合两者可构建更稳健的策略:

# 价值动量综合评分
composite_score = 0.5 * value_z_score + 0.5 * momentum_z_score
python

逻辑

  • 价值股 + 正动量 = 价值修复加速(最佳买点)
  • 成长股 + 负动量 = 泡沫破裂(及时止损)

动量 + 低波 = 低风险动量(Low-Vol Momentum)#

传统动量策略波动率高,加入低波约束可改善夏普比率:

# 低风险动量:在动量Top股票中,优先选择低波动率标的
candidates = momentum_scores.nlargest(100)  # 动量Top 100
final_portfolio = candidates[volatility_scores < candidates.median()]
python

中国市场的动量效应#

A股动量特征#

与美股不同,A股动量效应较弱且不稳定,原因包括:

  1. 散户占比高:情绪化交易导致短期反转更强
  2. 涨跌停限制:阻碍价格发现,动量信号延迟
  3. 政策干预:突发政策导致趋势逆转

改进方案#

针对A股特性,可调整动量策略:

  • 缩短回看期:从12个月降至6个月(捕捉短期趋势)
  • 加入换手率过滤:高换手率股票的动量不可持续
  • 结合技术指标:MACD、RSI确认趋势强度
# A股改进版动量策略
def a_stock_momentum(price_data, turnover_data):
    # 基础动量评分
    momentum = calculate_momentum(price_data, lookback=6, skip=1)
    
    # 换手率惩罚:过去1个月换手率过高的股票降权
    turnover_penalty = turnover_data.rolling(20).mean().rank(pct=True)
    momentum_adjusted = momentum - 0.3 * turnover_penalty
    
    # 技术指标确认
    macd_signal = calculate_macd(price_data)
    final_signal = momentum_adjusted * (macd_signal > 0)
    
    return final_signal
python

实战案例:中证500动量增强#

策略设计#

  • 基准:中证500指数
  • 选股池:中证500成分股
  • 因子:12个月动量(剔除最近1个月)
  • 加权:动量评分加权
  • 调仓:每月首个交易日
  • 约束:个股权重≤5%,行业暴露≤±3%

回测结果(2015-2025)#

指标中证500动量增强超额收益
年化收益2.3%8.7%+6.4%
年化波动25.1%26.8%+1.7%
夏普比率0.090.32+0.23
最大回撤-42.3%-38.7%+3.6%
信息比率-0.58-

关键发现

  1. 动量策略在牛市中期表现最佳(趋势明确)
  2. 市场反转期容易跑输(如2018年初、2021年春节后)
  3. 加入行业中性化后,跟踪误差从8.2%降至4.5%

动量崩盘风险(Momentum Crash)#

什么是动量崩盘?#

动量策略的致命弱点是在市场急剧反转时大幅跑输。典型案例如:

  • 2009年3-5月:美股动量策略单月亏损-40%(做空价值股在政策刺激下暴涨)
  • 2020年3-4月:疫情后价值股反弹,动量策略回撤-25%

应对策略#

  1. 动态仓位管理:在市场波动率(VIX)> 30时降低杠杆
  2. 结合宏观因子:在利率上行周期,动量策略表现较差
  3. 止损机制:单个信号亏损超过10%强制平仓
# 动量崩盘保护
def momentum_crash_protection(portfolio_returns, vix_index):
    # VIX > 30时,动量策略降仓50%
    if vix_index > 30:
        portfolio_weights *= 0.5
    
    # 过去1个月回撤超过10%,停止建仓
    if portfolio_returns.rolling(20).max() - portfolio_returns < -0.10:
        portfolio_weights[:] = 0
    
    return portfolio_weights
python

总结与展望#

动量因子是市场趋势的量化表达,其收益来源于投资者行为的系统性和持续性偏差。在实际应用中,需注意:

  1. 参数敏感:回看期和剔除期的选择显著影响收益
  2. 市场依赖:在趋势明确的市场(如美股)表现更好
  3. 风险分散:与其他因子(价值、低波)结合可提升稳健性
  4. 实时监控:警惕动量崩盘风险,设置动态止损

未来研究方向:

  • 高频动量:利用日内数据捕捉更短周期的趋势
  • 文本动量:基于新闻和社交媒体的情绪趋势
  • 机器学习增强:用神经网络捕捉非线性动量模式

动量因子策略概述

动量因子策略核心逻辑:过去表现好的股票未来继续跑赢

动量与其他因子相关性

价值因子与动量因子呈负相关,结合使用可分散风险


参考文献

  1. Jegadeesh, N., & Titman, S. (1993). Returns to buying winners and selling losers: Implications for stock market efficiency. Journal of Finance.
  2. Asness, C. S., et al. (2013). Value and momentum everywhere. Journal of Finance.
  3. Daniel, K., & Moskowitz, T. J. (2016). Momentum crashes. Journal of Financial Economics.
动量因子策略:捕捉趋势力量的阿尔法
https://blog.halo26812.eu.org/blog/momentum-factor-strategy
Author halo
Published at 2026年6月13日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨