資源簡介
基于三層BP神經網絡的股票數據預測模型(MATLAB2014)
文件列表:
BP_ZXF.m
BP_ZXF.xlsx

代碼片段和文件信息
clear?all
clc
clf
%采用三層BP網絡結構
%輸入層神經元數為5,隱含層神經元數為3,輸出層神經元數為1
%最大迭代次數
maxcishu=5000;
%e為計算輸出和樣本實際輸出差
%在內存中開辟maxcishu個存儲空間
e=zeros(maxcishu1);
%?輸入數據維度5,輸入節點數5
%?maxp當日最高價序列
%?minp當日最低價序列
%?sp當日開盤價
%?ep當日收盤價
%?tnum當日成交量
%?調用數據
%shuju=xlsread(‘dm.xlsx‘?‘B1:K151‘);
shuju=importdata(‘BP_ZXF.xlsx‘);
sp=shuju.data(:1)‘;
maxp=shuju.data(:2)‘;
minp=shuju.data(:3)‘;
tnum=shuju.data(:10)‘;
ep=shuju.data(:4)‘;
%將數據集按照2:1分為訓練樣本集,和測試樣本集
jishu=length(ep);
jishu=ceil(jishu/3*2)?;
%測試樣本集是2/3處到最后一個
spt=sp(jishu+1:end);
maxpt=maxp(jishu+1:end);
minpt=minp(jishu+1:end);
tnumt=tnum(jishu+1:end);
ept=ep(jishu+1:end);
%訓練樣本集
sp=sp(1:jishu);
maxp=maxp(1:jishu);
minp=minp(1:jishu);
tnum=tnum(1:jishu);
ep=ep(1:jishu);
%記錄下每組的最大值最小值,為訓練樣本集的歸一化準備
maxp_max=max(maxp);
maxp_min=min(maxp);
minp_max=max(minp);
minp_min=min(minp);
ep_max=max(ep);
ep_min=min(ep);
sp_max=max(sp);
sp_min=min(sp);
tnum_max=max(tnum);
tnum_min=min(tnum);
%?目標數據為次日的收盤價,相當于把當日收盤價時間序列向前挪動一個單位
goalp=ep(2:jishu);
%數據歸一化將所有數據歸一化到(0?1)
guiyi=@(A)((A-min(A))/(max(A)-min(A)));
maxp=guiyi(maxp);
minp=guiyi(minp);
sp=guiyi(sp);
ep=guiyi(ep);
tnum=guiyi(tnum);
%?后面的目標數據goalp個數是ep向前移動一位得到,所以最后一組的目標數據缺失
%?所以,要把除了目標數據goalp以外的所有數據序列刪除最后一個
maxp=maxp(1:jishu-1);
minp=minp(1:jishu-1);
sp=sp(1:jishu-1);
ep=ep(1:jishu-1);
tnum=tnum(1:jishu-1);
%需要循環學習次數loopn,即訓練樣本的個數
loopn=length(maxp);
%為了方便表示將5個行向量放到一個5*loopn的矩陣中simp中每一列是一個樣本向量
simp=[maxp;minp;sp;ep;tnum];
%隱含層節點n
%根據相關資料,隱含層節點數比輸入節點數少,一般取1/2輸入節點數
bn=3;
%隱含層激活函數為S型函數
jihuo=@(x)(1/(1+exp(-x)));
%bx用來存放隱含層每個節點的輸出
%bxe用來保存bx經過S函數處理的值,即輸出層的輸入
bx=zeros(bn1);
bxe=zeros(bn1);
%權值學習率u
u=0.02;
%W1(mn)表示隱含層第m個神經元節點的第n個輸入數值的權重,
%即,每一行對應一個節點
%所以輸入層到隱含層的權值W1構成一個bn*5的矩陣,初值隨機生成
W1=rand(bn5);
%W2(m)表示輸出節點第m個輸入的初始權值,采用隨機生成
W2=rand(1bn);
%loopn個訓練樣本,對應loopn個輸出
out=zeros(loopn1);
for?k=1:1:maxcishu
????
????%訓練開始i表示為本次輸入的是第i個樣本向量
????for?i=1:1:loopn
????????
????????%求中層每個節點bx(n)的輸出,系數對應的是W1的第n行
????????for?j=1:1:bn
????????????bx(j)=W1(j:)*simp(:i);
????????????bxe(j)=jihuo(bx(j));
????????end
????????
????????%求輸出
????????out(i)=W2*bxe;
????????
????????%誤差反向傳播過程
????????%計算輸出節點的輸入權值修正量結果放在行向量AW2中
????????%輸出神經元激活函數?f(x)=x
????????%為了書寫方便,將deta用A代替
????????AW2=zeros(1bn);
????????AW2=u*(out(i)-goalp(i))*bxe‘;
????????
????????%計算隱含層節點的輸入權值修正量結果放在行向量AW1中需要對隱含層節點逐個處理
????????AW1=zeros(bn5);
????????for?j=1:1:bn
????????????AW1(j:)=u*?(out(i)-goalp(i))*W2(j)*bxe(j)*(1-bxe(j))*simp(:i)‘;
????????end
????????W1=W1-AW1;
????????W2=W2-AW2;
????end
????
????%計算樣本偏差
????e(k)=sum((out-goalp‘).^2)/2/loopn;
????%誤差設定
????if?e(k)<=0.01
????????disp(‘迭代次數‘)
????????disp(k)
????????disp(‘訓練樣本集誤差‘)
????????disp(e(k))
????????break
????end
end
%顯示訓練好的權值
W1
W2
%繪制誤差收斂曲線,直觀展示收斂過程
figure(1)
hold?on
e=e(1:k);
plot(e)
title(‘訓練樣本集誤差曲線‘)
%?計算輸出和實際輸出對比圖
figure(2)
plot(out‘rp‘)
hold?on
plot(goalp‘bo‘)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????4614??2015-11-24?19:19??BP_ZXF.m
?????文件???????24599??2015-11-11?23:24??BP_ZXF.xlsx
評論
共有 條評論