## 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

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