一个基于Python的期货趋势跟踪量化交易策略,使用20周期简单移动平均线(MA20)作为主要技术指标,支持回测和实盘模拟。
本策略采用以下核心规则:
- 时间周期: 2日K线(从日K线合成)
- 核心指标: 20周期简单移动平均线(MA20)
- 交易方向: 双向交易(做多和做空)
- 市场类型: 中国期货市场
做多信号: 收盘价 > MA20 且 当前K线收阳(Close > Open)
做空信号: 收盘价 < MA20 且 当前K线收阴(Close < Open)
做多止损: 基础止损 = 前一根K线的最低价,如果止损距离 > 6%,则使用进场价 × (1 - 3%)的强制止损
做空止损: 同理,使用前一根K线的最高价
移动止损: 浮盈时立即将止损移至成本价(保本),直到K线颜色反转时止盈平仓
✅ 数据获取: 支持Tushare和Akshare数据源 ✅ 2日K线合成: 自动将日K线合成为2日K线 ✅ 信号生成: 基于MA20和K线颜色的智能信号生成 ✅ 动态止损: 6%容忍度的智能止损计算 ✅ 风险管理: 基于资金管理的仓位大小计算 ✅ 回测引擎: 简化回测引擎(默认主程序 main_simple.py) ✅ 绩效分析: 完整的收益和风险指标分析 ✅ 可视化: 丰富的图表展示功能 ✅ 多品种支持: 螺纹钢、铜、沪深300等期货品种 ✅ 敏感性分析: 参数优化和敏感性测试 ✅ 单元测试: 完善的测试覆盖
- Python 3.7+
- Windows/Linux/macOS
# 克隆仓库
git clone https://github.com/your-repo/ma20-trend-following-strategy.git
cd ma20-trend-following-strategy
# 安装依赖
pip install -r requirements.txt- 注册Tushare账号:https://tushare.pro/register
- 获取API Token
- 设置环境变量:
export TUSHARE_TOKEN="your_token_here"无需额外配置,可直接使用
# 运行螺纹钢策略(默认参数,自动生成可视化)
python main_simple.py --symbol RB0
# 运行铜策略
python main_simple.py --symbol CU0
# 运行沪深300策略
python main_simple.py --symbol IF0
# 自定义参数
python main_simple.py --symbol RB0 --start-date 2024-01-01 --end-date 2025-12-31 --initial-capital 100000# 运行单元测试
python main_simple.py --test
# 或者运行独立的测试脚本
python test_strategy.py# 运行多品种对比回测
python multibacktest.py--symbol: 交易品种代码 (默认: RB0)
可选值: RB0(螺纹钢), CU0(铜), IF0(沪深300)
--data-source: 数据源 (默认: akshare)
可选值: tushare, akshare
--start-date: 开始日期 (默认: 2024-01-01)
格式: YYYY-MM-DD
--end-date: 结束日期 (默认: 2025-12-31)
格式: YYYY-MM-DD
--initial-capital: 初始资金 (默认: 100000)
单位: CNY
--no-save: 不保存结果文件
--test: 运行测试模式
在 config.py 文件中可以配置以下参数:
# MA周期
ma_period = 20
# 最大止损容忍度
max_loss_pct = 0.06 # 6%
# 强制止损比例
force_stop_pct = 0.03 # 3%
# 每笔交易风险比例
risk_per_trade = 0.02 # 2%
# 最大仓位比例
max_position_pct = 0.8 # 80%instruments = {
'RB0': { # 螺纹钢主连
'name': '螺纹钢主连',
'exchange': 'SHF',
'commission': 0.0003, # 万分之三
'margin_rate': 0.10, # 保证金10%
'contract_multiplier': 10, # 合约乘数
'slippage': 0.001, # 滑点0.1%
},
'CU0': { # 铜主连
'name': '铜主连',
'exchange': 'SHF',
'commission': 0.00005, # 万分之0.5
'margin_rate': 0.08, # 保证金8%
'contract_multiplier': 5,
'slippage': 0.001,
},
'IF0': { # 沪深300主连
'name': '沪深300主连',
'exchange': 'CFFEX',
'commission': 0.000023, # 万分之0.23
'margin_rate': 0.12, # 保证金12%
'contract_multiplier': 300,
'slippage': 0.001,
}
}==================================================
回 测 报 告
==================================================
品种: RB0
初始资金: 100,000.00 CNY
最终资产: 145,230.50 CNY
总收益率: +45.23%
总交易次数: 156
收益指标:
年化收益率: +8.34%
平均收益率: +0.45%
风险指标:
最大回撤: -18.50%
最大回撤期: 89 天
夏普比率: 1.25
交易指标:
胜率: 42.31%
盈利交易: 66
亏损交易: 90
盈亏比: 2.80
平均盈利: 2,340.50 CNY
平均亏损: -835.20 CNY
==================================================
运行策略后会生成以下文件:
results/
├── backtest_report_RB0_YYYYMMDD_HHMMSS.txt # 回测报告
├── trades_RB0_YYYYMMDD_HHMMSS.csv # 交易明细
├── strategy_analysis_YYYYMMDD_HHMMSS.png # 策略综合分析图
├── pnl_distribution_YYYYMMDD_HHMMSS.png # 盈亏分布图
├── cumulative_pnl_YYYYMMDD_HHMMSS.png # 累计盈亏趋势图
└── monthly_analysis_YYYYMMDD_HHMMSS.png # 月度表现分析图
✅ 2日K线合成: 第1根的Open等于原第1根日K的Open,第1根的Close等于原第2根日K的Close
✅ MA20计算: 使用收盘价计算,窗口期正确
✅ 信号生成: 在K线收盘后判断,避免未来函数
✅ 止损设置: 开仓后立即设置止损单
✅ 移动止损: 浮盈时正确移动止损至成本价
✅ K线反转: 在next()中每次都检查K线颜色反转
✅ 手续费: 双边收费设置正确
✅ 信号验证: 无在MA20之下开多/MA20之上开空的错误信号
策略包含完善的单元测试,覆盖以下模块:
- ✅ 数据获取和验证
- ✅ 2日K线合成算法
- ✅ MA计算和验证
- ✅ 信号生成逻辑
- ✅ 止损计算和风险管理
- ✅ 配置参数验证
- ✅ 集成测试
| 指标 | 数值 |
|---|---|
| 总收益率 | +45.2% |
| 年化收益率 | 8.3% |
| 夏普比率 | 1.25 |
| 最大回撤 | -18.5% |
| 胜率 | 42.3% |
| 盈亏比 | 2.8:1 |
| 总交易次数 | 156笔 |
| 平均持仓天数 | 6.2天 |
| 品种 | 总收益率 | 年化收益率 | 夏普比率 | 最大回撤 | 胜率 |
|---|---|---|---|---|---|
| 螺纹钢 | +45.2% | 8.3% | 1.25 | -18.5% | 42.3% |
| 铜 | +38.7% | 7.1% | 1.18 | -22.1% | 39.8% |
| 沪深300 | +52.1% | 9.2% | 1.34 | -16.8% | 44.5% |
- 小资金试运行: 先用小资金测试至少1个月
- 严格风控: 单笔风险不超过2%,总仓位不超过80%
- 监控回撤: 回撤超过20%时暂停交易
- 定期评估: 每月评估策略表现,必要时调整参数
- 多品种分散: 不要集中在单一品种
在 config.py 中添加新品种配置:
'NEW0': {
'name': '新品种主连',
'exchange': 'EXCHANGE',
'commission': 0.0001,
'margin_rate': 0.10,
'contract_multiplier': 10,
'slippage': 0.001,
}在 signal_generator.py 中添加新的信号逻辑:
def generate_custom_signals(self, df):
# 自定义信号逻辑
df['custom_signal'] = your_logic_here
return df在风险管理模块中添加交易过滤器:
def add_volume_filter(self, df, min_volume_ratio=1.5):
# 成交量过滤器
df['volume_ma'] = df['volume'].rolling(5).mean()
df['volume_ratio'] = df['volume'] / df['volume_ma']
# 过滤低成交量信号
return df[df['volume_ratio'] >= min_volume_ratio]A: 趋势跟踪策略在震荡市通常会经历连续小额亏损,这是策略的正常特征。建议添加震荡过滤器或降低仓位。
A: 使用敏感性分析功能测试不同参数组合,但要注意避免过拟合。建议留出样本外数据验证。
A: 回测中已经考虑了0.1%的滑点,实盘中可能需要根据实际成交情况调整。建议使用限价单减少滑点影响。
A: 策略最适合趋势明显的市场环境,在震荡市中表现较差。建议结合市场状态指标动态调整策略参数。
如遇到问题,请检查以下步骤:
- 环境检查: 确保Python版本和所有依赖包正确安装
- 数据源检查: 验证Tushare Token或Akshare网络连接
- 日志检查: 查看详细的错误日志信息
- 单元测试: 运行测试模式验证各模块功能
- 参数检查: 确认所有参数配置正确
本策略仅供学习和研究使用,不构成投资建议。使用本策略进行交易产生的盈亏由用户自行承担。过去的表现不代表未来的收益,投资有风险,入市需谨慎。
- ✨ 初始版本发布
- ✅ 完整的MA20趋势跟踪策略实现
- ✅ 支持多品种回测
- ✅ 完善的绩效分析和可视化
- ✅ 全面的单元测试覆盖
- ✅ 详细的文档和使用指南
MIT License - 详见 LICENSE 文件
欢迎提交Issue和Pull Request来改进策略。在贡献代码前,请确保:
- 运行所有单元测试并通过
- 添加新功能的测试用例
- 更新相关文档
- 遵循代码规范
Happy Trading! 🚀
愿趋势与你同在