上一節(jié)我們講了如何用tushare來獲取A股指數(shù)的數(shù)據(jù), 本節(jié)將接著來講如何利用Mathematica來預(yù)測指數(shù)。
Mathematica預(yù)測A股指數(shù)的步驟
導(dǎo)入A股指數(shù)數(shù)據(jù)
SetDirectory["E:\\cygwin64\\home\\van\\development\\stock"];
ASIndex=Import["AS_index.csv"];
ASIndex[[1;;3]]//TableForm
輸出為
date high low close volume amount 2018-06-28 2959.67 2913.97 2918.64 11821880600 129596964939 2018-06-27 2989.36 2931.14 2946.23 12927158700 142322455107
具體可以參考tushare對(duì)數(shù)據(jù)命名的解釋。我們這里關(guān)心的是date(日期)與close(收盤價(jià)格).
提取日期與收盤價(jià)格
t = ASIndex[[2;;, 1]];
InitialDate = ToExpression@StringSplit[Last@t, "-"];
tstd = DayCount[ToExpression@StringSplit[#, "-"], InitialDate] & /@ t;
v = ASIndex[[2;;, 5]];
vstd = v;
vstd[[1 ;; 3]]
時(shí)間t其實(shí)就是取出ASIndex中第二行到最后一行, 第一列的數(shù)據(jù), 然后我們用StringSplit將2018-06-29轉(zhuǎn)換為標(biāo)準(zhǔn)的日期格式{2018,06,29}, ToExpression去掉了06前面的0, 最后我們用DayCount來計(jì)算了日期差(當(dāng)前數(shù)據(jù)日期與最后一行的日期, 即數(shù)據(jù)最早日期); 而收盤價(jià)格v就是ASIndex中第二行到最后一行, 第五列的數(shù)據(jù)。這里我并沒有標(biāo)準(zhǔn)化(你可以vstd=v/Mean[v]), 最后vstd[[1;;3]]顯示vstd中開頭三個(gè)數(shù)據(jù)。
輸出為
{2918.64, 2946.23, 2979.13}
預(yù)測A股指數(shù)走勢
n = 60;
stocks = TimeSeries[Reverse[vstd[[;; n]]]];
testn = Floor[n/10];
teststocks = TimeSeries[Reverse[vstd[[testn ;; n]]]];
TimeSeriesModelFit[teststocks, "SARIMA"]
stocksMode = % // Normal
forecast = TimeSeriesForecast[stocksMode, teststocks, {0, 2 testn}];
ListLinePlot[{Normal[stocks], Normal[forecast][[1]]}, Filling -> Axis,
PlotRange -> All]
我們設(shè)置了預(yù)測樣本數(shù)據(jù)長度n為60天, 即考慮最近兩個(gè)月的數(shù)據(jù)。注意到我們的數(shù)據(jù)是從新到舊排列的, 故在使用TimeSeries將數(shù)據(jù)轉(zhuǎn)換為時(shí)間序列時(shí), 我們用了Reverse來倒置數(shù)據(jù)(這樣才是時(shí)間從小到大排列的數(shù)據(jù), 本來可以用{時(shí)間,數(shù)據(jù)}這樣的格式來標(biāo)記, 但是由于時(shí)間不是等標(biāo)記間距的, 這在后面會(huì)要求MMA進(jìn)行額外的處理, 故這里直接將時(shí)間標(biāo)記為數(shù)據(jù)的index).
接下來, 我們設(shè)置了檢驗(yàn)數(shù)據(jù)的長度testn, 即將10%的數(shù)據(jù)拿出來作為檢驗(yàn)本次模擬的效果。
然后就是我們的重點(diǎn)了, 使用MMA強(qiáng)大的擬合功能TimeSeriesModelFit來擬合我們的樣本數(shù)據(jù)teststocks, 這里SARIMA表示季節(jié)性積分自回歸平均移動(dòng)過程(參考wiki)以及這篇文章.
接著, 我們用TimeSeriesForecast函數(shù)來使用上面的得到的stocksMode模型來預(yù)測teststocks樣本在未來testn天的走勢, 注意, 2*testn中一個(gè)testn的預(yù)測數(shù)據(jù)用來檢驗(yàn)?zāi)P偷念A(yù)測可靠性, 另一個(gè)testn才是真正對(duì)未來的預(yù)測。
最后, 我們用圖形表示了原始數(shù)據(jù), 預(yù)測數(shù)據(jù)。

注記
應(yīng)該注意, 上面只是一個(gè)模型, 實(shí)際情況是如果我們設(shè)置不同的n, 則得到的結(jié)果可能完全不同。