Matlab基于SVM的上证指数涨跌预测
#数据的提取
首先提取150天内上证指数的数据绘制成excel表格,并舍弃掉部分数据,最终保留开盘价作为首列,余列分别为收盘价,最高价,最低价,成交量,成交金额,此5项数据作为开盘价的特征参与模型训练。
在matlab程序内读取该excel.csv,选择导入数据,输出类型选择输出矩阵,(注:选择表作为输出类型则会得到一个table类型的矩阵并包含文字在内,不符合模型训练所需的类型),此时得到一个150×6的矩阵数据,右键选择并另存为datatest5.mat。
提取原始数据的第一列的所有行,赋值给t_train,作为开盘价的首个150×1数据,提取整个原始数据赋值给p_train(150×6),作为开盘价的特征数据参与模型计算。
clear allclcload 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:mfor j = 1:ncmd = ['-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) < mismis = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endif 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);endendend% 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 onlegend('真实值','预测值')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
本程序只有一个测试集,未加验证集,如需验证可自行添加