1
0
Files
leopard-analysis/openspec/changes/archive/2026-01-28-add-macd-strategy/design.md
2026-01-28 00:10:43 +08:00

6.2 KiB
Raw Blame History

Context

当前项目使用backtesting库进行量化回测框架现有策略为SMA双均线交叉策略strategies/sma_strategy.py。用户需要新增基于MACD的趋势跟踪策略适配A股市场特性。

当前状态:

  • 回测框架已就绪(backtest.py支持动态加载策略)
  • 现有SMA策略作为参考模板
  • 策略文件需要遵循固定模式:calculate_indicators()get_strategy()、Strategy类
  • 无风险管理要求,无需实现止损、仓位管理等复杂逻辑

依赖环境:

  • Python 3.x
  • pandas (已安装)
  • backtesting库已安装
  • ta-lib依赖已手动安装完成

Goals / Non-Goals

Goals:

  • 创建strategies/macd_strategy.py实现MACD趋势跟踪策略
  • 使用ta-lib库简化MACD和EMA200指标计算
  • 实现MACD金叉/死叉 + EMA200趋势过滤的交易信号
  • 保持策略文件独立性,无需修改backtest.py
  • 支持通过--strategy-file参数加载新策略

Non-Goals:

  • 不实现风险管理功能(止损、止盈、仓位管理)
  • 不支持多股票组合回测
  • 不修改现有SMA策略
  • 不实现命令行参数配置(所有参数固定在策略文件中)

Decisions

D1: 指标计算库选择

决策: 使用ta-lib而非原生pandas或pandas-ta

理由:

  • ta-lib是技术分析领域的事实标准性能优异
  • C语言实现计算速度快适合大量指标计算
  • API简洁直观广泛用于量化交易系统
  • 文档完善,社区支持广泛
  • 与pandas集成良好可直接传入Series

考虑的替代方案:

  • 原生pandas: 实现简单但需手写EMA计算代码冗长
  • pandas-ta: API设计现代但性能不如ta-lib且安装依赖较多

D2: MACD参数配置

决策: 使用(10, 20, 9)参数组合(平衡型)

理由:

  • 快线10比标准12更敏感适应A股较高波动性
  • 慢线20比标准26更快响应同时保持趋势跟踪稳定性
  • 信号线9保持标准避免信号过于频繁
  • 该组合在多数A股市场环境下回测表现稳定
  • 10-20的组合在斐波那契数列附近技术分析流认可度高

参数优化依据:

  • A股波动率高需要相对敏感的快线参数
  • T+1交易规则避免过于激进的参数减少假信号
  • 散户追涨杀跌结合趋势过滤EMA200避免逆势交易
  • 平衡策略:兼顾信号及时性和稳定性

D3: 趋势过滤器选择

决策: 使用EMA200作为趋势确认

理由:

  • 200日均线被广泛认可为牛熊分界线
  • EMA比SMA更平滑减少假突破
  • 与MACD配合MACD捕捉动量转折EMA200确认趋势方向
  • 机构投资者常用大资金使用200日线作为战略配置参考
  • 在A股市场验证结合EMA200可显著减少震荡市中的假信号

交易逻辑:

  • 买入条件: MACD金叉 AND 价格 > EMA200
  • 卖出条件: MACD死叉 OR 价格 < EMA200

D4: 策略行为模式

决策: EMA200双向过滤跌破EMA200强制卖出

理由:

  • 避免在趋势转向后继续持有
  • EMA200跌破通常预示趋势反转及时止损保护利润
  • 比仅入场过滤更严格,但风险控制更好

替代方案(未采用):

  • 仅入场过滤: EMA200仅用于确认买入卖出仅依赖MACD死叉
    • 优点: 交易次数更多,可能捕捉更多小波段
    • 缺点: 在趋势反转时可能持有过久,回撤较大
  • 动态参数: 根据市场波动率动态调整MACD参数
    • 优点: 适应不同市场环境
    • 缺点: 实现复杂,超出当前需求范围

D5: 策略文件结构

决策: 严格遵循现有strategy.py模式

理由:

  • 保持代码一致性,便于维护
  • 无需修改backtest.py(已验证可动态加载)
  • 其他策略可参考相同模式开发

文件模式:

# 必需函数
def calculate_indicators(data):
    """计算所需指标返回DataFrame"""
    pass

def get_strategy():
    """返回策略类"""
    pass

# 必需类
class MacdTrendStrategy(Strategy):
    """策略类"""

    # 可配置参数(固定)
    fast_period = 10
    slow_period = 20
    signal_period = 9

    def init(self):
        """注册指标到backtesting框架"""
        pass

    def next(self):
        """每个时间步的决策逻辑"""
        pass

D6: 指标计算时机

决策: 在calculate_indicators()中计算所有指标

理由:

  • 指标计算与策略逻辑分离,代码清晰
  • backtesting框架在加载策略前调用calculate_indicators()
  • 数据预处理在策略初始化前完成,提高性能
  • 便于回测时查看完整指标数据

替代方案(未采用):

  • 在Strategy.init()中动态计算指标
    • 优点: 数据与策略逻辑更紧密
    • 缺点: 回测时无法提前查看指标,调试困难

Risks / Trade-offs

R1: pandas-ta安装依赖

风险: 用户环境可能未安装pandas-ta

缓解:

  • ta-lib已手动安装无需在依赖管理中重复添加
  • 提供清晰的错误提示如遇ModuleNotFoundError

R2: 参数固定性

风险: 无法通过命令行调整参数,灵活性降低

缓解:

  • 参数基于A股市场研究具有通用性
  • 如需调整,可直接修改策略文件参数值
  • 在代码注释中明确参数含义和调整建议

R3: 无风险控制机制

风险: 在强趋势反转时可能出现较大回撤

缓解:

  • EMA200趋势过滤已提供一定保护
  • 如未来需要风险控制,可在next()方法中添加止损逻辑
  • 当前设计满足"不考虑风险管理"的需求

R4: 震荡市假信号

风险: MACD在横盘震荡市中易产生频繁假信号

缓解:

  • EMA200趋势过滤可减少震荡市中的交易频率
  • 选择相对保守的参数10-20而非8-17避免过于敏感
  • 研究表明,零轴过滤和趋势过滤可显著降低震荡市损失

R5: 策略滞后性

风险: 基于EMA的指标天然滞后可能错过趋势初期

缓解:

  • 平衡型参数10-20-9在及时性和稳定性间取得平衡
  • 滞后性是趋势指标的固有特性,无法完全消除
  • 如需更及时信号可考虑更小参数组合8-17-7

Migration Plan

无需迁移步骤,新策略文件完全独立,不影响现有功能。

Open Questions

无 - 所有设计决策已明确。