1
0

完成macd策略

This commit is contained in:
2026-01-28 00:10:43 +08:00
parent 407b70bd0e
commit 9a46bd7e4c
10 changed files with 770 additions and 0 deletions

View File

@@ -0,0 +1,134 @@
## ADDED Requirements
### Requirement: MACD趋势跟踪策略
系统应提供基于MACD指标的趋势跟踪交易策略包括MACD计算、EMA200趋势过滤、以及基于金叉/死叉的交易信号生成。
#### Scenario: 策略文件加载
- **WHEN** 用户在命令行指定`--strategy-file strategies/macd_strategy.py`
- **THEN** backtest.py成功加载策略文件并执行回测
- **AND** 策略类正确注册所有技术指标到backtesting框架
- **AND** 策略逻辑根据MACD金叉/死叉和EMA200位置生成交易信号
#### Scenario: MACD指标计算
- **WHEN** 调用`calculate_indicators(data)`函数,传入包含[Open, High, Low, Close, Volume, factor]的DataFrame
- **THEN** 函数使用ta-lib计算以下指标并添加到DataFrame
- MACD线DIF: 10日EMA - 20日EMA
- MACD信号线DEA: 9日EMA的MACD
- MACD柱状图Histogram: MACD线 - 信号线
- EMA200: 200日指数移动平均线
- **AND** 返回包含原始数据和所有新增指标的DataFrame
- **AND** 指标名称使用ta-lib返回的默认列名macd、macdsignal、macdhist
#### Scenario: 策略初始化
- **WHEN** backtesting框架初始化MacdTrendStrategy策略类
- **THEN** 调用`init()`方法
- **AND** 在`init()`中通过`self.I()`注册以下指标到backtesting框架
- MACD线`self.data.MACD_10_20_9`
- MACD信号线`self.data.MACDs_10_20_9`
- EMA200`self.data.EMA_200`
- **AND** 所有参数fast_period=10、slow_period=20、signal_period=9在策略类中定义为类变量
- **AND** 注册的指标可直接在`next()`方法中访问
#### Scenario: MACD金叉买入信号
- **WHEN** 策略检测到MACD线上穿信号线金叉
- **AND** 当前价格高于EMA200趋势线确认上升趋势
- **AND** 当前无持仓或持仓方向与买入信号相反
- **THEN** 策略平掉现有仓位(如有)
- **AND** 策略开多仓(`self.buy()`
- **AND** 在趋势市场下捕捉上涨机会
#### Scenario: EMA200跌破卖出信号
- **WHEN** 策略检测到当前价格跌破EMA200趋势线
- **AND** 当前持有多仓
- **THEN** 策略平掉多仓(`self.position.close()`
- **AND** 不开空仓(仅平仓,避免逆势交易)
- **AND** 在趋势转向时及时止损保护利润
#### Scenario: MACD死叉卖出信号
- **WHEN** 策略检测到MACD线下穿信号线死叉
- **AND** 当前持有多仓
- **THEN** 策略平掉多仓(`self.position.close()`
- **AND** 不开空仓
- **AND** 在动量减弱时退出持仓
#### Scenario: EMA200下方不开仓
- **WHEN** 当前价格低于EMA200趋势线
- **AND** 检测到MACD金叉信号
- **THEN** 策略不执行买入操作
- **AND** 避免在下跌趋势中逆势交易
- **AND** 等待价格回到EMA200上方再考虑入场
#### Scenario: 空仓状态处理
- **WHEN** 策略当前无持仓
- **AND** 检测到卖出信号MACD死叉或EMA200跌破
- **THEN** 策略跳过卖出信号
- **AND** 避免重复平仓导致错误
#### Scenario: 震荡市场过滤
- **WHEN** 市场处于震荡状态价格围绕EMA200波动
- **AND** MACD产生频繁的假金叉/死叉信号
- **THEN** EMA200趋势过滤减少交易频率
- **AND** 避免在无明确趋势时频繁交易
- **AND** 等待趋势明确后再入场
#### Scenario: 趋势市场顺势交易
- **WHEN** 市场处于明确上升趋势价格持续在EMA200上方
- **AND** MACD金叉确认动量增强
- **THEN** 策略及时入场捕捉上涨机会
- **AND** 顺势交易提高胜率
- **AND** EMA200确保不在下跌趋势中买入
#### Scenario: 参数配置
- **WHEN** 用户查看策略代码
- **THEN** 策略参数清晰定义为类变量:
- `fast_period = 10`MACD快线周期
- `slow_period = 20`MACD慢线周期
- `signal_period = 9`MACD信号线周期
- **AND** 参数无需通过命令行传递
- **AND** 参数可直接在代码中修改以适配不同市场环境
#### Scenario: 依赖管理
- **WHEN** 安装项目依赖
- **THEN** ta-lib库已被正确安装手动安装
- **AND** `uv run python -c "import talib"`成功执行
- **AND** 策略文件可正常运行
- **AND** 如ta-lib未安装给出明确错误提示
#### Scenario: 回测兼容性
- **WHEN** 使用现有backtest.py框架
- **THEN** 框架通过`load_strategy()`函数成功加载macd_strategy.py
- **AND** 调用`calculate_indicators()`预处理数据
- **AND** 初始化策略类并执行回测
- **AND** 回测流程与SMA策略完全一致
#### Scenario: 指标数据完整性
- **WHEN** backtesting调用`calculate_indicators(data)`
- **THEN** 返回的DataFrame包含所有必需列
- 原始列:[Open, High, Low, Close, Volume, factor]
- MACD指标列[MACD_10_20_9, MACDh_10_20_9, MACDs_10_20_9]
- EMA趋势线列[EMA_200]
- **AND** 无NaN值除预热期外
- **AND** 指标数据可用于策略决策和图表展示
#### Scenario: 预热期处理
- **WHEN** 数据长度不足以计算完整指标前200天
- **THEN** 指标值为NaN
- **AND** backtesting框架会自动跳过预热期
- **AND** 策略逻辑在有足够数据后才执行
- **AND** 避免因数据不足导致的错误信号