先把行情数据洗成能喂模型的表格
◍ 先把行情数据洗成能喂模型的表格
在 MT5 里做机器学习,第一步不是选算法,而是把tick或柱数据预处理成监督学习用的表格。原始报价含缺口、跳空和不同品种时区错位,直接丢进模型会让 CatBoost 这类树模型学到假规律。 实操中建议用 MQL5 的 CopyRates 拉取指定品种的历史柱,按时间对齐后构造特征:收益率、波动率、成交量变化率等。一个常见坑是未来函数——特征里混入了当前 bar 收盘后才确定的量,回测漂亮实盘崩。 下面这段把 EURUSD 的 H1 柱转成带滞后特征的二维数组,跑之前先在策略测试器用 2020–2023 年数据验证一遍,外汇和贵金属杠杆高、滑点大,样本外表现可能明显衰减。
class=class="str">"cmt">// 取 EURUSD H1 最近 class="num">500 根柱 class="type">MqlRates rates[class="num">500]; CopyRates("EURUSD", PERIOD_H1, class="num">0, class="num">500, rates); class=class="str">"cmt">// 构造滞后收益率特征 class="type">class="kw">double feat[class="num">499][class="num">2]; for(class="type">int i=class="num">1;i<class="num">500;i++){ feat[i-class="num">1][class="num">0] = (rates[i].close - rates[i-class="num">1].close)/rates[i-class="num">1].close; class=class="str">"cmt">// 当期收益 feat[i-class="num">1][class="num">1] = feat[i-class="num">2][class="num">0]; class=class="str">"cmt">// 滞后一期收益 }
量化预处理的两段式落地路径
这一节把树模型里的量化实践拆成两条线,没有堆数学公式,直接奔着 MT5 可跑的代码去。先说清楚:第一部分用 MQL5 把样本数据做预处理,第二部分靠一组实验回测来回答“量化到底有没有用”。 对已经跑过第一篇文章里基础流程的交易者,这一步的价值在于能把原始 tick 或 OHLC 序列压成离散桶,再喂给后续模型。外汇与贵金属杠杆高、滑点跳变频繁,离散化后过拟合风险可能降低,但信号滞后概率会上升,需要自己调桶宽验证。 两条线不是孤立的:预处理代码决定实验输入,实验结果反过来告诉你桶该分粗还是分细。开 MT5 把第一部分脚本挂上 EURUSD 的 M1,先跑一周样本就能看到分布偏移。
「用 Q_Error_Selection 脚本做特征预处理」
Q_Error_Selection 这套脚本的核心任务,是从 train.csv 载入样本、灌入矩阵、做预处理,再轮流套用不同量化表,逐列评估预测因子重建误差。每轮结果存进数组,跑完所有量化表后为每个预测因子挑出误差最小的那个表,并顺手生成一份带 CatBoost 设置的摘要量化文件,把被踢出训练的列序号一并记下来。 尖峰处理是第一步。脚本默认取数字序列两侧各 2.5% 作为罕见值(尖峰),也兼容 3-sigma 规则。激活后有两种改写方式:2.1 把尖峰压到分割边界附近,不破坏边界内量化近似;2.2 按正常区等级随机替换,消掉量化表近似误差。若开「替换数据」开关,原矩阵直接被改写,存出的 train.csv 可进 CatBoost 重新量化,分割点数量可能下降。 相关性剔除走 Pearson 路线,相关比率阈值(如 70 即生成 Corr_Matrix_70.csv)之上才视作冗余。后向选择、泛化选择、稀有选择三种逻辑任选:泛化派留信息量最大的列,稀有派反其道留最独特的列。时间不稳定因子则按每 1/10 段均值波动排查,像 iVIDyA 那种跟着绝对价漂移的因子,理论上会拖累训练,散布超阈就该砍。 量化表本身支持统一间隔、随机迭代(靠种子复现、靠次数碰运气)两种生成。最终选择阶段,开「阈值」后误差要除以分割数,防过度量化;关掉就纯比重建误差。最大允许误差参数卡死上线,超了的直接不进 Quant_CB.csv。 最后转换保存可落索引或质心:索引模式省磁盘又省内存,还能脱敏共享训练集。图表那块建议把宽度调大,密度图、目标对应图、直方图、量化层级图、均值散布图、尖峰图六张一套,iCCI 因子的图 6–11 就是范本,肉眼扫一遍比看数字快。
◍ 用嵌套循环把量化表设定跑个遍
手里有能自定义量化表的脚本,不等于知道哪种配置真划算。要回答「自定义到底比 CatBoost 默认强在哪、最少切几段边界能逼近默认效果、均匀或随机量化是否值得用」这类问题,只能把不同设置组合全训一遍再比指标。 建议把 Q_Error_Selection 脚本里「Iterate through settings scenarios」变量置为 true,代码会用三层嵌套循环扫完这些组合:评估方法分三种——只看重建误差、重建误差除以分割数且上限 1%、除以分割数且上限 0.5%;量化表来源取 CatBoost 自带、均匀量化、随机分割三类;分割数档位用 1 到 6 代表全量 / 16 / 32 / 64 / 128 / 256 段。整套组合如图 12 的矩阵所示。 每个组合训 101 个模型,种子从 0 以步长 8 拉到 800,靠平均把随机性压下去。对比时盯六个量:Profit_Avr 平均利润、MO_Avr 平均数学期望、Precision_Avr 平均分类精度、Recall_Avr 平均召回完整度、N_Exam_Model 利润超 3000 单位的模型数、Profit_Max 平均最大利润。 把这六个指标加总除以个数,得到一个综合分 Q_Avr,就能横向排哪个量化表选择方案更靠谱。外汇与贵金属行情高波动,此类回测结论仅代表样本内概率倾向,实盘前务必在 MT5 用自己品种重跑验证。
准备实验数据
为了获得样本,我们将使用之前在 文章 “无需学习 Python 或 R 即可从 Yandex 获得 CatBoost 机器学习算法”中熟悉 CatBoost 时使用的相同 EA 和脚本。 我使用了以下设置: A.测试器设置: Symbol: EURUSD Timeframe: M1 Interval from 01.01.2010 to 01.09.2023 B.CB_Exp EA策略设置: Period:104 Timeframe:2 Minutes MA method: Smoothed Price calculation base: Close price 收到样本并将其分为 3 个部分(训练、测试、检验)后,我们需要以与我之前在文章中描述的方式类似的方式获取量化表。为了实现这一点,我修改了 CB_Bat 脚本(附于本文)。现在,在“Search object”设置中选择 Brut_Quantilization_grid 时,脚本会创建 _01_Quant_All.txt 文件。搜索范围的设置保持不变 - 设置变量的初始值和最终值以及变化步长。我使用从 8 到 256 的搜索,步长为 8。脚本运行的结果是,获取所有类型的量化表的命令将以指定数量的边界来准备。量化表文件将具有以下命名结构:“quant”语义文件名形式的文件名、分隔符数量和划分类型的序号。参数将以下划线链接,文件本身将保存在 Q 目录中,该目录与项目设置目录相同。 运行脚本后,将生成的_01_Quant_All.txt文件的扩展名更改为*.bat,将脚本中先前指定的 CatBoost 版本放在文件目录中,然后双击运行该文件。 当脚本完成其工作时,Q 子目录中会出现一组文件 - 这些是我们将继续使用的量化表。 图 13.Q 子目录内容 使用 Q_Error_Otbor 脚本,生成间隔数为 16、32、64、128 和 256 的均匀和随机量化表。相应的文件将出现在 Q_Bit 和 Q_Random 目录中。将 Q 目录复制到项目目录中,并将新目录命名为 Q_00。 现在我们已经拥有创建训练任务包所需的一切。启动 Q_Error_Otbor 脚本,将“Search settings scenarios”参数切换为“true”,然后单击“Ok”。该脚本将根据代码中指定的场景创建包含量化表和训练设置的文件。 为了在训练期间对 CatBoost 设置的每个配置使用量化表,脚本将设置文件的名称添加到“Quant_CB.csv”量化表的名称中。 让我们使用 CB_Bat_v_02 脚本获取用于训练的文件。我选择以8为步长从0到800搜索种子,并指明项目目录。 现在我们需要稍微编辑一下训练文件,将文件名 Quant_CB.csv 替换为 Quant_CB_%%a.csv。这一变化将允许我们使用设置的名称作为变量,其数量决定了训练周期的数量。将创建的文件复制到 Setup 项目目录,通过将文件 _00_Start.txt 重命名为 _00_Start.bat 并双击 _00_Start.bat 来开始训练。 [CODE] quant_"+IntegerToString(Seed,3,'0')+"_"+IntegerToString(ENUM_feature_border_type_NAME(Q),0)+".csv"; [/CODE]
「量化表选型让 CatBoost 利润跑赢默认」
用 CB_Calc_Svod 脚本对 101 个默认量化表设置的模型做指标汇总,得到一组基准均值:Profit_Avr=2810.17、МО_Avr=28.33、Precision_Avr=0.3625、Recall_Avr=0.023、N_Exam_Model=43、Profit_Max=8026。 把参数分布拉开看,整体设置对训练结果扰动很大。随机分割(Q_Random)出来的表比其它构造方法明显更差;分割数往上加,除 Recall_Avr 外多数指标走低——量化段信息过度分散,数学运算量虚高推升了模型置信度,却把准确度与平均利润一起拉垮。 默认 254 段用的是 GreedyLogSum 非均匀网格,评估质量指标常比均匀网格难看,所以集合筛选里很少留它。(0;Q_00;256) 组合下 2408 个预测因子里仅 121 个选了该方法,极值段为何吃重,值得自己跑一遍验证。 16~64 段配 0.5% 误差阈值太苛刻,进训练的预测因子大幅缩水;放宽到 1% 近似误差后,从全表选量化表的结果偏向均衡集(尤其 CatBoost 表集),更耐看。 换最优量化表后对比默认:Profit_Avr 的 (1;Q_Bit;16) 超基准 32.22%,МО_Avr 的 (1;Q_00;0) 超 197.00%,Precision_Avr 的 (1;Q_00;0) 超 24.69%,Recall_Avr 多组合均超 8.7%,N_Exam_Model 的 (1;Q_Bit;16) 超 55.81%,Profit_Max 的 (1;Q_00;32) 超 9.24%。 均匀 16 段已够用:Q_Avr 在 (1;Q_Bit;16) 为 16.28,(0;Q_00;16) 为 18.24。外汇与贵金属模型训练属高风险实验,单次结果仅作方法倾向参考,实盘前请在 MT5 用脚本复算。
◍ 量化表之外还能试什么
这套选择量化表的思路靠近似分数挑预测因子,实验跑过不少,但没贴余额曲线——即便模型样例看着还行,也建议多堆几个预测因子再拿去实盘贵金属或外汇,那边杠杆高、跳空频繁,样本同质性差时容易翻车。 附件里 Q_Error_Otbor.mq5(248.4 KB)管数据预处理和量化表挑选,CB_Bat_v_02.mq5(54.01 KB)用 CatBoost 出训练任务,CSV_fast.mqh(472.63 KB)归 Aliaksandr Hryshyn 所有得另行下载,三个文件凑齐才能在 MT5 脚本目录里直接编译跑通。 近似分数只是敲门砖,评估数据有用性不妨换别的指标试试;真要信这套,先开 MT5 把脚本挂上观察挑选结果,别直接拿去下真金白银的单。