此文章为《量化投资以MATLAB为工具》一书中支持向量机(SVM)部分,自己的实验记录。
测试数据为上证指数1990.12.19至2009.08.19的真实指数,数据大小为4579x6的矩阵。其中每一行表示每一个交易日的上证指数各种指标,6列分别表示当天上证指数的开盘指数、指数最高值、指数最低值、收盘指数、当日交易量和当日交易额。
下面按书中提到步骤,对流程进行介绍:
获取上证指数的数据
可以从本书的在线资源中下载所有源码以及数据,定位到此章后,即可得到名为『chapter_sh.mat』的数据。输出为图形,如下所示:
上证指数每日的开盘指数
选定自变量与因变量
选取第1个到第4578个交易日内每日的开盘指数、指数最高值、指数最低值、收盘指数、交易量和交易额作为自变量,选取第2个到第4579个交易日内每日的开盘数作为因变量。
代码如下:
[m, n] = size(sh);
ts = sh(2:m, 1);
tsx = sh(1: m-1, :);
数据预处理
通过使用mapminmax函数,对上证指数进行归一化处理,区间为1到2。处理后的图形如下图所示:
上证指数每日的开盘指数归一化结果
参数选择
通过自定义的SVMcgForRegress.m函数,实现对参数的选择,先进行粗略选择,再进行精细选择。
粗略选择
其二维及三维结果如下图所示:
粗略选择结果(二维)
粗略选择结果(三维)
精细选择
其二维及三维结果如下图所示:
精细选择结果(二维)
精细选择结果(三维)
训练及回归预测
通过libSVM工具提供的svmtrain以及svmpredict函数完成对数据的训练。效果如下:
原始数据和回归数据对比
从图中可以看到两者的数据基本是吻合的。
再通过predict - ts';得到两者的差值,生成的误差图如下:
误差图
再求得它们之间的相对误差图,如下所示:
相对误差图
从上图中可看到,后期预测数据相对实际数据的偏差较为平稳,基本处在0.1(10%)的区间内。
结语
通过对书中的随书代码进行重新校验,在此过程中,练习了MATLAB的使用,以及LibSVM类库的安装。
由于本书编写的时间较早,部分接口以及配置等都有所变动,在实验过程中,也遇到相关的问题,不过都通过网络方案予以解决。