Python回测框架与MT5数据对接

新帖
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
MossyMeadow
MossyMeadow 楼主 半小时前 浏览 11 回复 1 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 4 帖数 22 积分 1828 汇币 1381
1楼
做统计套利这行久了,最怕的不是模型不收敛,是回测跑出来的夏普比率漂亮得离谱,实盘一上就现原形。早些年我用MT5自带策略测试器跑欧美和镑美的价差策略,总觉得哪里不对劲——后来才想明白,测试器里的报价是终端自己聚合的,跟我实盘VPS上看到的tick流根本对不上号。所以现在我的习惯是,回测数据必须从MT5直接拉原始tick,用Python自己搭框架跑,这样至少数据源和实盘是同一套。
先说数据对接这块。MT5的Python包调用起来不难,但有几个参数不注意就会埋雷。我的流程一般是这样:

  • 先initialize()连接终端,注意path参数要指向terminal64.exe的完整路径,别只给个目录,否则经常返回False还不报错
  • 用copy_ticks_range()拉数据时,时间参数用UTC,别用本地时间。我吃过亏,服务器时区设成GMT+3,拉出来的tick时间戳跟Python的datetime差了几个小时,回测和实盘信号完全错位
  • 拉完tick别急着存CSV,先按bid/ask分别建列,再用中价算价差。很多人图省事只存last价,做价差策略的时候买卖价差成本就被悄悄抹掉了
  • 数据量大的话分批拉,一次拉一个月,每批之间sleep 0.5秒,不然终端容易卡死或者返回空数组

数据落地之后就是框架结构。我的做法是把策略逻辑和数据层彻底分开,数据层只负责喂bar或者tick,策略层只接收价格序列返回信号,中间加一层撮合模拟。这层撮合里我最看重的两个参数是滑点和点差——欧美我按0.6到1.2个点浮动,镑美给到1.5到2.5,黄金单独设。别小看这个,我早期跑一个欧美日内均值回归,点差按0算出来的年化收益能到30%多,加上真实点差直接掉到个位数,那落差能让人失眠。
踩过的坑里最典型的一个是时间对齐。MT5拉出来的tick时间戳精度到毫秒,但不同流动性提供商的tick频率不一样,你如果直接resample成M1,某些分钟可能一根tick都没有,pandas默认会用前值填充,结果回测里出现一堆“幽灵成交”。我的处理是resample之后检查每根bar的tick计数,低于阈值的bar直接标记为无效,策略层跳过。另一个坑是持仓成本的计算周期,隔夜利息得按MT5的swap规则自己实现,尤其是周三三倍利息,不处理的话中长线策略的回测偏差会累积得很难看。
最后说个框架层面的经验。别追求一步到位搞个大而全的系统,我现在的框架核心就三个文件:数据拉取、撮合模拟、绩效统计,加起来不到八百行。策略写成独立模块往里插,跑完自动输出净值曲线、最大回撤、盈亏比和分品种的价差分布。框架越轻,改起来越快,验证一个想法从写代码到出结果基本半小时内搞定。至于EA实盘那边,回测通过只是第一步,我一般会先上VPS跑两周demo,对比实盘tick和回测数据的偏差率,偏差超过5%就得回头查数据源。
你们平时拉MT5数据是直接copy_ticks还是走copy_rates_from_pos?有没有遇到过拉出来的tick时间戳跟终端显示对不上的情况,都是怎么处理的?
0 回复 众裁0 复制
#1
感性的路人甲
感性的路人甲 #2· 9 分钟前
2楼
时区那个坑我也踩过,MT5返回的tick时间戳默认是服务器时区,跟Python的UTC差几个小时,信号全错位。建议拉完先核对首尾时间戳再落库,别急着跑回测。
赞 回复 众裁0 复制
9 分钟前 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 今天遇到个事忍不住想分享,今天聊聊白银XAG/USD的走势 下一帖 → 写RSI时绕不开的坎