股票預(yù)測之BP神經(jīng)網(wǎng)絡(luò) 股票預(yù)測的算法有很多,可以用數(shù)學(xué)的卡爾曼濾波,粒子濾波、馬爾科夫、神經(jīng)網(wǎng)絡(luò)......
這其中涉及到很多因素,比如說,你用的特征,你選擇的范圍(針對個(gè)股還是多股、歷史時(shí)間范圍、分析周期等等)。小編自身對股票了解不深,僅僅是從數(shù)據(jù)的角度分析。(有點(diǎn)想的太簡單了O(∩_∩)O)
先從簡單的入手:簡單的算法:BP神經(jīng)網(wǎng)絡(luò); 簡單的范圍:個(gè)股、每日線、5個(gè)特征:開盤、最高、最低、收盤、漲幅。個(gè)股數(shù)據(jù)量大概有2000個(gè)。
當(dāng)然,這個(gè)過程和普通的BP沒什么兩樣,也是輸入數(shù)據(jù),訓(xùn)練、測試這么一個(gè)過程,主要是看BP是否真的適合用來做預(yù)測。雖然有點(diǎn)簡單,不過還是簡單的描述一下吧。
數(shù)據(jù)從哪里來?這里我是用了同花順這個(gè)軟件,然后選一個(gè)股,按照 分析——>k線圖——>按F1——>進(jìn)入歷史行情數(shù)據(jù)。點(diǎn)擊右鍵——>導(dǎo)出數(shù)據(jù)——>下一步......這樣就可以得到連續(xù)的歷史數(shù)據(jù)表。接下來就是讀出數(shù)據(jù),進(jìn)行訓(xùn)練和預(yù)測了。
首先,這里選用其中的5個(gè)特征:{開盤、最高、最低、收盤、漲幅}。這里用前一天的這樣一個(gè)特征向量來預(yù)測下一個(gè)交易日(時(shí)刻)的收盤。也就是說,輸入是這5維特征,輸出是下一時(shí)刻的收盤。
有了這些數(shù)據(jù),有確定了輸入和輸出,那就直接創(chuàng)建BP來訓(xùn)練。參數(shù)大多是默認(rèn)的,隱層的轉(zhuǎn)移函數(shù)選擇sigmoid函數(shù),其他參數(shù)可依據(jù)需要一步一步調(diào)整。這里選擇前面1500個(gè)作為訓(xùn)練,后面的200個(gè)作為測試樣本,訓(xùn)練過程并不快,主要是梯度的閾值設(shè)的太低,迭代次數(shù)有點(diǎn)高、機(jī)器的性能也一般(⊙o⊙)…好了,是不是很期待測試結(jié)果(*^__^*) ……
![]() 總體的預(yù)測和跟隨效果還行,但是局部分析起來還是有很多不足,容易劇烈跳動,總體普遍偏小,在這邊很關(guān)鍵的一點(diǎn)要指出,訓(xùn)練的數(shù)據(jù)的覆蓋范圍要盡可能大,如果你的測試數(shù)據(jù)不再訓(xùn)練的RANGE里面,很可能跑偏,甚至是一條直線。哪怕是你用頭尾兩端數(shù)據(jù)來訓(xùn)練,效果都比用一大段數(shù)據(jù)而沒有覆蓋后面或前面的數(shù)據(jù)來的好。在初次訓(xùn)練時(shí)候,由于有些參數(shù)是隨機(jī)初始化的,又因?yàn)锽P容易陷入局部極小值,所以有可能會一下子就收斂,結(jié)果是一條直線%>_<%。好了,股票預(yù)測比較簡單的方法之BP就介紹到這里了。對了,不放代碼是不是有點(diǎn)不厚道?_?。盡管代碼很簡單.....
data=xlsread('路徑.xls');
PP=data'; PQ=[0; 0; 0; 0 ;0]; P=zeros(5,1500); %輸入矩陣 T=zeros(1,1500); %輸出 for i=1:1500 %輸入輸出賦值 PQ=PP(:,i); P(:,i)=PQ; T(i)=PP(4,i+1); end % 創(chuàng)建一個(gè)新的前向神經(jīng)網(wǎng)絡(luò) net_1=newff(minmax(P),[30,1],{'tansig','purelin'},'traingdm') % 當(dāng)前輸入層權(quán)值和閾值 inputWeights=net_1.IW{1,1}; inputbias=net_1.b{1}; % 當(dāng)前網(wǎng)絡(luò)層權(quán)值和閾值 layerWeights=net_1.LW{1,1}; layerbias=net_1.b{1}; % 設(shè)置訓(xùn)練參數(shù) net_1.trainParam.show = 50; net_1.trainParam.lr = 0.005; net_1.trainParam.mc = 0.9; net_1.trainParam.epochs = 10000; net_1.trainParam.goal = 1e-3; % 調(diào)用 TRAINGDM 算法訓(xùn)練 BP 網(wǎng)絡(luò) [net_1,tr]=train(net_1,P,T); % 對 BP 網(wǎng)絡(luò)進(jìn)行仿真 A = sim(net_1,P); % 計(jì)算仿真誤差 E = T - A; MSE=mse(E) %--------------------------測試數(shù)據(jù)-----------------------------% x=InputA(1501:1700); %測試數(shù)據(jù) x=zeros(5,200); for j=201:400 x(:,(j-200))=PP(:,j); end YY=sim(net_1,x) %用神經(jīng)網(wǎng)絡(luò)測試 XX=[1:length(x)]; plot(XX,YY,'-O'); %畫出結(jié)果 hold on; plot(XX,PP(4,1502:1701),'r-O'); %真實(shí)結(jié)果 |
|