数据科学与机器学习(第 15 部分):SVM,每个交易员工具箱中的必备工具(基础篇)
「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 的减法和矩阵维度会直接编译报错,先确认自己用的究竟是行向量还是列向量约定。
<span class="keyword">class="type">class="kw">double</span> CLinearSVM::hyperplane(<span class="keyword">vector</span> &x) { <span class="keyword">class="kw">return</span> x.MatMul(W) - B; } <span class="keyword">class</span> CLinearSVM { <span class="keyword">class="kw">protected</span>: CMatrixutils matrix_utils; CMetrics metrics; CPreprocessing<<span class="keyword">vector</span>, <span class="keyword">matrix</span>> *normalize_x; <span class="keyword">vector</span> W; <span class="comment">class=class="str">"cmt">//Weights vector </span> <span class="keyword">class="type">class="kw">double</span> B; <span class="comment">class=class="str">"cmt">//bias term</span> <span class="keyword">class="type">bool</span> is_fitted_already; <span class="keyword">class="kw">struct</span> svm_config { <span class="keyword">class="type">uint</span> batch_size; <span class="keyword">class="type">class="kw">double</span> alpha; <span class="keyword">class="type">class="kw">double</span> lambda; <span class="keyword">class="type">uint</span> epochs; }; <span class="keyword">class="kw">private</span>: svm_config config;
「线性核怎么切分特征空间」
线性 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 上做特征工程后可用此条件校验分类边界是否过拟合噪声。