开发交易机器人:Python与MQL5结合(第二部分):模型选择、创建与训练,以及Python自定义测试器·综合运用
「特征质量直接决定账户生死」
在 Python 交易机器人系列的第二篇里,数据处理、特征工程、特征选择、模型训练与自定义测试器都已跑通,表面看流程顺滑。 我曾把特征砍到极简、试图用最朴素变量降低复杂度,结果模型在自定义测试器里把账户资金耗尽。这个失败样本说明:特征和数据的重要性不亚于模型结构本身。 无用特征下,再花哨的改进与调参,在未知数据上也会无情吞掉本金;而特征到位时,即便模型只是普通水平,回测仍能给出偏稳的结果。外汇与贵金属杠杆高,这类验证务必先在模拟环境跑,实盘风险极大。
把建模阵地挪到 Python 再回接 MT5
作者下一步打算在 MetaTrader 5 里做一套自定义在线交易通道,直接通过 Python 发单,而不是把所有特征工程都搬回 MQL5。理由很实际:当初切到 Python 版本,就是因为特征迁移进 MQL5 时踩了坑,而在 Python 里做特征处理、标注和增强,速度快得多也顺手得多。 他认为 MQL5 的 Python 库被严重低估,用的人少,但拿它造既好看又可能盈利的模型是条强力路线。另一个方向是接真实交易所(CME、MOEX)的 market depth 历史,让模型从盘口深度里学规律,这算是有前途的扩展点。 对读者来说,可验证的动作很明确:开 MT5 装好 Python 环境,把官方 MQL5 Python 包导进来,先跑通一段历史数据拉取,再决定要不要把你的特征筛选留在 Python、信号回传 MT5 执行。外汇与贵金属杠杆高,这类跨语言链路任何一环出错都可能放大回撤,先小额验证再谈实盘。
◍ 这套管线漏在哪
增强数据函数在训练集和测试集之间直接混用了不同时间段样本,造成训练信息渗入测试集,评估结果偏高只是假象。 模型按未来数据训练、再拿历史数据回测,方向完全反了;时间序列被当普通表格做交叉验证,忽略了前后依赖,这类验证在外盘贵金属与外汇上极易给出误导信号,实盘高风险。 generate_new_features() 只回原始数据不回特征,test_model() 却去取转换后可能已不存在的 'close' 列,代码层面就断了。 数据被 markup_data() 和 label_data() 各标记一次,口径不一致;聚类出的 cluster 也没进后续训练。策略写死 10 根 K 线退出,只有朴素止损、点差,无交易成本与自适应风控,前向分析缺失,拿去 MT5 跑之前得先把这些洞补上。
「最后说句实在话」
这一节列出来的几条改进方向,核心就一件事:把回测里偷看未来的漏洞堵死。严格分离训练段与验证段的数据,再叠一层前向验证,策略在 MT5 里跑出来的曲线才不至于虚高。 外汇和贵金属杠杆高、滑点跳空频繁,任何没算进延迟和佣金的测试都只是半成品,实盘前务必用真实点差重跑一遍。 后面提到的 Telegram 通知集成、STF 时空融合预测、支撑阻力 EA 以及 CCMR 上下文分析,都是把“趋势约束”从指标变成可行动系统的具体落点。开 MT5 把对应代码段拆开读一遍,比看十篇概述更有用。