%主成分神经网络
%%%%%%%%%%%%%%%%%%%%得到数据集X,X每行为一个样本,每一列为一个特征%%%%%%%%%%%%
clc
clear;
num=xlsread('stock.xls'); %此处用xlsread函数来阅读excel文件
[n,m]=size(num);
X0=num(n:-1:1,:); %excel表格中的数据是时间上从大到小排列的,此处把他修正为从小到大排列
Time=(1:n)';
figure('name','开盘与收盘价格随时间的变化情况','numbertitle','off')
plot(Time,X0(:,1),Time,X0(:,2),'linewidth',1.5);
grid on;
h=legend('开盘价','收盘价'); %标注
set(h,'location','SouthEast');
title('开盘与收盘价格变化');
xlabel('时间序号');ylabel('开盘收盘点位');
set(gca); %可不要
figure(2)
[AX,H1,H2]=plotyy(Time,X0(:,3),Time,X0(:,4),'plot');
grid on;
set(get(AX(1),'Ylabel'),'string','涨跌额')
set(get(AX(2),'Ylabel'),'string','涨跌幅')
title('涨跌额与涨跌幅随时间的变化');
xlabel('时间变化');
figure(3)
plot(Time,X0(:,5),Time,X0(:,6),'linewidth',1.5);
grid on;
h=legend('最高价','最低价');
set(h,'location','SouthEast');
title('最高价与最低价与时间的变化');
xlabel('时间序号');ylabel('点位');
set(gca);
figure(4)
[AX,H1,H2]=plotyy(Time,X0(:,7),Time,X0(:,8),'plot');
grid on;
set(get(AX(1),'Ylabel'),'string','成交量')
set(get(AX(2),'Ylabel'),'string','成交金额')
title('成交量与成交金额随时间的变化');
xlabel('时间变化');
%%%%%%%%%%%%%%%%%利用主成分分析法对X0(:,2)~X0(:,9)进行主成分分析,得到y1和y2%%%%%%%%%%%%
Time0=1:150; %用前150个样本进行训练,后50个样本用来做预测
nt=length(Time0);
StdX0=std(X0(Time0,:)); %按列求标准差,得到标准样本集
MeanX0=mean(X0(Time0,:));%求每列的平均值
X=(X0(Time0,:)-ones(nt,1)*MeanX0)./(ones(nt,1)*StdX0); %ones(nt,1)*MeanX0是(150,1)*(1,9),同理ones(nt,1)*StdX0
R=cov(X); %求标准样本集的特征协方差矩阵
[A,L]=eig(R); %计算R的全部特征值与特征向量,A为特征向量,L为特征值矩阵
Lambda=diag(L); %提取矩阵对角线
[Lambda,Num1]=sort(Lambda,'descend'); %sort排序函数,此处是把Lambda按descend降序排列
A=A(:,Num1);
Y=X*A; %得到方差由大至小排序的主成分,方差的大小即为特征值
cumEnergy=cumsum(Lambda);%如果A是一个向量,cumsum(A)返回一个向量,该向量中第m行的元素是A中第1行到第m行的所有元素累加和
Energy=cumEnergy(m);
nE=find(cumEnergy/Energy>0.85,1); %计算超过0.85的方差累计序号
%%[A,Y]=princomp(X); %不用上面代码用Matlab自带的主成分分析函数princomp也能得到
%%%%%%%%%%%%%%%%%%%%%利用神经网络进行训练%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ychoose=X*A(:,1:nE);
P=Ychoose(Time0,:)';
T=[X(Time0(2:end),4)',(X0(nt,4)-MeanX0(4))/StdX0(4)];
net=newff(minmax(P),[nE,20,1],{'tansig','tansig','tansig'},...
'trainlm','learngdm','msereg');
net=init(net);
net.performFcn='sse'; %设置性能函数 sse为和方差
net.trainParam.goal=0.01; %训练目标,默认为0
net.trainParam.show=20; %两次显示之间的训练次数
net.trainParam.epochs=50000; %神经网络最大训练次数
net.trainParam.mc=0.95; %神经网络的动量因子
[net,tr]=train(net,P,T); %设置好训练参数后对神经网络进行训练