Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MA20趋势跟踪策略

一个基于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(推荐)

  1. 注册Tushare账号:https://tushare.pro/register
  2. 获取API Token
  3. 设置环境变量:
export TUSHARE_TOKEN="your_token_here"

Akshare(备用)

无需额外配置,可直接使用

快速开始

1. 运行完整策略

# 运行螺纹钢策略(默认参数,自动生成可视化)
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

2. 运行测试

# 运行单元测试
python main_simple.py --test
# 或者运行独立的测试脚本
python test_strategy.py

3. 多品种回测

# 运行多品种对比回测
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计算和验证
  • ✅ 信号生成逻辑
  • ✅ 止损计算和风险管理
  • ✅ 配置参数验证
  • ✅ 集成测试

性能表现

螺纹钢主连 (RB0) 2020-2024

指标数值
总收益率+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. 小资金试运行: 先用小资金测试至少1个月
  2. 严格风控: 单笔风险不超过2%,总仓位不超过80%
  3. 监控回撤: 回撤超过20%时暂停交易
  4. 定期评估: 每月评估策略表现,必要时调整参数
  5. 多品种分散: 不要集中在单一品种

扩展功能

添加新品种

config.py 中添加新品种配置:

'NEW0': {
'name': '新品种主连',
'exchange': 'EXCHANGE',
'commission': 0.0001,
'margin_rate': 0.10,
'contract_multiplier': 10,
'slippage': 0.001,
}

自定义指标

signal_generator.py 中添加新的信号逻辑:

defgenerate_custom_signals(self, df):
# 自定义信号逻辑df['custom_signal'] =your_logic_herereturndf

添加过滤器

在风险管理模块中添加交易过滤器:

defadd_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']
# 过滤低成交量信号returndf[df['volume_ratio'] >=min_volume_ratio]

常见问题

Q: 策略在震荡市表现如何?

A: 趋势跟踪策略在震荡市通常会经历连续小额亏损,这是策略的正常特征。建议添加震荡过滤器或降低仓位。

Q: 如何优化参数?

A: 使用敏感性分析功能测试不同参数组合,但要注意避免过拟合。建议留出样本外数据验证。

Q: 实盘滑点如何处理?

A: 回测中已经考虑了0.1%的滑点,实盘中可能需要根据实际成交情况调整。建议使用限价单减少滑点影响。

Q: 策略适合什么市场环境?

A: 策略最适合趋势明显的市场环境,在震荡市中表现较差。建议结合市场状态指标动态调整策略参数。

技术支持

如遇到问题,请检查以下步骤:

  1. 环境检查: 确保Python版本和所有依赖包正确安装
  2. 数据源检查: 验证Tushare Token或Akshare网络连接
  3. 日志检查: 查看详细的错误日志信息
  4. 单元测试: 运行测试模式验证各模块功能
  5. 参数检查: 确认所有参数配置正确

免责声明

本策略仅供学习和研究使用,不构成投资建议。使用本策略进行交易产生的盈亏由用户自行承担。过去的表现不代表未来的收益,投资有风险,入市需谨慎。

更新日志

v1.0.0 (2024-12-31)

  • ✨ 初始版本发布
  • ✅ 完整的MA20趋势跟踪策略实现
  • ✅ 支持多品种回测
  • ✅ 完善的绩效分析和可视化
  • ✅ 全面的单元测试覆盖
  • ✅ 详细的文档和使用指南

许可证

MIT License - 详见 LICENSE 文件

贡献

欢迎提交Issue和Pull Request来改进策略。在贡献代码前,请确保:

  1. 运行所有单元测试并通过
  2. 添加新功能的测试用例
  3. 更新相关文档
  4. 遵循代码规范

Happy Trading! 🚀

愿趋势与你同在

About

An easy help to realize some trivail strategy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages