基于BP神經網絡的深證綜指開盤指數預測

說明:剛學習,試著做一做,2016.10月

摘要:本文利用深證綜指1995年12月19日到2016年12月14日的開盤價、收盤價、最高價、最低價、成交量五組數據建立三層的BP神經網絡模型,利用matlab進行擬合、預測。選取前4500條數據對模型進行學習和訓練,然后用后587條的數據對模型進行預測,發現預測結果的誤差比較大,考慮到中國股市由于諸多因素具有較大的偏差性,考慮選取短期數據預測,即從2016年開始,共232條來進行建模分析,最后發現短期預測的效果比較好。結果表明,BP神經網絡模型在短期內具有良好的泛化能力,在深證綜指的預測方面有很好的預測能力,有很強的現實意義。

關鍵詞:BP神經網絡;深證綜指;開盤指數;預測

引言

證券市場作為現代經濟重要的組成部分,如何能夠準確地分析和預測市場走勢一直受到人們的關注。建立一個準確度比較高的股市預測模型對于金融投資及宏觀經濟調控等都具有重大的實用價值。隨著證券市場混沌和分形理論的逐步確立,人們開始利用神經網絡對證券市場的變動加以預測。神經網絡是一種重要的人工智能技術,在應用上已經迅速擴展到包括金融時序分析在內的許多重要領域中。

近年來,在利用神經網絡預測證券指數方面,一些人已經做了不少有益的嘗試,取得了一些成果。其中,上海工程技術大學的郝勇在為上海市社會科學基金項目《運用神經網

絡技術研究上海證券股票價格分類指數的波動規律》所做的研究中,使用了BP的原型算法對上證指數的走勢做了多個時間跨度為單日的預測,得到了平均相對誤差為1.8%-2.5%的結果。

廈門大學的雷震在2002年,用改進過的BP神經網絡對上證指數的走勢做了短程預測,在預測時間跨度為單日,連續預測次數為10次的條件下,得到結果為相對誤差為2.61%,預測數據與真實數據的相關性為0.56;其模型在預測時間跨度為兩日,連續短程預測10天的條件下,得到的相對誤差為4.87%,但是預測數據與真實指數之間的相關性則迅速劣化到只有0.13。

天津大學的馬軍海等人則使用了算法更為復雜的小波神經網絡算法對多只上海交易所上市股票做了時間跨度從1到3日的預測。其中,當預測時間跨度為1日時,得到的相對誤差不超過2.5%;當預測的時間跨度提高到3日時,相對誤差則迅速放大到10%以上。

從上文所提到的相關研究成果來看,使用神經網絡進行時序分析的方法已經被不少人所認可。目前,利用神經網絡對股票指數預測所涉及的算法主要有BP算法、RBF算法、小波算法等。而目前關于股票指數的研究依然有很多經典算法包括遺傳算法,ARCH,GARCH模型,支持向量機,時間序列和多元回歸方法,馬爾科夫鏈等。這些方法的預測有一定的精度,但是僅僅局限于線性問題分析,并不能很好地解決股票市場中的非線性問題。本文基于以上考慮,采用BP神經網絡這一非線性模型,來對股票市場時間序列進行預測,以達到很好的預測效果。

一,BP神經網絡的基本原理

(一),基本概念

BP神經網絡無須輸入函數公式,可以自動根據輸入輸出數據擬合進行學習記憶,所以其可以學習一些看上去沒什么聯系的數據,得出一些類似于指標的數據的分類與預測。BP神經網絡一般具有三層或三層以上的神經網絡,其是誤差反向傳播神經網絡的簡稱,它由輸入層,隱含層,輸出層構成。BP神經網絡類似于一個只有輸入輸出但是看不到中間的運行計算環節的黑箱。雖然其中間過程的無法看到,但是BP神經網絡中間的隱含層根據數據有著一定學習規則可以存儲利用,所以可以訓練這種網絡,讓網絡可以擁有一定的預測能力。神經網絡的研究應用相當廣泛,可以使用神經網絡對某些指標(如空氣質量、水質量、個人業績等)進行“有限”的分類、預測、評價等。所以針對股票指數這項指標,可以利用神經網絡來進行預測。

(二),BP神經網絡

BP模型是一種可以自我學習的網絡,其本質上就是希望在學習的過程之中使得誤差平方和最小。BP神經網絡會在學習的過程中不斷糾錯,首先根據輸入層指標正向計算,然后利用梯度下降的方法反向傳播輸出的誤差來調整權值,使得誤差平方和達到最小。其學習的兩個過程為:

(1)向前計算:

隱層節點的輸出為:

其中,是輸出結點中對應于輸入指標的權值,為閥值

輸出層節點的輸出為:

其中,是輸出結點M對應于隱含層輸出結點的權值。M為輸出指標。

(2)反向傳播:

反向傳播是要將每個節點的誤差反向從輸出層返回到輸入層,這樣來調整每個節點的權值,使得誤差平方和最小。第i個單元節點的輸出誤差:

,總誤差為。

是i節點的期望輸出值;是i節點的實際輸出值。

二,數據說明

(一)數據

本文選取自1995年12月19日到2016年12月16日深證綜指的歷史數據,共5087條。

從中選取4500條作為訓練數據,而剩余587條作為預測數據,用來與模型預測的結果進行比較,從而判斷模型的預測效果。

而發現誤差較大之后,本文則選取從2016年開始的數據,共232條來進行建模分析,其中前200條為訓練數據,后32條為預測數據:

三,模型建立

(一)指標設計

BP神經網絡模型可以對某些指標進行“有限”的分類、預測、評價,本研究也以BP神經網絡模型為基礎框架。相關文獻以及實際經濟問題的分析得出:開盤指數會受到最高價格、最低價格、收盤指數、成交量這幾個重要指標的影響。根據BP神經網絡本研究設計2個一級指標變量:指數因素、成交量因素。定義如表1:

表1一級指標定義

一級指標

定義

指數因素

影響開盤指數的相關價格。

成交量因素

成交量。

為了建立BP神經網絡,必須設計相對應的指標體系如表2:

表2指標體系

輸出指標

一級指標

二級指標

下一日開盤價

指數因素

開盤價,最高價,最低價,收盤價

成交量因素

成交量

(二)層數設計

神經網絡模型的建立是一個比較簡單的過程,首先必須設定每一層神經節點的個數。確定好個數之后,需要根據情況查看分析修正BP神經網絡的結構,并且針對神經網絡的各個參數進行設定,之后開始運行。

(1)由于上文之中建立的指標體系中有2個一級指標,5個二級指標,所以輸入層的神經元個數5。同時,最后確定的指標為開盤價,所以輸出層神經元個數為1。

(2)由于BP神經網絡類似于黑箱,所以中間的計算過程我們不可能知道,所以隱含層的確定存在一定的問題。如果隱含層的神經元個數比較少,那么對于整個的神經網絡來說不容易聚斂,如果個數太多的話,對于神經網絡的學習具有極大的負擔,網絡拓撲結構過于復雜,會使計算機的學習速度變慢,同時最后得到的誤差的平方和不一定就是最小的誤差平方和。所以隱含層神經元個數的確定我們利用經驗得出。

設輸入層神經元個數為M,輸出層神經元個數為N,隱含層神經元個數為n,那么,為1到10之間的常數。根據經驗,多次嘗試,本模型中的隱含層神經元個數為11。

(3)根據上述的分析,得到本文的BP神經網絡模型如圖:

輸入層5隱含層11輸出層1

┆┆┆

(三)模型建立

綜上所述,選用三層結構BP神經網絡結構,隱層節點數為11,輸出層節點數為1。以1995年12月19日的開盤指數,最高指數,最低指數,收盤指數和成交量作為網絡的第一個輸入數據,第二日的開盤價為第一個輸出數據;隱層的傳遞函數確定為tansig,輸出層神經元的傳遞函數為purelin,訓練函數為traingdx;設定樣本學習結束條件為誤差精度E為0.001,循環次數為10000次,學習速率初始值設定為0.1,動量因子的初始值設定為0.9。

四,實證分析

經過分析,我們建立神經網絡模型:輸入層為5,隱層神經元個數為11,輸出層為1

經過訓練,發現數據的擬合度已經可以達到0.99877,擬合效用已經比較良好,且訓練誤差已經比較小。

但利用此模型進行預測,發現:

預測值與真實值之間的誤差較大。而右圖預測的誤差點大約開始出現在2015年初附近,考慮現實情況,正好是2015年股市的瘋狂時刻,大盤齊漲。可以發現,在2015年前與2016年以后,預測的結果都是比較準確的,預測線與實際線基本吻合。

考慮到中國股市受外界影響較大,并且目前還不規范等原因。預測時,需要舍棄一些由于特定因素存在而導致的極端數據。

綜上所述,我們選擇從2016年開始的數據,共232條來進行建模分析,其中前200條為訓練數據,后32條為預測數據。修正數據以后的模型:

輸入層為5,隱層神經元個數為11,輸出層為1。

通過神經網絡的訓練,數據的擬合度已經可以達到0.99539,擬合程度已經比較良好。訓練線不斷接近理想情況,表現出良好的訓練水平。

利用模型進行預測,可以發現:

預測結果良好。表明此模型具有良好的現實意義。

五,結論

BP神經網絡利用變量之間存在的隱性關系進行建模,克服了傳統統計方法預測的屏障,有很好的的學習能力、組織能力以及適應能力,其可以在無法判斷變量之間存在何種關系的情況下通過類似神經元細胞之間復雜聯系的方式來分析變量之間情況,并對未來情況進行預測。本文通過選取1995年12月19日到2016年12月14日的深證綜指的數據構建神經網絡模型,選取最高價,最低價,開盤價,收盤價,成交量作為輸入神經元指標,將第二日的開盤價作為輸出指標。構建了的一個三層神經網絡,并運用LM算法來對模型進行學習與訓練,取前4500個數據為訓練樣本,從第4501天到5087天作為預測樣本對所訓練的模型進行檢測,發現預測值與真實值之間的擬合效果不是很好,發現與2015年的股市瘋漲現象有關。舍棄極端數據,對數據進行修正,選取從2016開始的數據前200個數據為訓練樣本,后32個作為預測樣本對所訓練的模型進行檢測,發現預測值與真實值之間的誤差平均控制在0.001量級上,達到了很好的預測效果,說明本文訓練的BP神經網絡短期內在深證綜指的訓練方面的預測能力是非常有效的,具有很強的現實意義。

代碼只是參考,自己以后需要改進:clear

sz=[2008.8687 2016.2952 2002.6531 2004.0004 18017321364

2001.3215 2001.3215 1989.1454 1990.3374 15530988592

1988.7727 2003.6708 1987.1452 2001.6272 17289896781

2000.3796 2000.8999 1989.1237 1990.8534 17569670361

1991.9842 1992.7826 1980.6646 1990.2616 19963323006

1990.3361 1990.3361 1977.5196 1980.9857 19384171022

1981.1436 1981.1436 1963.1944 1964.1359 18926354291

1962.5298 1962.5298 1943.7595 1944.2903 17911537234

1945.1065 1964.5612 1941.7635 1958.2563 18083032944

1958.1151 1958.6709 1943.2508 1945.5126 16469173542

1947.0404 1968.6195 1943.6429 1963.0644 18465883317

1964.3225 1966.8243 1958.4345 1964.7753 16196754225

1964.7455 1965.3103 1946.9865 1948.9253 18190347763

1950.319 1956.7713 1947.838 1954.794 18895697415

1954.6236 1956.3784 1939.6337 1940.8422 17440207380

1941.7932 1941.7932 1915.3143 1924.2313 15135013608

1927.1742 1931.1923 1917.9097 1925.9001 14032234451

1927.5716 1927.5716 1906.8357 1910.2137 12574917637

1909.7889 1920.0944 1904.6693 1918.7881 9878505110

1917.3168 1917.3168 1906.6535 1906.6878 10373500827

1904.0358 1907.0673 1892.3022 1894.2422 11084386301

1896.4503 1902.1402 1893.8794 1901.5286 12481034793

1902.1441 1907.0392 1888.0912 1888.0912 13330395500

1885.7748 1889.2388 1854.6766 1854.6766 12638853423

1857.4582 1868.5958 1850.6114 1858.9774 11457201672

1864.5903 1875.6403 1860.5217 1867.9784 11920532501

1873.0205 1873.0205 1823.5066 1844.5042 14120461722

1851.4101 1915.0212 1804.532 1914.9477 19327831367

1921.0021 1953.9279 1918.9707 1951.0011 14584425545

1951.3137 1973.0582 1949.7482 1966.6593 14691349323

1968.4292 1992.0823 1968.4292 1985.8597 15135279027

1989.2899 1999.6872 1988.2005 1993.0648 15856976958

1994.1528 1995.12 ? 1981.0363 1985.7589 15404848688

1988.1305 2003.5906 1987.3883 2003.3564 16793520022

2005.5773 2011.2622 2004.999 2008.3418 17215477811

2008.7865 2008.7865 1984.3772 1986.4918 17626163154

1985.954 1985.954 1972.5501 1972.5501 14279956346

1969.1115 1973.849 1962.4436 1967.5277 13102330955

1966.2367 1979.4098 1965.1574 1969.0277 12992263282

1972.3457 1982.9123 1968.6842 1978.4704 13842144626

];%第一列為開盤指數,第二列為最高指數,第三列為最低指數,第四列為收盤指數,第五列為成交量

%提取數據

[m,n]=size(sz);

ts=sz(2:m,1);? ? %將從第二天開始的開盤數作為預測的Y值

tsx=sz(1:m-1,:)

%數據預處理,將原始數據進行歸一化

TS=ts';

TSX=tsx';

%歸一化

[Pn1,minp1,maxp1]=premnmx(TS);

[Pn2,minp2,maxp2]=premnmx(TSX);

rand('state',0);%保證每次仿真的結果都相同

PR=[-1,1;1,1;-1,1;-1,1;-1,1]%p*2維的一個矩陣,每組輸入元素的最大值是1,最小值是-1

%創建網絡

net=newff(PR,[10,1],{'tansig','purelin'},'traingdx','learngdm','mse')

net.trainparam.show=50;

net.trainparam.lr=0.1;

net.trainparam.mc=0.9;

net.trainparam.epochs=10000;

net.trainparam.goals=0.001;

net=init(net);%初始化網絡

net=train(net,Pn2(:,1:40),Pn1(1:40));%訓練網絡,Pn2為輸入樣本矢量集,Pn1為目標矢量集

%仿真預測

test=Pn2(:,31:end);%從31個之后為預測(?包含第31個嗎)

Y=sim(net,test);

%反歸一化處理

P=postmnmx(Y,minp1,maxp1);

%相對誤差

e=(sz(32:m)-P)./sz(32:m);

res=norm(e)%求整個網絡的誤差

%畫圖

figure(1)

t=32:m

plot(t',sz(32:m),'-+',t,P,'o')

xlabel('交易日天數')

ylabel('開盤指數')

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 上一章“烏鴉嘴,你害死了大哥,”我一邊朝父親怒吼,一邊高速沖向母親,母親感覺我的氣息,略作停頓微微喘息,我并沒有停...
    一路鳴鴻閱讀 560評論 0 0
  • 公司里總有一些人經常閑著無事可干,領導走過去詢問原因,他就說:“您安排的事情做完了,沒事啦。”這樣的人每個公司都存...
    ElliotJu閱讀 249評論 0 0
  • 有一種感覺,每天無論你打開什么資訊平臺,滿屏的“小目標”首富,各路“大佬”“大咖”,最起碼也是一串后綴,無數個斜杠...
    職心眼兒閱讀 1,363評論 0 20
  • 我叫蘇虞,對沒錯就是上一章里面的狼狽至極的女孩子。 在經過了巨大的恐懼和不安疑慮后,我才猛然意識到自己的身體并不能...
    蘇虞閱讀 304評論 0 0