3. 移动平均线策略:双均线金叉死叉策略,参数(快线、慢线周期)的优化

双均线策略,说白了就是两条不同周期的移动平均线打架。快线上穿慢线,我们叫它「金叉」,做多;快线下穿慢线,叫「死叉」,做空。听起来简单吧?但参数怎么选,才是真正的学问。

我个人习惯把这个问题拆成三步:参数空间定义 → 回测评估 → 稳健性检验。咱们一步步来。

3.1 参数空间:别瞎蒙,要有边界

快线周期通常取 5~50 日,慢线周期取 20~200 日。但有个硬约束:慢线必须大于快线,否则逻辑就乱了。

我建议用网格搜索,步长可以设 5 或 10。比如快线从 5 到 50,步长 5;慢线从 20 到 200,步长 10。这样一共也就 10×19=190 组参数,算起来很快。

核心原则:参数范围要覆盖「过拟合区」和「欠拟合区」。太短的周期容易频繁交易,太长的周期反应迟钝。

3.2 回测评估:别只看收益率

很多人一上来就看总收益率,这是大忌。我见过一个策略,回测年化 80%,但最大回撤 60%,你敢用吗?

我一般用这几个指标综合评估:

指标 说明 我的经验阈值
年化收益率 年化后的平均收益 > 15%
最大回撤 账户从峰值跌落的幅度 < 20%
夏普比率 风险调整后收益 > 1.5
胜率 盈利交易占比 > 40%
交易次数 总交易笔数 > 50 次(统计意义)

嗯,这里要注意:交易次数太少,统计结果不可信。我曾经优化出一组参数,年化 30%,但只交易了 12 次。后来实盘发现,那纯粹是运气。

3.3 代码实现:用 Python 跑一遍

下面是我常用的优化框架,你直接拿去改参数就行:

import pandas as pd
import numpy as np

def backtest_ma(data, fast, slow):
    # 计算均线
    data['ma_fast'] = data['close'].rolling(fast).mean()
    data['ma_slow'] = data['close'].rolling(slow).mean()
    
    # 生成信号
    data['signal'] = 0
    data.loc[data['ma_fast'] > data['ma_slow'], 'signal'] = 1
    data.loc[data['ma_fast'] < data['ma_slow'], 'signal'] = -1
    
    # 计算每日收益
    data['return'] = data['close'].pct_change()
    data['strategy_return'] = data['signal'].shift(1) * data['return']
    
    # 累计收益
    data['cum_return'] = (1 + data['strategy_return']).cumprod()
    
    # 计算指标
    total_return = data['cum_return'].iloc[-1] - 1
    max_drawdown = (data['cum_return'] / data['cum_return'].cummax() - 1).min()
    
    return total_return, max_drawdown

# 网格搜索
results = []
for fast in range(5, 55, 5):
    for slow in range(20, 205, 10):
        if slow <= fast:
            continue
        ret, dd = backtest_ma(data, fast, slow)
        results.append([fast, slow, ret, dd])

# 转成 DataFrame 方便分析
df_results = pd.DataFrame(results, columns=['fast', 'slow', 'return', 'drawdown'])
小技巧:我习惯把结果画成热力图,一眼就能看出哪些参数区域表现好。颜色越深,收益越高。

3.4 稳健性检验:别被「最优参数」骗了

找到一组最优参数后,别急着高兴。我踩过最大的坑就是:最优参数往往只在特定行情下有效

怎么做稳健性检验?我推荐三种方法:

  1. 滚动窗口测试:把数据分成 3~5 段,每段单独优化,看参数是否稳定。
  2. 参数敏感性分析:在最优参数附近微调,比如快线 ±2,慢线 ±5,看收益变化大不大。
  3. 蒙特卡洛模拟:随机打乱交易顺序,模拟 1000 次,看收益分布是否显著为正。
警告:如果最优参数周围 10% 的范围内,收益就大幅下降,那这个策略基本是废的。我曾经优化出一组 (12, 48) 的参数,回测年化 25%,但改成 (14, 50) 就变成 8%——果断放弃。

3.5 知识体系:一张图看懂

下面这张图总结了双均线参数优化的完整流程,我建议你保存下来,每次做优化时对照着看:

双均线参数优化流程 步骤1:定义参数空间 快线:5~50,步长5 慢线:20~200,步长10 步骤2:回测评估 年化收益、最大回撤 夏普比率、胜率 步骤3:稳健性检验 滚动窗口测试 参数敏感性分析 不满足条件则返回调整 是否通过 稳健性? 输出最优参数 (fast, slow) 否,返回步骤1 核心思想:不要追求「最优」,要追求「稳健」 💡 我的经验 参数优化不是一次性的工作。市场在变,参数也要跟着调整。 我每季度会重新跑一次优化,看看之前的参数是否还适用。

3.6 避坑指南:我踩过的三个坑

最后分享几个实战教训,都是真金白银换来的:

  • 别用未来数据:计算均线时,一定要用当天的收盘价,不能包含未来信息。我见过有人用未来数据回测,年化 100%,实盘直接亏光。
  • 注意交易成本:双均线策略交易频率不低,如果忽略手续费和滑点,回测结果会虚高 30%~50%。
  • 别过度优化:参数越精确,越容易过拟合。我一般选一个「参数高原」上的点,而不是尖峰上的点。
总结一句话:双均线参数优化的核心不是找到「最好」的参数,而是找到「最不容易变坏」的参数。稳健性比收益率重要得多。
专注资料整理