SVM预测基于SVM进行股票预测matlab源码

Posted Matlab咨询QQ1575304183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVM预测基于SVM进行股票预测matlab源码相关的知识,希望对你有一定的参考价值。

一、简介

 

先回顾一下在基本线性可分情况下的SVM模型:

分类svm模型中要让训练集中的各个样本点尽量远离自己类别一侧的支持向量。

其实回归模型也沿用了最大间隔分类器的思想。

\\varepsilon -insensitive误差函数

对于回归模型,优化目标函数和分类模型保持一致,依然是\\min_{w,b}\\frac{\\left \\| w \\right \\|^2}{2},但是约束条件不同。我们知道回归模型的目标是让训练集中的每个样本点(x_i,y_i),尽量拟合到一个线性模型y_i=w^Tx_i+b上。对于一般的回归模型,我们是用均方误差作为损失函数的,但SVM不是这样定义损失函数的。

SVM回归算法采用\\varepsilon -insensitive误差函数,\\varepsilon -insensitive误差函数定义为,如果预测值\\hat{y_i}与真实值y_i之间的差值\\left | \\hat{y_i}-y_i \\right |\\leq \\epsilon,则不产生损失,否则,损失代价为\\left | \\hat{y_i}-y_i \\right |-\\epsilon

如下图所示,在蓝色带里面的点都是没有损失的,但是外面的点是有损失的,损失大小为红色线的长度。

æ¯æåéæºï¼SVMï¼çåå½æ¨¡å

总结一下,SVM回归模型的损失函数度量为:

下图为\\varepsilon -insensitive误差函数与平方误差函数的图形 

è¿éåå¾çæè¿°

目标函数

观察上述的 E_\\epsilon 误差函数的形式,可以看到,实际形成了一个类似管道的样子,在管道中样本点,不做惩罚,所以被称为\\epsilon -tube,如下图阴影红色部分 

è¿éåå¾çæè¿°

采用 E_\\epsilon 替代平方误差项,因此可以定义最小化误差函数作为优化目标:

这个损失函数与从最大间隔分类推过来的不太相似,可以参考我写的从LR到SVM这篇文章,将二分类的Hinge Loss换成\\varepsilon -insensitive误差函数就可以了。

由于上述目标函数含有绝对值项不可微。我们可以转化成一个约束优化问题,常用的方法是为每一个样本数据定义两个松弛变量\\xi_i\\geq0,\\hat{\\xi_i}\\geq0,表示度量真实值 \\hat{y_i} 与\\epsilon -tube的距离。 

当样本点真实值 \\hat{y_i} 位于管道上方时,\\xi_i>0 ,写成表达式:\\hat{y_i}>w^Tx_i+b+\\epsilon时,\\xi_i>0\\hat{\\xi_i}=0; 

当样本点真实值 \\hat{y_i} 位于管道下方时,\\hat{\\xi_i}>0 ,写成表达式:\\hat{y_i}<w^Tx_i+b-\\epsilon时,\\xi_i=0\\hat{\\xi_i}>0; 

因此使得每个样本点位于管道内部的条件为:

当 \\hat{y_i}  位于管道上方时,\\xi_i>0,有\\hat{y_i}-(w^Tx_i+b)-\\xi_i\\leq\\epsilon 
当 \\hat{y_i}  位于管道下方时,\\hat{\\xi_i}>0,有(w^Tx_i+b)-\\hat{y_i}-\\hat{\\xi_i}\\leq\\epsilon

误差函数可以写为一个凸二次优化问题:

拉格朗日对偶

和SVM分类模型一样,我们也可以用拉格朗日函数将目标优化函数变成无约束的形式:

其中{\\alpha }\\geq 0,\\hat{\\alpha}\\geq 0,{\\mu }\\geq 0,\\hat{\\mu}\\geq 0是拉格朗日的系数。

满足约束下 max L= f ,拉格朗日系数都为0,min max L=min f。若不满足约束max L=无穷大,min max L无解。即min max L在约束内的解就是min f 的解。在约束外无解。因此求解min max L得到的解就是在约束内min f的解.

求解问题转化为min max L,对偶问题为max min L.先对w,b,\\xi_i,\\hat{\\xi_i}求偏导数:

带回到拉格朗日函数中去,化简得到只关于\\alpha_i,\\hat{\\alpha_i}的函数,目标即最大化此函数。 

约束条件为:

0\\leq\\alpha_i\\leq C\\\\

0\\leq\\hat{\\alpha_i}\\leq C\\\\

其中\\kappa(x_i,x_j) = (x_i)^Tx_j为向量内积。现在为线性核,也可以更换为高斯核之类的非线性核函数。

下面考虑KKT条件:

由式(1),(2)知: 
\\alpha_i> 0时,必有\\epsilon+\\xi_i+w^Tx_i+b-\\hat{y_i}=0,\\xi_i\\geq0,这些点位于管道上方边界处,或者管道上面。 预测值比真实值小了。
\\hat{\\alpha_i}> 0时,必有\\epsilon+\\hat{\\xi_i}-(w^Tx_i+b)+\\hat{y_i}=0,\\hat{\\xi_i}\\geq0,这些点位于管道下方边界处,或者管道下面。 预测值比真实值大了。

同时,由式(1),(2)知,对于任意一个数据点,由于\\epsilon >0,则\\alpha_i,\\hat{\\alpha_i}不可能同时都大于0,而且得到在管道内部的点,必然有\\alpha_i=0,\\hat{\\alpha_i}=0。 

è¿éåå¾çæè¿°

超平面计算

根据前面的计算已经可以得到w=\\sum _{i=1}^N(\\alpha_i-\\hat{\\alpha_i})x_i

现在来计算b的值

由上述的分析,影响超平面参数的点为位于管道边界处,或者管道外面。 
关于b的计算,可以考虑在管道上方边界处一个点必然有: 

\\xi_i=0

\\epsilon+\\xi_i+w^Tx_i+b-\\hat{y_i}=0

可以解得:

b=\\hat{y_i}-\\epsilon -w^Tx_i\\\\\\ \\ \\ =\\hat{y_i}-\\epsilon -\\sum _{j=1}^N(\\alpha_j-\\hat{\\alpha_j})(x_j)^Tx_i\\\\=\\hat{y_i}-\\epsilon -\\sum _{j=1}^N(\\alpha_j-\\hat{\\alpha_j})\\kappa(x_i,x_j)

则预测函数为

y(x)=w^Tx+b\\\\=\\sum _{i=1}^N(\\alpha_i-\\hat{\\alpha_i})(x_i)^Tx+b\\\\=\\sum _{i=1}^N(\\alpha_i-\\hat{\\alpha_i})\\kappa(x_i,x)+\\hat{y_j}-\\epsilon -\\sum _{i=1}^N(\\alpha_i-\\hat{\\alpha_i})\\kappa(x_i,x_j)

其中(x_j,\\hat{y_j})为超平面管道上平面边界上的一点。

SVM回归模型系数的稀疏性

可以发现,对于\\left | \\hat{y_i}-w^Tx_i-b \\right |<\\epsilon的点(x_i,\\hat{y_i})(不包括边界),必有\\xi_i=0,\\hat{\\xi_i}=0

此时有\\epsilon +\\xi_i+w^Tx_i+b-\\hat{y_i}\\neq0,\\epsilon +\\hat{\\xi_i}-(w^Tx_i+b)+\\hat{y_i}\\neq0,要满足KKT条件,则\\alpha_i=0,\\hat{\\alpha_i}=0

我们定义样本系数\\beta_i=\\alpha_i-\\hat{\\alpha_i},根据上面w的计算式

w=\\sum _{i=1}^N(\\alpha_i-\\hat{\\alpha_i})x_i=\\sum _{i=1}^N\\beta_ix_i

我们发现此时\\beta_i=0,也就是说w不受这些在误差范围内的点的影响。对于在边界上或者在边界外的点,\\alpha_i>0,\\hat{\\alpha_i}>0,此时。

\\beta_i\\neq0。即w只受那些在tube管道边界及管道之外的点影响。同理b也是。

二、源代码

clear;
clc;

%load financial data of the stock price of Apple company
%The data is from Nov 18 1982-Nov 18 2012
%The data contains six collums:Open, High, Low, Close, Volume, Adj Close
sh = dlmread('yahoo.csv');
%The data needs to flip because the data is from latest to earliest.
sh = flipdim(sh,1);

%extract data
[m,n] = size(sh);
ts = sh(2:m,1);
tsx = sh(1:m-1,:);
original = ts(length(sh)*0.7+1:end,:);

% Draw the original graphic of the stock price
figure;
plot(ts,'LineWidth',1);
title('Yahoo Stock Price(1996.4.12-2012.11.16) before mapping','FontSize',12);
grid on;

fprintf('Plot the stock price before mapping.\\n');
fprintf('Program paused. Press enter to continue.\\n');
pause;

%data preprocessing
ts = ts';
tsx = tsx';

% mapminmax is an mapping function in matlab
%Use mapminmax to do mapping
[TS,TSps] = mapminmax(ts);
% The scale of the data from 1 to 2
TSps.ymin = 1;
TSps.ymax = 2;
%normalization
[TS,TSps] = mapminmax(ts,TSps);

% plot the graphic of the stock price after mapping
figure;
plot(TS,'LineWidth',1);
title('Yahoo Stock price after mapping','FontSize',12);
grid on;

fprintf('\\nPlot the stock price after mapping.\\n');
fprintf('Program paused. Press enter to continue.\\n');
pause;


% Transpose the data in order to meet the requirement of libsvm
fprintf('\\n Initializing.......\\n');
TS = TS';

[TSX,TSXps] = mapminmax(tsx);
TSXps.ymin = 1;
TSXps.ymax = 2;
[TSX,TSXps] = mapminmax(tsx,TSXps);
TSX = TSX';

三、运行结果

在这里插入图片描述

完整代码或仿真咨询QQ1575304183

 

以上是关于SVM预测基于SVM进行股票预测matlab源码的主要内容,如果未能解决你的问题,请参考以下文章

SVM预测基于SVM和LSR交通流预测matlab源码

SVM预测基于麻雀搜索算法优化的SVM数据分类预测matlab源码

SVM预测基于麻雀搜索算法优化的SVM数据分类预测matlab源码

SVM时序预测基于matlab鲸鱼算法优化支持向量机SVM时序数据预测含Matlab源码 2250期

电力负荷预测基于matlab日特征气象因素支持向量机SVM电力负荷预测含Matlab源码 1612期

SVM预测基于遗传算法优化实现SVM数据分类matlab源码