美文网首页
SVM调参之股票预测

SVM调参之股票预测

作者: MunCN | 来源:发表于2019-06-16 22:15 被阅读0次

    博客搬家至 Mun: https://kiddie92.github.io

    简书同步更新

    上篇博客讲解了SVM的算法精髓,这篇来牛刀小试一回,主要内容包括:1) 利用SVM分类来预测上证指数的涨跌;2) 试试SVM调参。

    预测上证指数涨跌

    问题描述

    预测股票涨跌和预测指数涨跌的原理是一样的,都是利用“历史数据”来推测未来的走势。股票数据单纯来看也就是时间序列。这里我们利用分类方法来构建预测模型:

    • 首先,获取过去长时间内上证指数的数据
    • 计算这些数据的一些特征(features),比如:sma、wma、mom等
    • 利用特征数据构建训练数据(train dataset)x_train,保留部分数据作为测试集(test dataset)
    • 为数据打标签y_train:如果交易日当天的收盘价高于上一个交易日的收盘价,则为“+”数据,标签为“+1”,否则为“-1”
    • 利用svm对上述带有标签的数据进行分类
    • 给定测试数据,计算其特征数据,利用分类模型对其进行分类
    • 对比分类结果(“+1”对应“涨”,“-1”对应“跌”)和实际数据的涨跌情况,若一致则说明分类准确/预测准确

    这里需要注意的是x_trainy_train的对应关系至少要有一个交易日的时间差,否则,模型将毫无意义。

    写代码

    有了想法后,写代码就比较简单了,这里参考了优矿上一个SVM代码。代码最中主要的部分就是数据处理部分,如下所示:(点击源代码可以查看完整的源码文件)

    Tips:
    如果github上无法直接查看ipython notebook,可以点击这里将所要查看的文件的URL拷贝进入即可查看。

    for index in range(2,len(close_pri)):
        # 取数据[-2]表示使用的特征是由今天之前的数据计算得到的
        sma_data = talib.SMA(close_pri[:index],timeperiod=7)[-2]
        wma_data = talib.WMA(close_pri[:index],timeperiod=7)[-2]
        mom_data = talib.MOM(close_pri[:index],timeperiod=7)[-2]
        
        features = []
        features.append(sma_data)
        features.append(wma_data)
        features.append(mom_data)
        x_train.append(features)
        
        # 对今天的交易进行打标签,涨则标记1,跌则标记-1
        if close_pri[index-1] < close_pri[index]:
            label = 1
        else:
            label = -1
        y_train.append(label)
    

    SVM调参

    原本计划以此为例,测试一下不同的参数得到的分类结果,最终会对预测模型的泛化能力产生什么样的影响,这里改成参数sklearn中svm分类算法的参数简介了。

    首先来看一下sklearn中对svm分类问题给出的目标函数/loss

    sklearn中给出的svc公式如下,对比上篇文章的式(18),可以发现,这里的参数C是式(18)的倒数
    \min_{w,b,\zeta} \frac{1}{2}w^Tw+C\sum_{i=1}^{n} \zeta_i \\ subject to y_i(w^T\phi(x_i)+b) \ge 1-\zeta_i, \\ \zeta_i \ge 0, i=1,...n

    这里理解起来类似于反演问题的正则化方法,整个目标函数可以看作是一个罚函数/penalty function,C可以看作是惩罚因子。那么,C越大,表示要求惩罚项越小,the vise versa,这里则表示分类越准确,距离是不是最大的稍微有那么一丢丢不那么重要。可以想象如果C是正无穷,则分类准确才是最最重要的,gutter的宽度已经不重要了,这时的模型必然会过拟合。
    这么一来,还需要分析的参数只有核函数的参数了。
    sklearn官方的参数如下(额,这么多,,),下面挑几个重要的来看一下:

    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    

    decision_function_shape:‘ovo’ OR ‘ovr’,对于多分类问题,ovo表示两两做分类,ovr表示,其中一个类和其他所有做分类
    degree:就是多项式核函数里面的degree了
    max_iter:最大迭代次数,针对SMO算法
    tol:迭代总会有终止条件的
    gamma:rbf核函数的参数,gamma越大,表示精度越高,因为高斯函数会越高瘦嘛;过拟合也就越严重了,therefore,如果高斯核都搞不定的分类,那就别用svm了吧

    安装ta-lib

    安装ta-lib时遇到一点点坑,记录一下。

    按照官方ta-lib的方法先安装依赖:

    wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
    tar -vxf ta-lib-0.4.0-src.tar.gz
    cd ta-lib/
    ./configure --prefix=/usr  # 此处是选取lib文件存放位置
    

    试一下:ipython3

    In [1]: import talib
    In [2]:   
    

    如果导入模块报错:libta_lib.so.0: cannot open shared object file: No such file or directory,则考虑是/usr/lib/下的的库文件没有被加载到系统环境变量内,导致导入模块的时候没有找到库文件libta_lib.so.0,添加环境变量即可:

    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib' >> ~/.bashrc
    

    总结

    1. 实现了用svm做二分类来预测上证指数
    2. 对sklearn的SVC参数做了一定的分析
    3. ta-lib这个模块在CentOS上安装时可能出现一些问题

    Reference

    1. 优矿SVM教程
    2. sklearn-SVM参数说明

    相关文章

      网友评论

          本文标题:SVM调参之股票预测

          本文链接:https://www.haomeiwen.com/subject/qgenfctx.html