matlab實現BP演算法,預測上證指數漲跌
文章目錄
基本情況
-
對於很多人人為,股票預測是一個很難的問題。其實不然,運用今天這種數學工具你可以大概預測出股票的短期走勢。因為長期走勢受很多因素的影響。
-
運用MATLAB神經網路工具箱,快速建立BP網路結構。那麼你會問什麼是神經網路,那麼我下面就給大家簡單的介紹一下:
-
人工神經網路就是模擬人思維的第二種方式。這是一個非線性動力學系統,其特色在於資訊的分散式儲存和並行協同處理。雖然單個神經元的結構極其簡單,功能有限,但大量神經元構成的網路系統所能實現的行為卻是極其豐富多彩的。
-
人工神經網路首先要以一定的學習準則進行學習,然後才能工作。現以人工神經網路對手寫“A”、“B”兩個字母的識別為例進行說明,規定當“A”輸入網路時,應該輸出“1”,而當輸入為“B”時,輸出為“0”。
-
所以網路學習的準則應該是:如果網路作出錯誤的的判決,則通過網路的學習,應使得網路減少下次犯同樣錯誤的可能性。首先,給網路的各連線權值賦予(0,1)區間內的隨機值,將“A”所對應的圖象模式輸入給網路,網路將輸入模式加權求和、與門限比較、再進行非線性運算,得到網路的輸出。在此情況下,網路輸出為“1”和“0”的概率各為50%,也就是說是完全隨機的。這時如果輸出為“1”(結果正確),則使連線權值增大,以便使網路再次遇到“A”模式輸入時,仍然能作出正確的判斷。
-
如果輸出為“0”(即結果錯誤),則把網路連線權值朝著減小綜合輸入加權值的方向調整,其目的在於使網路下次再遇到“A”模式輸入時,減小犯同樣錯誤的可能性。如此操作調整,當給網路輪番輸入若干個手寫字母“A”、“B”後,經過網路按以上學習方法進行若干次學習後,網路判斷的正確率將大大提高。這說明網路對這兩個模式的學習已經獲得了成功,它已將這兩個模式分佈地記憶在網路的各個連線權值上。當網路再次遇到其中任何一個模式時,能夠作出迅速、準確的判斷和識別。一般說來,網路中所含的神經元個數越多,則它能記憶、識別的模式也就越多。
-
如圖所示拓撲結構的單隱層前饋網路,一般稱為三層前饋網或三層感知器,即:輸入層、中間層(也稱隱層)和輸出層。它的特點是:各層神經元僅與相鄰層神經元之間相互全連線,同層內神經元之間無連線,各層神經元之間無反饋連線,構成具有層次結構的前饋型神經網路系統。單計算層前饋神經網路只能求解線性可分問題,能夠求解非線性問題的網路必須是具有隱層的多層神經網路。
BP網路原始碼
%bp.m
%處理資料
clear
close all
echo on %視窗響應執行過程
clc
pause
a=xlsread('learn.xls',1,'A2:A301');%樣本時間序號
a1=xlsread('learn.xls',1,'A7:A301');%預測時間序號
b=xlsread('learn.xls',1,'C2:C301');%讀取指數
for i=1:1:295
y(i)=b(i+5);%理想輸出
end
for i=1:1:295
for j=1:1:5
x(j,i)=b(i+j-1);%輸入
end
end
a
x %以前五日預測明天的大盤指數的輸入矩陣
y %理想的輸出
%pause
[xn,minx,maxx,yn,miny,maxy]=premnmx(x,y) %資料歸一化處理
xn
yn
%pause
tic;
%建立神經網路
net=newff(minmax(xn),[11,1],{'tansig','purelin'},'trainlm');
net.trainparam.show=50; %顯示迭代過程
net.trainparam.lr=0.5; %學習率
net.trainparam.epochs=1000; %最大訓練次數
net.trainparam.goal=1e-3; %訓練要求精度
net.trainparam.mc=0; %動量因子
[net,tr]=train(net ,xn,yn); %訓練bp網路
t = toc;
t
pause
inputWeights=net.iw{1,1} %輸入層權值
inputbias=net.b{1} %輸入層閾值
layerWeights=net.lw{2,1} %輸出層權值
layerbias=net.b{2} %輸出層閾值
%對網路模擬預測
On = sim (net ,xn);
E=On-yn %計算誤差
M=sse(E)
N=mse(E)
%pause
a2=postmnmx(On,miny,maxy)
plot(a1,xn)
title('歸一化處理後的樣本','FontSize',12);
xlabel('統計時間2014.9.6-2015.11.10','FontSize',10);
ylabel('歸一化後的上證指數','FontSize',10);
figure;
plot(a1,yn)
plot(a,b,'*');
title('上證指數預測收盤價格','FontSize',12);
xlabel('統計時間2014.9.1-2015.11.10','FontSize',10);
ylabel('上證指數','FontSize',10);
hold on
plot(a1,a2,'r+');
legend('實際值','r預測值');
echo off
pause
clc
實現結果