源码文件:vnpy_ctastrategy.strategies.double_ma_strategy

1. 策略概述

DoubleMaStrategy 是量化交易中最经典的入门策略——双均线策略。 逻辑极其简单:快线向上穿过慢线(金叉)做多,快线向下穿过慢线(死叉)做空。虽然简单,但它是理解趋势跟踪逻辑的最佳起点。

  • 基类CtaTemplate
  • 核心指标:SMA (Simple Moving Average)
  • 交易方式:信号触发后立即市价(或限价)成交

2. 核心参数

参数名默认值含义
fast_window10快线周期 (如 10 日均线)
slow_window20慢线周期 (如 20 日均线)

3. 策略逻辑详解

3.1 指标计算

策略计算了两条均线的当前值 (ma0) 和上一根 K 线的值 (ma1),用于判断交叉。

1
2
3
4
5
6
7
fast_ma = am.sma(self.fast_window, array=True)
self.fast_ma0 = fast_ma[-1]  # 当前 K 线快线
self.fast_ma1 = fast_ma[-2]  # 上一根 K 线快线

slow_ma = am.sma(self.slow_window, array=True)
self.slow_ma0 = slow_ma[-1]
self.slow_ma1 = slow_ma[-2]

3.2 交叉判断

  • 金叉 (Cross Over)

    • 上一刻:快线 < 慢线
    • 当前:快线 > 慢线
    1
    
    cross_over = self.fast_ma0 > self.slow_ma0 and self.fast_ma1 < self.slow_ma1
    
  • 死叉 (Cross Below)

    • 上一刻:快线 > 慢线
    • 当前:快线 < 慢线
    1
    
    cross_below = self.fast_ma0 < self.slow_ma0 and self.fast_ma1 > self.slow_ma1
    

3.3 交易执行

策略始终保持在市场中(Always in the market),即非多即空。

  • 金叉触发

    • 若空仓 (pos == 0):买入开仓。
    • 若持有空单 (pos < 0):先平空单 (cover),再反手买入 (buy)。
  • 死叉触发

    • 若空仓 (pos == 0):卖出开仓。
    • 若持有多单 (pos > 0):先平多单 (sell),再反手卖出 (short)。
1
2
3
4
5
6
if cross_over:
    if self.pos == 0:
        self.buy(bar.close_price, 1)
    elif self.pos < 0:
        self.cover(bar.close_price, 1)
        self.buy(bar.close_price, 1)

4. 总结与思考

DoubleMaStrategy 虽然逻辑简单,但存在明显的优缺点:

  • 优点:在单边大趋势行情中表现优异,能吃满整个波段。
  • 缺点:在震荡市中会频繁触发金叉死叉(“左右挨打”),导致资金快速磨损。

改进方向: 通常不会直接使用裸的双均线策略,而是会加入过滤器(如 ATR 波动率、RSI 强弱、MACD 辅助)来减少震荡市的开仓次数。