数据科学与机器学习(第 15 部分):SVM,每个交易员工具箱中的必备工具(基础篇)
📘

数据科学与机器学习(第 15 部分):SVM,每个交易员工具箱中的必备工具(基础篇)

第 1/3 篇

「SVM 为什么该进交易员工具箱」

支持向量机(SVM)在分类与回归任务里靠「最大间隔」找决策边界,对高噪声的汇率、贵金属 tick 数据有不错的鲁棒性。MetaTrader 5 生态里已能借 ONNX 把 Python 训练的 SVM 模型直接丢进 EA 跑推理,省去重写算法的成本。 外汇与贵金属杠杆高、跳空频繁,SVM 给出的信号只是概率倾向,实盘前必须在 MT5 用历史数据做交叉验证。本文系列基于 2025 年 4 月发布的实战框架,后续会拆到线性 SVM、软间隔与 DualSVMONNX 类的具体接法。 如果你现在手头有 MT5 和 Python 环境,可以先把 sklearn 的 SVC 跑通,再考虑转 ONNX——这是后面所有小节的前置动作。

SVM 到底在算什么

支持向量机(SVM)属于监督学习,核心动作是在 N 维特征空间里找一条(或一组)能把不同类别样本分得最开的超平面。它和贝叶斯、逻辑回归那种靠简单概率模型贴标签的思路不同,SVM 背后是一套带约束的凸优化数学,目标是让两类样本到分界面的间隔最大。 在 MT5 的行情建模里,这意味着你喂进去的历史特征(比如均线斜率、波动率分位)会被映射到高维空间,算法自动选出少数‘支持向量’来决定边界位置,其余样本不影响结果。外汇与贵金属杠杆高、跳空频繁,这类边界在外样本上失效的概率不低,实盘前务必用历史数据回测。 本文后续只拿 SVM 做分类任务,例如判断下一根 K 线归属多头或空头区间,不做回归预测具体点数。

◍ 超平面在线性 SVM 里的几何与代数落点

超平面本质是一条把不同类别样本隔开的分隔线(或高维里的子空间)。二元分类里,若特征空间是 d 维,超平面就是 d-1 维;二维特征下它退化成一维直线,三维里则是平面。数学上写成 W·x - b = 0,W 是与超平面正交、决定朝向的权重向量,x 是输入特征向量,b 是标量偏置,负责把超平面推离原点。 SVM 的优化目标不是随便找条线,而是最大化间隔——超平面到两类最近样本(支持向量)的距离之和。间隔越大,模型对未见数据的鲁棒性可能越强,泛化误差倾向更低。新样本进来算一下 W·x - b 的符号,就能判它落在哪一侧、归为哪类。 代码里作者没转置 x,直接把 W 当列向量用,所以 hyperplane 函数就是 x.MatMul(W) - B。B 必须声明成 double,因为它是标量偏置而非向量。下面这段类骨架能看到 W、B 以及训练配置(batch_size / alpha / lambda / epochs)都挂在 CLinearSVM 里,验证时打开 MT5 导航器翻到该类即可对照。 别把 W 和 x 的维度想反了 作者明确说没转置 x 矩阵,W 就是向量直接参与 MatMul。若你抄去改成 x 转置形式,B 的减法和矩阵维度会直接编译报错,先确认自己用的究竟是行向量还是列向量约定。

MQL5 / C++
<span class="keyword">class="type">class="kw">double</span> CLinearSVM::hyperplane(<span class="keyword">vector</span> &amp;x)
 {
&nbsp;&nbsp; <span class="keyword">class="kw">return</span> x.MatMul(W) - B;&nbsp;&nbsp; 
 }
<span class="keyword">class</span> CLinearSVM
&nbsp;&nbsp;{
&nbsp;&nbsp; <span class="keyword">class="kw">protected</span>:
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMatrixutils&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matrix_utils;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMetrics&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;metrics;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPreprocessing&lt;<span class="keyword">vector</span>, <span class="keyword">matrix</span>&gt; *normalize_x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">vector</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W; <span class="comment">class=class="str">"cmt">//Weights vector </span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B; <span class="comment">class=class="str">"cmt">//bias term</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">bool</span> is_fitted_already;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="kw">struct</span> svm_config 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">uint</span> batch_size;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> alpha;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> lambda;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="type">uint</span> epochs;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp; <span class="keyword">class="kw">private</span>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svm_config config;
&nbsp;&nbsp;

「线性核怎么切分特征空间」

线性 SVM 把核函数固定为线性核,决策边界就是特征空间里的一条直线(高维下是超平面),不做任何非线性映射。优化目标直接在原始特征上求解,找那个使两类样本间隔最大的分隔面。 当数据本身线性可分时,这种最简单的形式往往比带 RBF 核的版本更稳,过拟合概率更低。若拿 EURUSD 的 H1 收盘价与波动率做二分类,线性边界在样本内可能把多空分得干干净净,但换到贵金属 XAUUSD 上,跳空造成的非线性会让间隔被压缩,高风险品种需警惕边界失效。 实操上,MT5 的 CSVM 类选 SVM_LINEAR 即可跑通,先确认特征是否近似线性再上复杂核,省算力也省坑。

对偶形式怎么把 SVM 算得更轻

对偶 SVM 不是另起炉灶的分类器,而是把原始 SVM 优化问题用拉格朗日乘子重写成另一种数学形态。改写后目标函数变成最大化关于乘子的对偶式,求解结果与原始问题等价,但计算路径更适配高维核空间。 在 MT5 接特征做信号分类时,若样本线性不可分(例如把 RSI、ATR、持仓比拼成特征向量),对偶形式配合核函数才能落到非线性边界上;硬间隔要求样本严格可分,实盘里几乎不满足,软间隔靠松弛变量允许少量错分,更贴近外汇与贵金属的高噪声环境。 对偶解出来的非零乘子位置就是支持向量,模型决策只由这些点决定。意味着你换一批行情回测,只要支持向量集稳定,分类边界就稳定;外汇/贵金属杠杆高、滑点大,用 SVM 信号仍属高风险,参数漂移需复核。

◍ 线性可分时的硬间隔推法

当训练样本在特征空间里能直接被一条直线或超平面切开,SVM 会去挑两个平行边界,把两类样本夹在中间、且让中间空白带尽量宽。这条空白带就是硬间隔,居中的那张超平面即最大间隔超平面。 对做过标准化或归一化的数据,上边界可写成 wᵀX - b = 1,落在这条线及上方统一判为类 1;下边界 wᵀX - b = -1,线及下方判为类 -1。两平面间距等于 2/‖w‖,想把间隔拉到最大,就得把 ‖w‖ 压到最小。 为防止任何一个样本闯进空白带,要加约束 yi(wᵀXi - b) ≥ 1:yi 是第 i 个样本的真实标签(±1),Xi 是第 i 行特征。这条不等式一旦满足,训练集线性可分时硬间隔就严格成立,MT5 上做特征工程后可用此条件校验分类边界是否过拟合噪声。

常见问题

SVM 可在特征空间里找一条间隔最大的分割线,用来区分涨跌样本,适合做趋势/震荡的分类初筛,但外汇贵金属高风险,结论仅作概率参考。
超平面就是特征空间里把两类样本分开的那条线或面,代数上是 w·x+b=0,几何上对应间隔中心,可直接映射到你的指标组合切面。
可以,小布盯盘的 AIGC 已内置常见品种的特征分类诊断,打开对应品种页即可看到 SVM 类信号倾向,你只需核对参数。
硬间隔要求样本线性可分、不容忍任何错分,实盘噪声大基本用不了;价格数据重叠时得用软间隔放宽容错。
不用深究推导,只要知道对偶形式让计算只依赖样本间点积,换核函数就能切非线性空间,调参比懂公式更实用。