5.1 KiB
5.1 KiB
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)
- MACD线(
- 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 避免因数据不足导致的错误信号