首先多谢各位高手帮忙了,因为是毕业论文题目,确实很急...
我是用2009年1月-2010年9月这21个月的
中国GDP、CPI、货币供应量M1、进出口差额
美国GDP、CPI、货币供应量M1、进出口差额
这8个因素的每个月的样本值,和每个月相应的人民币美元均价汇率作为目标来训练网络,
来预测2009年10月到2011年1月这4个月的汇率。
但像最下面那样编完代码,预测的结果误差却很大,
实际值是 6.6732 6.6558 6.6515 6.6027
预测值是6.8208 6.8261 6.8228 6.8292
感觉完全没有参考性啊...
麻烦各位大师帮帮看看代码,还有几个问题:
1、是不是样本集太小了?但是这几个数据非常难收集,我很多都是找新闻手算的,如果要找这8个数据的月度值,高手们有什么好方案吗?或者有这类数据现成的的库文件、Excel都行。
2、是不是汇率预测如果不用时间序列的话误差都很大?
说明一下代码的参数,
Inputtrain是学习输入的8×21矩阵,按行依次是
中国GDP、CPI、货币供应量M1、进出口差额
美国GDP、CPI、货币供应量M1、进出口差额
Inputtrain_NORn是归一化的学习输入矩阵
相应的,
Outputtrain是学习的目标向量,也就是实际的汇率值,
Outputtrain_NORn是归一化的学习目标向量。
Inputtest是测试输入矩阵,Inputtest_NORn是归一化的测试输入矩阵
Outputtest是测试目标向量,也就是测试的实际汇率值,
Outputtest_NORn是相应的归一化向量。
完整代码(Matlab7编写):
function []=Statistics()
%%%学习数据归一化过程%%%
%clc
%format long
r1=21;
r2=4;
Inputtrain=[16436.29,16436.29,16436.29,18529.26,18529.26,18529.26,19488.75,19488.75,19488.75,29383.94,29383.94,29383.94,20144.25,20144.25,20144.25,23065.75,23065.75,23065.75,23955,23955,23955;
1.0+100,-1.6+100,-1.2+100,-1.5+100,-1.37+100,-1.67+100,-1.8+100,-1.2+100,-0.8+100,-0.5+100,0.6+100,1.9+100,1.5+100,2.7+100,2.4+100,2.8+100,3.1+100,2.9+100,103.3,103.5,103.6;
165214.34,166149.6,176541.13,178213.57,182010.87,193138.15,195889.27,200394.83,201708.14,207545.74,212493.18,220004.47,229588.98,224286.95,229397.93,233909.76,236497.88,240580.00,240664.07,244340.64,243821.90;
391.07,47.83,185.62,131.35,133.89,83.3,106.3,157,129.2,239.8,190.9,184.4,141.6,76.13,-72.4,16.8,195.3,200.3,287.3,200.3,168.8;
8723.92,8723.92,8723.92,8636.69,8636.69,8636.69,8897.27,8897.27,8897.27,9039.63,9039.63,9039.63,9014.81,9014.81,9014.81,9123.5625,9123.5625,9123.5625,9208.69,9208.69,9208.69;
100.3,100.4,99.9,100,100.1,100.7,100.1,100.4,100.2,100.2,100.2,100.2,100.2,100.0,100.1,99.9,99.8,99.9,100.3,100.3,100.1;
8309.8,8335.9,8469.5,8465.2,8444.1,8454.9,8419.9,8394.1,8399.4,8432.7,8506.3,8550.5,8476.3,8520.8,8583.0,8604.3,8586.5,8609.4,8579.9,8610.0,8651.2;
-360.67,-259.63,-275.8,-291.4,-248.6,-271.4,-330.9,-310.7,-351.6,-323.0,-352.7,-371.3,-346.5,-397.2,-395.1,-405.7,-419.96,-499.4,422.3,463.2,440.8];
for i1=1:8
Inputtrain_NORn(i1,:)=(Inputtrain(i1,:)-min(Inputtrain(i1,:)))/(max(Inputtrain(i1,:))-min(Inputtrain(i1,:)));
end
%Inputtrain_NORn
Outputtrain=[6.8382,6.8357,6.8341,6.8312,6.8245,6.8332,6.8320,6.8322,6.8289,6.8275,6.8274,6.8279,6.8273,6.8270,6.8264,6.8262,6.8274,6.8165,6.7775,6.7901,6.7462];
Outputtrainn=Outputtrain';
for k=1:1
Outputtrain_NORn(k,:)=(Outputtrain(k,:)-min(Outputtrain(k,:)))/(max(Outputtrain(k,:))-min(Outputtrain(k,:)));
end
%%%%测试数据归一化过程%%%%
Inputtest=[31937.25,31937.25,31937.25,24077.75;
104.4,105.1,104.6,104.9;
253300.00,259420.30,266621.30,263100.00;
271.5,229,130.8,64.5;
9212.69,9212.69,9212.69,9177.08;
100.2,100.1,100.5,100.4;
8706.8,8773.1,8853.4,8840.7;
382.3,382.4,402.6,469.7];
for i2=1:8
Inputtest_NORn(i2,:)=(Inputtest(i2,:)-min(Inputtest(i2,:)))/(max(Inputtest(i2,:))-min(Inputtest(i2,:)));
end
Outputtest=[6.6732,6.6558,6.6515,6.6027];
for h=1:1
Outputtest_NORn(h,:)=(Outputtest(h,:)-min(Outputtest(h,:)))/(max(Outputtest(h,:))-min(Outputtest(h,:)));
end
%Inputtrain_NORn
%Outputtrain
%Outputtrain_NORn
%Inputtest_NORn
%Outputtest
%Outputtest_NORn
%[pn,minp,maxp,tn,mint,maxt]=premnmx(Inputtrain_NORn,Outputtrain);
net=newff(minmax(Inputtrain_NORn),[5,1],{'tansig','purelin'},'trainlm');
net.trainparam.show=50;
net.trainParam.lr=0.01;
net.trainParam.epochs=1000;
net.trainParam.goal=1e-4;
[net tr]=train(net,Inputtrain_NORn,Outputtrain_NORn);
%[ptn,minpt,maxpt,ttn,mintt,maxtt]=premnmx(Inputtest_NORn,Outputtest);
a=sim(net,Inputtest_NORn);
figure(1);
X=1:8;
plot(a,'r*');
hold on;
plot(Outputtest_NORn,'bo')
title('o为真实值,*为预测值');
%for h=1:r2
% Outputtest_NORnn(1,h)=a(1,h)*(max(Outputtest(1,:))-min(Outputtest(1,:))+min(Outputtest(1,:)));
%end
%Outputtest
%Outputtest_NORnn
%a
end
感谢各位高手了!!!!