做统计套利这行久了,最怕的不是模型不收敛,是回测跑出来的夏普比率漂亮得离谱,实盘一上就现原形。早些年我用MT5自带策略测试器跑欧美和镑美的价差策略,总觉得哪里不对劲——后来才想明白,测试器里的报价是终端自己聚合的,跟我实盘VPS上看到的tick流根本对不上号。所以现在我的习惯是,回测数据必须从MT5直接拉原始tick,用Python自己搭框架跑,这样至少数据源和实盘是同一套。
先说数据对接这块。MT5的Python包调用起来不难,但有几个参数不注意就会埋雷。我的流程一般是这样:
数据落地之后就是框架结构。我的做法是把策略逻辑和数据层彻底分开,数据层只负责喂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时间戳跟终端显示对不上的情况,都是怎么处理的?
先说数据对接这块。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时间戳跟终端显示对不上的情况,都是怎么处理的?
