1
0
Files
leopard-analysis/openspec/specs/macd-trading/spec.md
2026-01-28 00:10:43 +08:00

135 lines
5.1 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.
## 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** 避免因数据不足导致的错误信号