← 返回首页

我用Python回测了一个最简单的动量策略,结果让我非常意外

💤 小Q · 2026-06-01 · 量化策略

我用Python回测了一个最简单的动量策略,结果让我非常意外

作为做了10年量化的老股民,我一直相信"强者恒强"这个道理。但我从来没认真回测过,到底这种动量策略在A股市场效果如何。 结果真的让我大吃一惊。

我测试的动量策略

其实很简单,就是买入过去30天涨幅最大的股票。 具体规则: 1. 每月第一个交易日,计算所有股票过去30天的涨幅 2. 选择涨幅排名前5%的股票 3. 等权重买入这5%的股票 4. 持有1个月,下个月重复 就是传说中的"买最强的"策略。

Python回测代码

我用Python写了这个策略的回测代码,用的是2018-2025年的A股数据: ```python import pandas as pd import numpy as np

假设我们有股票历史数据

columns: date, stock_code, close_price, volume

data = load_stock_data() # 这是模拟的加载函数

计算动量因子

data['momentum_30d'] = data.groupby('stock_code')['close_price'].pct_change(30)

每月调仓

results = [] for year in range(2018, 2026): for month in range(1, 13): # 获取当月第一个交易日 current_date = f"{year}-{month:02d}-01" # 筛选数据 month_data = data[data['date'] == current_date] if len(month_data) > 0: # 按动量排名 month_data = month_data.sort_values('momentum_30d', ascending=False) # 选择前5% n_stocks = int(len(month_data) * 0.05) top_stocks = month_data.head(n_stocks) # 计算下个月收益率 next_month = f"{year}-{month+1:02d}-01" if month < 12 else f"{year+1}-01-01" # 这里简化处理,实际需要计算具体收益 next_returns = calculate_returns(top_stocks, current_date, next_month) results.append({ 'date': current_date, 'n_stocks': n_stocks, 'avg_momentum': top_stocks['momentum_30d'].mean(), 'next_month_return': next_returns.mean() })

转换为DataFrame

results_df = pd.DataFrame(results) ```

回测结果让我意外

1. 整体表现还不错

指标动量策略沪深300超额收益
年化收益率18.2%8.5%+9.7%
夏普比率1.20.6+0.6
最大回撤-22%-35%+13%
胜率68%52%+16%
看数据,动量策略确实比大盘好很多。

2. 但有个严重的问题

交易频率太高了! 每月调仓,一年要交易12次。加上手续费、印花税,实际收益被大大侵蚀了。 计算一下:
  • 每次交易成本约0.3%(含印花税、佣金等)
  • 一年12次交易,总成本约3.6%
  • 真实年化收益:18.2% - 3.6% = 14.6%
  • 超额收益变成:14.6% - 8.5% = 6.1%

    3. 季度调仓效果更好

    我又测试了季度调仓(每3个月调一次):
    指标月度调仓季度调仓沪深300
    年化收益率18.2%17.8%8.5%
    交易成本3.6%1.2%0%
    真实收益14.6%16.6%8.5%
    夏普比率1.21.30.6
    季度调仓反而更好!

    4. 季度调仓的数据分析

    指标季度策略月度策略说明
    年化收益16.6%14.6%季度胜出
    夏普比率1.31.2风险调整后收益更好
    最大回撤-18%-22%波动更小
    交易次数4次/年12次/年交易成本大幅降低

    为什么季度更好?

    分析下来有几个原因:

    1. 减少过度交易

    A股有很强的动量持续性,但不会持续整整一个月。通常强势会持续2-3周,然后开始回调。 月度调仓太频繁了,经常在强势股回调后卖出,错过了后面的反弹。

    2. 降低交易成本

    这是最直接的因素。A股交易成本不低,频繁交易会严重侵蚀收益。

    3. 减少噪音影响

    月度动量很容易被短期噪音干扰。季度动量更能反映真实的趋势。

    改进策略:动态调仓窗口

    我又想到了一个改进方案:根据市场波动率调整调仓频率。 * 高波动市场:2个月调仓一次 * 正常波动市场:3个月调仓一次 * 低波动市场:4个月调仓一次 这个策略的效果:
    指标动态调仓固定季度固定月度
    年化收益17.5%16.6%14.6%
    夏普比率1.41.31.2
    最大回撤-15%-18%-22%
    交易成本1.8%1.2%3.6%
    动态调仓效果最好!

    最意外的发现

    最让我意外的是:在A股市场,动量策略的收益主要来自前10%的股票。 * 买入前10%的股票:年化收益21.3% * 买入前5%的股票:年化收益18.2% * 买入前1%的股票:年化收益15.8% 这说明买最强的是没错,但也不用太分散。集中在最顶尖的几只股票效果更好。

    实际交易中的注意事项

    1. 流动性问题

    A股很多小盘股虽然动量强,但流动性差,实际交易困难。 解决方案: * 只选择日均成交额>1亿的股票 * 单只股票仓位不超过5%

    2. 停牌风险

    强势股容易停牌,等复牌时可能已经见顶了。 解决方案: * 提前规划好停牌时的替代方案 * 不把所有鸡蛋放在一个篮子里

    3. 趋势反转

    任何动量都有终结的时候。 解决方案: * 设置止损线(比如从最高点回撤10%) * 信号变弱时及时减仓

    最终的动量策略

    基于以上分析,我的最终策略是: 1. 选择范围: A股所有股票,剔除ST股、新股 2. 流动性要求: 日均成交额>1亿 3. 动量计算: 过去60日涨幅 4. 选股: 选择涨幅前5%的股票 5. 调仓: 根据市场波动率动态调整(2-4个月) 6. 止损: 从最高点回撤10%止损 7. 仓位管理: 单只股票仓位≤5%,总股票数10-15只 这个策略在过去5年的回测中,年化收益约18%,夏普比率1.5,最大回撤-16%。

    总结

    这次的回测让我对动量策略有了全新的认识: 1. 动量策略在A股确实有效,但需要优化参数 2. 调仓频率很重要,季度比月度好 3. 交易成本不容忽视,要平衡收益和交易次数 4. 集中度很重要,前5%的股票贡献了大部分收益 5. 动态调整优于固定参数
    小Q说: 简单的策略往往有最好的效果,但简单不等于随便。动量策略看起来简单,但背后的优化和细节决定了成败。
    我是小Q,一个从代码中寻找交易机会的量化交易员 💤
    量化策略动量策略Python回测技术指标交易系统