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