机器学习之matlab算法SVM用150天数据预测上证指数的涨跌

Matlab基于SVM的上证指数涨跌预测


#数据的提取
首先提取150天内上证指数的数据绘制成excel表格,并舍弃掉部分数据,最终保留开盘价作为首列,余列分别为收盘价,最高价,最低价,成交量,成交金额,此5项数据作为开盘价的特征参与模型训练。
在matlab程序内读取该excel.csv,选择导入数据,输出类型选择输出矩阵,(注:选择表作为输出类型则会得到一个table类型的矩阵并包含文字在内,不符合模型训练所需的类型),此时得到一个150×6的矩阵数据,右键选择并另存为datatest5.mat。

在这里插入图片描述
提取原始数据的第一列的所有行,赋值给t_train,作为开盘价的首个150×1数据,提取整个原始数据赋值给p_train(150×6),作为开盘价的特征数据参与模型计算。

clear all
clc
load datatest5.mat;

t_train = datatest5(:,1);% 表示访问该矩阵的所有行的第一列;
p_train = datatest5; % 表示建立一个等效矩阵;
% [m,n] = size(y);  获取矩阵各维的长度
% kp = y(2:m,3); 表示访问sh矩阵2到m行的第一列
% kpx = y(2:m-1,:);  表示访问sh矩阵1到m-1行的所有列

[pn_train,inputps] = mapminmax(p_train');
pn_train = pn_train';
[tn_train,outputps] = mapminmax(t_train');
tn_train = tn_train';

%% 选择回归预测分析最佳的SVM参数c&g
[c,g] = meshgrid(-10:0.5:10,-10:0.5:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 0;
bestg = 0;
mis = Inf;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j) ),' -s 3 -p 0.1'];
        cg(i,j) = libsvmtrain(tn_train,pn_train,cmd);
        if cg(i,j) < mis
            mis = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end
        if abs(cg(i,j) - mis) <= eps && bestc > 2^c(i,j)
            mis = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end
    end
end
% 2. 创建/训练SVM  
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];
model = libsvmtrain(tn_train,pn_train,cmd);
[Predict_1,error_1,decision_values1] = libsvmpredict(tn_train,pn_train,model);

predict_1 = mapminmax('reverse',Predict_1,outputps);
result_1 = [t_train predict_1];

%% VI. 绘图
figure(1)
plot(1:length(t_train),t_train,'r-*',1:length(t_train),predict_1,'b:o')
axis([0 160,-inf,inf])
grid on
legend('真实值','预测值')
xlabel('日期')
ylabel('开盘指数')
string_1 = {'预测结果对比';
           ['mse = ' num2str(error_1(2)) ' R^2 = ' num2str(error_1(3))]};
title(string_1)
figure(2);
mis = predict_1 - t_train;
plot(mis,'rd');
title('误差图(predicted data - original data)','FontSize',12);
xlabel('日期','FontSize',12);
ylabel('误差量','FontSize',12);
grid on;

figure(3);
mis_1 = (predict_1 - t_train)/t_train;
plot(mis_1,'rd');
title('相对误差图(predicted data - original data)/original data','FontSize',12);
xlabel('日期','FontSize',12);
ylabel('相对误差量','FontSize',12);
grid on;

本代码经过matlab实际验证,可以通过运行无报错,有报错的情况下考虑是否未安装livsvm3.23

本程序只有一个测试集,未加验证集,如需验证可自行添加

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页