欢迎访问369期货网 369会员登录 注册

当前位置: 主页 > 期货量化

量化交易实战21 - 因子与支持向量机(一)什么是支持向量机?用代码怎么实现?

时间:2025-10-14 15:19|来源:369期货网|作者:369期货网|点击:

在机器学习领域,支持向量机(Support Vector Machine,SVM)也曾是红极一时的算法。与决策树类似的是,支持向量机也可以用于解决非线性的问题。如果用语言来描述,其原理有一些复杂、生涩,下面我们还是用更直观的方式来帮助朋友们理解什么是支持向量机。

一、支持向量机的基本原理

我们先来说说支持向量机里的“支持”和“向量”是什么意思。拿分类任务来举例:模型要能够将样本根据特征归纳至不同的类别,就会有一个区分的“边界”。而支持模型找到这个“边界”的向量就是支持向量。我们可以用图像来进一步理解,输入代码如下:

    # 先导入要用的库import numpy as npimport matplotlib.pyplot as plt# 导入支持向量机分类模型from sklearn import svm# 这里我们用 scikit-learn 自带的样本生成工具from sklearn.datasets import make_blobs# 生成50个样本,分成2个类# 注意 cluster_std 设为1,使两类样本比较容易区分X, y = make_blobs(n_samples=50, centers=2, cluster_std=1)# 创建 SVC 实例,选择线性内核# 正则化参数设置大一点,为1000clf = svm.SVC(kernel='linear', C=1000)# 拟合样本数据clf.fit(X, y)# 下面来画图,首先用散点图来绘制样本plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)# 然后找到样本的上下限ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()# 在画布中创建网格,以便绘制决策边界xx = np.linspace(xlim[0], xlim[1], 30)yy = np.linspace(ylim[0], ylim[1], 30)YY, XX = np.meshgrid(yy, xx)xy = np.vstack([XX.ravel(), YY.ravel()]).TZ = clf.decision_function(xy).reshape(XX.shape)# 绘制决策边界ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,           linestyles=['--', '-', '--'], linewidths=1)# 找出支持向量# 注意:原图中这句未完成,正确应为:# ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],#            s=100, facecolors='none', edgecolors='k')# 显示图像plt.show()

    运行结果:图

    图片

    【结果分析】图1中很清晰地展示了支持向量的概念——在50个样本中,有3个样本被选了出来(图中在线上的点)。这3个样本,作为支持模型进行分类的向量,帮助模型找到了决策边界(图中的黑色实线)。这就是“支持向量机”名称的由来。

    二、线性内核的局限性

    看过因子与线性模型的朋友就会疑惑:从图①来看,支持向量机和线性模型的样子很像啊!那二者有什么区别呢?

    确实,因为我们在这里设置了支持向量机的内核为线性(lincar),所以模型表现出来的样子就与线性模型非常接近了。不过,假设样本的分布不像上图中那样可以用一条直线来分割的话,恐怕线性内核的支持向量机就会表现差一些了,如下面这段代码所展示的:

      # 1. 导入库import numpy as npimport matplotlib.pyplot as pltfrom sklearn import svmfrom sklearn.datasets import make_blobs# 2. 生成样本(cluster_std=5 使两类更分散)X, y = make_blobs(n_samples=50, centers=2, cluster_std=5, random_state=0)# 3. 训练线性 SVMclf = svm.SVC(kernel='linear', C=1000)clf.fit(X, y)# 4. 画样本点plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)ax = plt.gca()xlim, ylim = ax.get_xlim(), ax.get_ylim()# 5. 生成网格用于决策边界xx = np.linspace(xlim[0], xlim[1], 30)yy = np.linspace(ylim[0], ylim[1], 30)YY, XX = np.meshgrid(yy, xx)          # 注意顺序:先 yy 后 xxxy = np.vstack([XX.ravel(), YY.ravel()]).TZ  = clf.decision_function(xy).reshape(XX.shape)# 6. 自动计算 levels,避免“No contour levels”警告z_min, z_max = Z.min(), Z.max()levels = np.linspace(z_min, z_max, 5)          # 5 条等距等高线ax.contour(XX, YY, Z, colors='k', levels=levels, alpha=0.5,           linestyles=['--', '-', '--'])# 7. 标出支持向量ax.scatter(clf.support_vectors_[:, 0],           clf.support_vectors_[:, 1],           s=100, facecolors='none', edgecolors='k')# 8. 显示plt.show()

      运行结果:图②

      图片

      【结果分析】从图②中可以看到,当我们把clusterstd的值增加到5的时候,虽然线性内核的支持向量机能够做出分类预测,但是正确率下降了很多--很多样本的分类都是错误的。这也是线性内核的局限性所在。

      三、 RBF内核

      遇到图②中的情况时,恐怕使用线性模型就很难把模型准确率进一步提高了。不过这难不住支持向量机,因为它还有一个“黑科技”--RBF内核。

      RBF内核全称是径向基内核(RadialBasisFuncton),它是利用样本在空间中的欧氏距离来判断样本是否处于同一个分类当中。因此,我们只要控制径向基内核的距离参数,队能够调节模型的拟合度。

      下面用代码展示:

        # 创建 RBF 核 SVM 实例gamma_scale = 1.0 / (X.shape[1] * X.var())   # 等价于 gamma='scale'clf2 = svm.SVC(kernel='rbf', C=1000, gamma=gamma_scale)clf2.fit(X, y)# 画图ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()# 用之前生成的网格 xyZ2 = clf2.decision_function(xy).reshape(XX.shape)# 画决策边界与间隔ax.contour(XX, YY, Z2, colors='k', levels=[-1, 0, 1], alpha=0.5,           linestyles=['--', '-', '--'])# 标出支持向量ax.scatter(clf2.support_vectors_[:, 0], clf2.support_vectors_[:, 1],           s=100, facecolors='none', edgecolors='k')plt.show()

        运行结果:图③

        图片

        【结果分析】从图③中可以看到,RBF内核的支持向量机与线性内核的支持向量机简直是“判若两机”--它不再是用一条直线去尝试将样本进行分类,而是根据不同样本的距离,在空间中划分若干个“区域”,然后把处于不同区域的样本放入对应的类别中。

        这样看来向量机还是很厉害的,但能不能用在实战中帮各位挣到钱,还需要找到合适的因子,后面我们将继续探讨用的合适的因子去使用。

        注:代码是聚宽代码,避免直接使用,如果实盘的话可以用QMT读取聚宽信号再交易,等讲完向量机我这边演示一下用QMT读取聚宽信号。

        量化实战 · 目录上一篇量化交易小技巧 -01- 量化下单的时候如何避免重复信号导致重复下单下一篇量化交易实战22 - 因子与支持向量机(二)动态因子选择策略,根据思路写代码,完整代码直接复制可回测阅读 138



        编辑推荐

        Copyright © 2024-2025 成都宁时科技有限公司 版权所有

        蜀ICP备2022023994号