📘 本章重点
- 理解移动平均线的计算方法(简单移动平均线SMA vs 指数移动平均线EMA)
- 掌握双均线金叉/死叉的入场信号生成逻辑
- 学会设计固定的止损止盈规则,避免单纯依赖均线反转信号
- 了解双均线策略在趋势行情中的优势和震荡行情中的缺陷
⚠️ 本章难点
- 区分“金叉”与“死叉”的有效性——在震荡市中频繁交叉会产生大量假信号
- 理解均线参数的敏感性:如何选择快线和慢线的周期,避免过拟合
- 掌握如何通过附加过滤器(如ADX、波动率)改进双均线策略
⏱️ 预估学习时间
- 40~60分钟
![图片[1]-双均线策略:量化投资的“Hello World”——从金叉死叉到ADX过滤器](https://www.ifisme.cn/wp-content/uploads/2026/06/一起-第一类1.png)
一、策略简述与一句话定性
一句话定性:双均线交叉策略是最简单、最经典的趋势跟踪策略,当短期均线上穿长期均线(金叉)时买入,当短期均线下穿长期均线(死叉)时卖出。它用两条移动平均线的相对位置来识别趋势的启动与反转。
双均线策略是量化投资的“Hello World”——代码不足20行,逻辑一眼看穿,但它完美展示了趋势跟踪的核心思想:
如果你写的第一个量化策略没有“印钞机幻觉”,那你一定是真的理解了量化——双均线就是那个让你第一次体验“回测很美,实盘想哭”的经典案例。
小李问:均线交叉策略这么简单,真的能赚钱吗?
老陈点评:在强趋势行情中它确实能赚钱,比如2006-2007年A股大牛市、2017年加密货币牛市。但在震荡市中,它会被来回打脸。简单不等于无效,关键在于识别何时使用它。另外,实盘交易时还需要加入止损和仓位管理,不能单纯依赖交叉信号。
老王补充:我见过有人用双均线做螺纹钢期货,配合ATR止损和仓位缩放,年化做到30%以上。但这个成绩很大程度上归功于他选择的品种和周期,以及严格的风控。双均线只是一个骨架,真正赚钱的是执行和资金管理。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 任何具有一定趋势特征的品种(股票、期货、外汇、加密货币) | 趋势越明显,效果越好;横盘市场慎用 |
| 适用周期 | 日线、4小时、1小时均可 | 短周期(15分钟以下)噪声过多,假信号频繁 |
| 参数范围 | 常用参数:(5,20)、(10,30)、(20,60)、(50,200) | 快线周期5-20,慢线周期20-200;周期越长,信号越滞后但越稳定 |
| 资金门槛 | 极低 | 可单品种交易,无需分散 |
| 不适合的市场状态 | 窄幅震荡、无明显方向的盘整(俗称“织布机行情”) | 均线频繁交叉,交易成本可能吞噬利润 |
选参直觉:快线和慢线的间距(参数差)决定了策略的敏感度。间距越小(如5/20),信号越频繁,适合短线;间距越大(如50/200),信号越少,适合长线择时。快慢线周期比通常在1:3到1:10之间。比如(5,20)的比值是1:4,适合日线级别的中短线趋势;而(50,200)比值也是1:4但绝对周期更长,适合月线级别的牛熊判断。初学者建议从(10,30)或(20,60)开始,太小的间距在震荡市中会让你怀疑人生。
适用品种举例:
- 商品期货中的铜、原油(趋势性强)
- 股票指数(沪深300、标普500)在牛市/熊市中有效
- 加密货币(比特币、以太坊)单边行情明显
失效案例:2015-2016年A股熔断后的横盘期,双均线策略频繁产生假信号,连续止损。
老陈点评:使用双均线之前,建议先用ADX或布林带宽度判断当前市场是否有趋势。例如,只有当ADX > 25时才启用该策略,否则空仓或切换为均值回归策略。
三、因子拆解与原理
3.1 移动平均线(MA)——趋势平滑因子
移动平均线是对过去N个周期收盘价的平均值,它能平滑价格波动,凸显趋势方向。
简单移动平均线(SMA):
SMA(N) = (收盘价1 + 收盘价2 + ... + 收盘价N) / N
所有数据等权重,计算简单。
指数移动平均线(EMA):
EMA(today) = 收盘价 × 系数 + EMA(yesterday) × (1-系数)
系数 = 2 / (N+1)
近期数据权重更高,对价格变化反应更灵敏。
在双均线策略中,通常使用SMA(更直观)或EMA(更敏感)。本书示例使用SMA。
3.2 金叉与死叉——趋势转变信号
- 金叉(Golden Cross):短期均线从下方上穿长期均线 → 视为上升趋势启动 → 买入做多。
- 死叉(Death Cross):短期均线从上方下穿长期均线 → 视为下降趋势启动 → 卖出做空。
3.3 因子的优缺点
| 优点 | 缺点 |
|---|---|
| 逻辑极其简单,易于理解和编程 | 严重滞后:均线是价格的平均,信号出现在趋势确立之后,可能错失初期利润(均线就像看后视镜开车——等它告诉你方向变了,你可能已经撞上护栏了。但趋势跟踪的本质就是“承认滞后,依靠大行情赚回来”。) |
| 适用于任何品种和周期 | 在震荡市中频繁交叉,产生大量假信号,导致连续亏损 |
| 参数少(仅两个),不易过拟合 | 无止损机制:单纯依赖死叉出场,可能在趋势反转时回吐大部分利润 |
老王补充:双均线最大的问题是没有明确的止损。很多人用死叉离场,但死叉出现时往往已经回撤很大。我建议额外加一个固定比例止损(比如-5%)或者ATR移动止损,保护已有利润。
3.4 互补设计
- 与波动率过滤器结合:如布林带带宽或ATR,只在波动率扩张时启用。
- 与趋势强度指标结合:如ADX > 25才交易,避免震荡市。
- 与均线斜率结合:仅当短期均线斜率大于某个阈值时才开仓,过滤掉平缓交叉。
四、仓位、买卖点与风险管理
4.1 入场信号
| 方向 | 触发条件 | 说明 |
|---|---|---|
| 做多(买入) | 短期均线(如5日SMA)从下方上穿长期均线(如20日SMA) | 金叉出现后,当日收盘或次日开盘买入 |
| 做空(卖出/做空) | 短期均线从上方下穿长期均线 | 死叉出现后,做空(或在只允许做多的市场平仓) |
执行细节:为了避免盘中假突破,建议使用收盘价确认。即:如果当日收盘时均线已经交叉,则次日开盘以市价执行交易。
4.2 仓位管理
由于双均线策略简单,仓位管理也应保持简单:
- 固定仓位法:每笔交易投入固定比例资金(如总资金的10%~20%)。
- 等额仓位法:每次交易买入固定数量的合约或股数。
- 风险比例法:根据ATR或历史波动率调整仓位,使每笔风险相等。
示例:账户10万元,每次使用20%仓位,即2万元。若股票价格为10元,则买入2000股。
老陈点评:如果你同时交易多个品种,建议使用等风险仓位——每个品种的波动率不同,应使每个品种对整体组合的预期风险贡献相等。
风险提示:切记,双均线在震荡市中的连续亏损会对心理造成巨大压力。建议先用模拟盘体验三个月,感受一下“金叉买入就跌,死叉卖出就涨”的绝望,再决定是否实盘。
4.3 止损设置
单纯依赖死叉止损风险较大,建议增加固定止损或动态止损:
| 止损类型 | 设定方法 | 适用场景 |
|---|---|---|
| 固定比例止损 | 入场价下方5%(做多)或上方5%(做空) | 适用性强,简单有效 |
| ATR倍数止损 | 入场价 ± 2×ATR | 自适应波动率,适合高波动品种 |
| 移动止损 | 价格每向有利方向移动1倍ATR,止损线上移0.5倍ATR | 保护利润,适合趋势跟踪 |
做空场景举例:若在10元做空,止损5%意味着价格涨到10.5元时平仓止损;止盈10%意味着价格跌到9元时平仓止盈。逻辑与做多对称。
4.4 止盈(出场)设计
除了死叉出场,可以设计主动止盈规则:
- 死叉出场:当短期均线下穿长期均线时平仓(完整跟随趋势)。
- 移动止损出场:当价格从最高点回撤达到一定幅度(如5%或2倍ATR)时平仓。
- 固定盈亏比止盈:如止损为5%,则止盈设为10%或15%。
推荐组合:死叉出场 + 固定比例移动止损。当趋势明显时,死叉可能太晚;当趋势突然反转时,移动止损能更快锁定利润。
4.5 策略在失效时的应对
- 当连续亏损次数超过历史最大回测值(如5次)时,暂停交易,重新评估市场状态。
- 使用ADX或布林带宽度作为过滤器:当ADX < 20(震荡市)时,暂停双均线策略,转用均值回归策略或空仓。
老王补充:我个人喜欢用“时间止损”——如果入场后10个交易日仍没有盈利,主动平仓。因为双均线捕捉的是短期趋势,如果10天还没走出来,说明趋势可能失败了。
五、策略的来历、设计者与趣闻
移动平均线是最古老的技术分析工具之一。其起源可以追溯到20世纪初的华尔街,当时交易员手绘价格图表,用肉眼画出“趋势线”。1940年代,随着计算机的出现,移动平均线的计算变得自动化。
双均线交叉的具体发明者虽难考证,但公认的趋势跟踪先驱Richard Donchian在20世纪50年代就使用了“4周均线与1周均线”的交叉系统,并在他每周发布的市场简报中推广。可以说,Donchian是双均线策略的“祖师爷”,他的思想也直接影响了后来的海龟交易法则。
趣闻:被誉为“华尔街教父”的本杰明·格雷厄姆曾讽刺技术分析:“用过去的价格预测未来,就像用后视镜开车。”但随后几十年,无数交易员用均线系统赚了钱。这恰恰说明:技术指标的有效性不在于它能预测未来,而在于它能提供一致性的交易规则,帮助交易员克服情绪。
另一个有趣的事实:2008年金融危机期间,一个简单的双均线策略(50日SMA vs 200日SMA)在标普500指数上的表现远优于买入持有策略——它在2008年3月前后就发出了离场信号(死叉),大幅规避了后续超过40%的跌幅。这一现象被Mebane Faber在《The Ivy Portfolio》中详细记录,后来也成为Faber战术资产配置的基础。
匿名小故事:
2018年我有个朋友用双均线(20,60)做螺纹钢期货,前三个月震荡市亏了15%,他一怒之下把参数改成(5,10),结果更惨。后来他老老实实加了ADX过滤器和ATR止损,年化做到了22%。这个故事告诉我们:策略改进不是改参数,而是加风控。
老陈点评:这个案例说明,简单的趋势跟踪策略在极端行情中具有巨大的避险价值。不要因为它简单就轻视它。双均线的最大意义不是提高收益,而是控制回撤。
老王补充:我在实盘中用过这个“50/200日线大法”做股指择时。过去20年,它确实能避开大部分熊市,但也会在震荡市中频繁进出。如果你有耐心和纪律,它是个非常稳健的长期策略。
六、Python回测示例
以下代码演示双均线交叉策略(SMA(5)和SMA(20))在沪深300指数上的回测。包含固定止损(5%)和固定止盈(10%),采用收盘价确认信号、次日开盘执行(代码为简化教学,实际使用收盘价判断并当日开仓,请读者根据文字描述自行调整)。
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime
# 若yfinance无法获取000300.SS,可使用akshare:import akshare as ak; df = ak.stock_zh_index_daily(symbol="sh000300")
def dual_ma_strategy(data, short_window=5, long_window=20,
stop_loss_pct=0.05, take_profit_pct=0.10):
"""
双均线交叉策略(带固定止损止盈)
参数:
data: 必须包含 'Close' 列,索引为日期
short_window: 短期均线周期
long_window: 长期均线周期
stop_loss_pct: 止损比例(如0.05表示5%)
take_profit_pct: 止盈比例(如0.10表示10%)
返回:添加了持仓和净值的DataFrame
"""
df = data.copy()
# 1. 计算均线
df['SMA_short'] = df['Close'].rolling(short_window).mean()
df['SMA_long'] = df['Close'].rolling(long_window).mean()
# 2. 生成信号(1表示持有多头,0表示空仓或持空头)
df['Signal'] = np.where(df['SMA_short'] > df['SMA_long'], 1, 0)
# Signal_change 表示信号变化(1: 买入, -1: 卖出, 0: 不变)
df['Signal_change'] = df['Signal'].diff()
# 3. 模拟交易(包含止损止盈)
df['Position'] = 0
df['Entry_Price'] = np.nan
position = 0
entry_price = 0.0
for i in range(1, len(df)):
just_closed = False # 当天是否已平仓(用于防止同一天先止损再开仓)
# 已有持仓时,先检查止损止盈
if position != 0:
if position == 1: # 做多
pnl = (df['Close'].iloc[i] - entry_price) / entry_price
else: # position == -1 做空
pnl = (entry_price - df['Close'].iloc[i]) / entry_price
# 止损或止盈触发
if pnl <= -stop_loss_pct or pnl >= take_profit_pct:
position = 0
entry_price = 0.0
just_closed = True
else:
# 未触发止损止盈,检查均线反转信号(Signal_change)
if df['Signal_change'].iloc[i] == -1 and position == 1:
position = 0
entry_price = 0.0
just_closed = True
elif df['Signal_change'].iloc[i] == 1 and position == -1:
position = 0
entry_price = 0.0
just_closed = True
# 无持仓且当天未平仓过,检查开仓信号
if position == 0 and not just_closed:
if df['Signal_change'].iloc[i] == 1:
position = 1 # 做多
entry_price = df['Close'].iloc[i]
elif df['Signal_change'].iloc[i] == -1:
position = -1 # 做空
entry_price = df['Close'].iloc[i]
df.loc[df.index[i], 'Position'] = position
if position != 0:
df.loc[df.index[i], 'Entry_Price'] = entry_price
# 4. 计算每日收益率和净值(使用前一日持仓乘以当日收益率)
df['Returns'] = df['Position'].shift(1) * (df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1)
df['Net_Value'] = (1 + df['Returns']).cumprod()
return df
if __name__ == "__main__":
# 下载沪深300指数近5年数据(若网络问题可换成 'SPY' 或 '000300.SS')
df = yf.download('000300.SS', start='2020-01-01', end='2025-01-01')
result = dual_ma_strategy(df, short_window=5, long_window=20)
print(result[['Close', 'SMA_short', 'SMA_long', 'Position', 'Net_Value']].tail(10))
回测结果简要解读(以实际运行为准):
- 在2020年3月疫情暴跌后的反弹行情中,金叉出现较早,捕获了大部分涨幅。
- 2021-2022年震荡市中,信号频繁变化,加上止损止盈,净值可能小幅回撤或持平。
- 建议读者修改参数(如(10,30)、(20,60))观察效果,并加入交易成本(0.1%手续费)重新测试。
老陈点评:上述代码的信号生成使用了收盘价判断,但实际操作中,均线交叉可能在盘中发生。为了更贴近实盘,建议使用“次日开盘价成交”,并在回测中考虑滑点(如0.01%~0.05%)。另外,止损止盈比例需要根据品种的历史波动率调整,不能一刀切。
老王补充:我建议在实盘前先做参数敏感性测试——改变快线和慢线的周期,如果收益波动巨大,说明策略不稳定,需要简化或加入过滤器。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 趋势跟踪,基于双均线交叉 |
| 适用行情 | 有明显趋势的行情(牛市或熊市) |
| 核心优势 | 逻辑极简,易于理解,可作为量化入门的第一个策略 |
| 最大风险 | 在震荡行情中反复产生假信号,导致连续止损 |
| 资金门槛 | 极低,单品种、小资金均可运行 |
| 改进方向 | 加入ADX过滤器、移动止损、多周期确认 |
双均线策略是量化投资的“入门第一课”。它不复杂,但包含了量化策略的核心要素:明确的入场规则、可回测的统计逻辑、以及需要风控支持的出场规则。掌握它之后,你将更容易理解更复杂的趋势跟踪系统(如海龟交易法则)。
老陈总结:不要因为简单就轻视双均线。很多职业CTA基金依然在使用均线组合作为核心信号之一。关键在于如何管理资金、控制回撤。记住:胜率不重要,期望值才重要。
老王总结:如果你打算实盘,我建议先用模拟盘跑三个月,感受一下连续亏损时的心理压力。双均线能赚钱,但前提是你有一颗强大的心脏。
💡 思考题
- 将均线参数改为(10,30)和(20,60),你认为在沪深300指数上,哪个组合更稳健?为什么?
- 如果只做多(不允许做空),双均线策略应该如何修改?用死叉平仓后,是否应该空仓等待下一次金叉?
- 设计一个简单的ADX过滤器:仅当ADX > 25时启用双均线策略,否则空仓。请写出伪代码。
- (展望题) 在人工智能时代,有人认为简单的技术指标策略会被机器学习模型完全替代。你同意吗?请从“数据效率”“计算资源”“可解释性”三个角度展开讨论。
八、引用/参考出处
网上内容:
- Investopedia – Golden Cross:https://www.investopedia.com/terms/g/goldencross.asp
- Investopedia – Death Cross:https://www.investopedia.com/terms/d/deathcross.asp
- 聚宽量化学院 – 双均线策略教程:https://www.joinquant.com/help
- 维基百科 – Moving average:https://en.wikipedia.org/wiki/Moving_average
图书(元信息):
- Mebane Faber, The Ivy Portfolio, Wiley, 2009.(第5章关于双均线择时的案例)
- Perry J. Kaufman, Trading Systems and Methods, 6th Ed., Wiley, 2019.(第10章移动平均线系统)





















暂无评论内容