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

204 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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
无 - 所有设计决策已明确。