3、经典双均线策略:金叉死叉逻辑、参数选择与实战回测
双均线策略,说白了就是量化交易里的"Hello World"。每个做量化的人,几乎都从它开始。我当年也不例外,第一次跑通回测时,看着资金曲线往上走,那叫一个兴奋。但后来发现,事情没那么简单。
今天咱们就把这个策略拆开揉碎,从逻辑到代码,从参数到评估,一次性讲透。
3.1 金叉死叉:最朴素的趋势信号
双均线策略的核心逻辑,就两句话:
- 金叉:快线上穿慢线 → 买入信号
- 死叉:快线下穿慢线 → 卖出信号
快线通常是短期均线,比如5日均线。慢线是长期均线,比如20日均线。当短期价格趋势向上突破长期趋势,说明多头力量占优,该进场了。反过来,短期趋势跌破长期趋势,说明空头来了,该跑路。
嗯,这里要注意一个细节:金叉死叉的判断,不是看当前价格,而是看两条均线的相对位置。我见过不少新手直接拿价格和均线比,那其实是另一种策略了。
核心公式:
- 金叉条件:MA_fast[t-1] ≤ MA_slow[t-1] 且 MA_fast[t] > MA_slow[t]
- 死叉条件:MA_fast[t-1] ≥ MA_slow[t-1] 且 MA_fast[t] < MA_slow[t]
为什么会这样判断?因为我们要的是"穿越"那一刻,而不是单纯的大小关系。如果只比大小,那只要快线一直在慢线上方,就会一直持有,根本不会产生新的交易信号。
3.2 参数选择:快线慢线怎么配?
参数选择是双均线策略的灵魂。快线和慢线的周期组合,直接决定了策略的灵敏度。
我个人习惯把参数分为三类:
| 类型 | 快线周期 | 慢线周期 | 特点 |
|---|---|---|---|
| 短线型 | 5 | 10-15 | 信号频繁,适合震荡市?其实更容易被反复打脸 |
| 中线型 | 10-20 | 30-60 | 平衡型,我大部分回测都用这个范围 |
| 长线型 | 20-50 | 100-200 | 信号少,但胜率高,适合大趋势 |
我在项目中遇到过一件事:用5日和20日均线跑螺纹钢期货,回测结果漂亮得很。但一上实盘,连续三次金叉都被假突破坑了。后来我改成10日和30日,虽然信号少了,但胜率明显提升。
所以参数选择没有标准答案。你想想看,不同品种、不同时间周期,最优参数肯定不一样。这就是为什么后面要讲参数优化。
避坑指南:我曾经犯过一个低级错误——快线周期大于慢线周期。代码跑出来全是反向信号,亏得我怀疑人生。后来检查才发现参数写反了。嗯,这种低级错误,谁还没犯过呢?
3.3 实战回测框架搭建
回测框架,说白了就是模拟历史交易。我习惯用Python写,结构清晰,调试方便。下面是一个极简版本:
import pandas as pd
import numpy as np
def dual_ma_backtest(data, fast=5, slow=20):
"""
双均线回测框架
data: DataFrame,必须包含'close'列
fast: 快线周期
slow: 慢线周期
"""
df = data.copy()
# 计算均线
df['ma_fast'] = df['close'].rolling(window=fast).mean()
df['ma_slow'] = df['close'].rolling(window=slow).mean()
# 生成信号
df['signal'] = 0
df.loc[df['ma_fast'] > df['ma_slow'], 'signal'] = 1
df.loc[df['ma_fast'] <= df['ma_slow'], 'signal'] = -1
# 捕捉金叉死叉(信号变化点)
df['position'] = df['signal'].diff()
# 计算每日收益率
df['return'] = df['close'].pct_change()
df['strategy_return'] = df['return'] * df['signal'].shift(1)
# 累计净值
df['equity'] = (1 + df['strategy_return']).cumprod()
return df
这个框架虽然简单,但核心逻辑都有了。实际使用时,你还需要考虑手续费、滑点、交易成本。我一般会在策略收益率上扣掉万分之三到万分之五,这样更接近实盘。
注意:上面的代码里,我用的是 signal.shift(1)。为什么要shift?因为当天的信号要等到收盘后才能确认,实际交易是第二天开盘执行。如果不shift,就是"未来函数",回测结果会虚高。我见过有人因为这个细节,回测年化30%,实盘直接腰斩。
3.4 绩效评估指标:别只看收益率
回测跑完了,怎么判断策略好不好?很多人只看总收益率,其实远远不够。我一般看四个核心指标:
3.4.1 年化收益率
这个不用多说,但要注意:回测周期不同,年化收益率差异很大。我习惯用3-5年的数据,太短没有统计意义,太长又可能包含市场风格转换。
3.4.2 夏普比率
夏普比率衡量的是"每承担一单位风险,能获得多少超额收益"。公式是:
夏普比率 = (策略年化收益率 - 无风险利率) / 策略年化波动率
一般来说,夏普比率大于1算及格,大于2算优秀。我见过最夸张的一个策略,夏普做到了3.5,但后来发现是参数过拟合了。
3.4.3 最大回撤
最大回撤是策略从最高点到最低点的最大跌幅。这个指标太重要了。你想想看,一个策略年化50%,但最大回撤40%,你敢上仓位吗?反正我不敢。
我个人习惯:最大回撤控制在20%以内,最好在15%以下。超过这个数,心理压力太大,容易在底部割肉。
3.4.4 胜率与盈亏比
这两个指标要一起看。胜率高但盈亏比低,说明赚小钱亏大钱,不划算。胜率低但盈亏比高,比如胜率30%,但赚一次够亏三次,也可以接受。
我的评估标准:
- 年化收益率 > 15%
- 夏普比率 > 1.2
- 最大回撤 < 20%
- 盈亏比 > 2:1
四个条件同时满足,我才会考虑实盘。
3.5 知识体系总览
下面这张图,把双均线策略的核心逻辑串起来了。从数据输入到信号生成,再到回测和评估,每一步都环环相扣。
这张图把整个流程串起来了。从数据输入开始,到计算均线、生成信号、执行回测,最后评估绩效。每一步都有坑,每一步都需要仔细打磨。
最后说一句:双均线策略虽然简单,但它是理解趋势跟踪的基石。我建议你亲手写一遍回测代码,调一调参数,感受一下不同参数组合对结果的影响。纸上得来终觉浅,绝知此事要躬行。