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