第一.05 双均线交叉策略

📘 本章重点

  • 理解移动平均线的计算方法(简单移动平均线SMA vs 指数移动平均线EMA)
  • 掌握双均线金叉/死叉的入场信号生成逻辑
  • 学会设计固定的止损止盈规则,避免单纯依赖均线反转信号
  • 了解双均线策略在趋势行情中的优势和震荡行情中的缺陷

⚠️ 本章难点

  • 区分“金叉”与“死叉”的有效性——在震荡市中频繁交叉会产生大量假信号
  • 理解均线参数的敏感性:如何选择快线和慢线的周期,避免过拟合
  • 掌握如何通过附加过滤器(如ADX、波动率)改进双均线策略

⏱️ 预估学习时间

  • 40~60分钟
图片[1]-双均线策略:量化投资的“Hello World”——从金叉死叉到ADX过滤器

一、策略简述与一句话定性

一句话定性:双均线交叉策略是最简单、最经典的趋势跟踪策略,当短期均线上穿长期均线(金叉)时买入,当短期均线下穿长期均线(死叉)时卖出。它用两条移动平均线的相对位置来识别趋势的启动与反转。

双均线策略是量化投资的“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基金依然在使用均线组合作为核心信号之一。关键在于如何管理资金、控制回撤。记住:胜率不重要,期望值才重要

老王总结:如果你打算实盘,我建议先用模拟盘跑三个月,感受一下连续亏损时的心理压力。双均线能赚钱,但前提是你有一颗强大的心脏。

💡 思考题

  1. 将均线参数改为(10,30)和(20,60),你认为在沪深300指数上,哪个组合更稳健?为什么?
  2. 如果只做多(不允许做空),双均线策略应该如何修改?用死叉平仓后,是否应该空仓等待下一次金叉?
  3. 设计一个简单的ADX过滤器:仅当ADX > 25时启用双均线策略,否则空仓。请写出伪代码。
  4. (展望题) 在人工智能时代,有人认为简单的技术指标策略会被机器学习模型完全替代。你同意吗?请从“数据效率”“计算资源”“可解释性”三个角度展开讨论。

八、引用/参考出处

网上内容

  • 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章移动平均线系统)

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容