## 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`(已验证可动态加载) - 其他策略可参考相同模式开发 **文件模式**: ```python # 必需函数 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 无 - 所有设计决策已明确。