第 4 章 · 02 支持向量机 SVM 本节摘要:线性模型(上节)只能学线性关系,但选股数据里有大量非线性——「高 PE + 高波动」可能比单纯高 PE 更糟,这种交互效应线性模型捕捉不到。支持向量机 SVM 通过核技巧(Kernel Trick)把数据映射到高维空间,让原本非线性的边界变成高维空间的线性边界,从而学到复杂分类规则。华泰人工智能系列第 3 篇系统测试了 SVM 在 A 股选股的效果,核心结论是:SVM 在分类任务上常优于线性模型,但超参数选择(核函数类型、正则强度)极敏感,且训练成本随样本量超线性增长。本节讲清 SVM 的两大核心:最大间隔思想与核技巧(线性/多项式/RBF),以及在选股场景的实战要点与陷阱。
本节摘要:线性模型(上节)只能学线性关系,但选股数据里有大量非线性——「高 PE + 高波动」可能比单纯高 PE 更糟,这种交互效应线性模型捕捉不到。支持向量机 SVM 通过核技巧(Kernel Trick)把数据映射到高维空间,让原本非线性的边界变成高维空间的线性边界,从而学到复杂分类规则。华泰人工智能系列第 3 篇系统测试了 SVM 在 A 股选股的效果,核心结论是:SVM 在分类任务上常优于线性模型,但超参数选择(核函数类型、正则强度)极敏感,且训练成本随样本量超线性增长。本节讲清 SVM 的两大核心:最大间隔思想与核技巧(线性/多项式/RBF),以及在选股场景的实战要点与陷阱。
内容来源:仓库研报 华泰人工智能系列第 3 篇(支持向量机),知识结构化整理。
⚠️ 学习提示:SVM 在 2010 年代是机器学习的主流,但在大数据场景下已被 Boosting/神经网络取代。在选股里 SVM 仍有一席之地(尤其小样本分类),但要警惕它的训练成本与超参敏感性。
阅读完本节,你应当能够:
上节讲线性模型用一条直线(或超平面)分割涨跌两类股票。但选股数据里很多关系是非线性的:
线性模型对非线性数据表现差。SVM 通过两个核心思想解决这个问题:最大间隔与核技巧。
给定训练数据,SVM 不只找一个能分对的超平面,而是找让两类之间间隔(margin)最大的那个超平面。
超平面: w·x + b = 0 间隔 = 2 / ||w|| (即 w 越小,间隔越大) 目标: min ||w|| / 2 约束 y_i · (w·x_i + b) ≥ 1
间隔最大化对应 w 的最小化,所以 SVM 等价于一个约束优化问题。
为什么最大间隔能提升泛化:
💡 核心心法:SVM 的最大间隔思想与正则化(上节)异曲同工——都在控制模型复杂度。线性模型通过惩罚系数大小,SVM 通过最大化间隔,目标都是「找到最稳健的分类边界,而非训练集上最准的边界」。
现实数据通常不是完美线性可分的。软间隔允许部分样本被误分类或落入间隔内,引入松弛变量 ξ:
约束变为: y_i · (w·x_i + b) ≥ 1 - ξ_i (ξ_i ≥ 0) 目标: min ||w|| / 2 + C · sum(ξ_i)
C 是关键超参:
C 的选择要用交叉验证,选使样本外表现最优的值。在选股场景,C 通常偏小——因为金融数据噪声大,「容忍少量误分类」往往泛化更好。
如果数据本身非线性可分(任何超平面都分不好),核技巧把数据映射到更高维空间,在高维里它们就变得线性可分。
经典例子:二维平面上一个圆环里的点无法用直线与外圈分开,但映射到三维(加入 x^2 + y^2 这个维度),就能用一个平面切开。
核函数:无需显式计算高维映射 φ(x),直接定义两个点在高维空间的内积:
K(x_i, x_j) = <φ(x_i), φ(x_j)>
这是核技巧的精妙——用核函数代替显式映射,计算复杂度可控。常用核:
K(x_i, x_j) = x_i · x_j
不做升维,等价于线性 SVM。适合因子数多、样本量大的场景(如选股里几千因子、上万样本),训练快。
K(x_i, x_j) = (γ · x_i · x_j + r)^d
d 是多项式阶数,捕捉因子间的交互效应(如 PE × ROE)。但高阶多项式容易过拟合,且数值不稳定,实战少用。
K(x_i, x_j) = exp(-γ · ||x_i - x_j||^2)
RBF 是最常用的核,理论上可以映射到无限维空间,能拟合任意复杂的边界。
γ 参数:
| 核函数 | 适用 | 超参 | 过拟合风险 |
|---|---|---|---|
| 线性核 | 大样本、稀疏特征 | C | 低 |
| 多项式核 | 显式交互效应 | C, γ, d, r | 高(数值不稳) |
| RBF 核 | 通用、非线性 | C, γ | 中(γ 敏感) |
💡 关键观察:在 A 股选股里,RBF 核是最常用的选择——它能捕捉因子的非线性组合。但 γ 与 C 的组合极度敏感,华泰 AI 3 的实证里,RBF SVM 的表现在不同超参下波动巨大,必须用网格搜索 + 时序交叉验证选超参。
除了分类(SVC),SVM 也可做回归(SVR)——预测连续收益。SVR 的思想是容忍 ε 范围内的预测误差,只对误差超过 ε 的样本计算损失:
损失: max(0, |y - ŷ| - ε) 目标: min ||w|| / 2 + C · sum(max(0, |y - ŷ| - ε))
SVR 在「未来 N 日收益」回归任务上可用,但实战中分类(SVC)更常见——如前所述,分类抗噪声、契合选股逻辑。
decision_function 算距离),不是真正的概率。要按概率排序选股,需要 Platt scaling 或 isotonic regression 校准。| 维度 | 线性模型 | SVM(核) |
|---|---|---|
| 非线性 | 不能 | 能(尤其 RBF) |
| 可解释性 | 高(看系数) | 低(黑箱) |
| 训练成本 | 低 | 高(随样本超线性增长) |
| 小样本 | 一般 | 好 |
| 超参敏感性 | 低(主要 λ) | 高(C, γ) |
| 概率输出 | 直接(逻辑回归) | 需校准 |
| 大样本 | 好 | 训练慢 |
华泰 AI 3 的实证显示,SVM 在 A 股选股里有时优于线性模型,但优势不稳定——在因子截面少(每月一次)、样本相对小的场景,SVM 的非线性建模优势显现;但在大批量样本时,训练成本与超参敏感性使其相对 Boosting(下下节)优势缩小。
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV # 注意:实战用时序 CV,见第04节 from sklearn.preprocessing import StandardScaler # 标准化(SVM 对尺度极敏感) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) # RBF SVM,网格搜索超参 param_grid = {'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1]} svm = SVC(kernel='rbf', probability=True) # probability=True 启用概率输出 grid = GridSearchCV(svm, param_grid, cv=时序CV) grid.fit(X_train_scaled, Y_train) # 预测概率 prob = grid.predict_proba(scaler.transform(X_test))[:, 1]
几个工程要点:
LinearSVC 或子采样,SVC 训练会非常慢。⚠️ 学习提示:sklearn 默认的
GridSearchCV用随机 k 折交叉验证,在时序数据上会引入未来函数——训练集包含了未来时点的数据。选股调参必须换成时序 CV(第 04 节详讲),这是机器学习选股最容易踩的坑。
下一节,我们换一种思路——用决策树与随机森林做选股,看树模型如何用「if-else 规则」捕捉非线性,并天然给出特征重要性。