基於ARIMA模型股票趨勢預測

隨著人們生活水平的提高,人們的投資方式也在發生著巨大的變化,越來越多的人開始關注並參與到股票市場投資中去。股票具有高收益的同時也具有高風險性,股票市場受眾多因素的影響,價格令人無法捉摸,股票價格預測的研究具有巨大的價值,因此對於股票價格的預測從股票市場誕生之日起,就成了股民與學者們不懈探索的難題。

本文以此為背景,建立ARIMA模型,用於研究股票的趨勢,並且得出股票預測的估計值,擬合度較高,適應性良好。


一、數據來源


本文的數據來源於某股市的交易數據,其中date 、 open 、high 、low 、close 、volumn各字段的含義分別為股票日期、開盤價、最高價、最低價、收盤價、股票價格。

基於ARIMA模型股票趨勢預測

<code>import csvimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import scipy as stats
import statsmodels.api as sm
from scipy import stats
from statsmodels.tsa.arima_model import ARIMA
df=pd.read_csv('stock_ren.csv',index_col='date') 
#讀取數據
df.head()/<code>
基於ARIMA模型股票趨勢預測

<code>df.index = pd.to_datetime(df.index)   #進行索引
df.index/<code>
基於ARIMA模型股票趨勢預測

<code>ts=df['open']  #時間序列的變量為"open",並賦值給"ts
"ts.head()  #讀出open的前5個數據/<code>
基於ARIMA模型股票趨勢預測

二、問題探索


建立模型,求解未來的股票價格。


三、平穩性檢驗


<code>plt.rcParams['font.sans-serif'] = ['simhei']  #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False   #用來正常顯示負號
ts.plot()
plt.title("Renshou Insurance")  #添加圖標題
plt.xticks(rotation=45) #橫座標旋轉45度
plt.xlabel('日期')   #添加圖的標籤(x軸,y軸)
plt.ylabel('開盤價')/<code>
基於ARIMA模型股票趨勢預測

做出開盤價的趨勢圖,可以看出該股票的開盤價格具有波動性。

<code># 繪製自相關圖
from statsmodels.graphics.tsaplots import plot_acf #導入自相關函數
plot_acf(ts,use_vlines=True,lags=30)  #"lags"自相關函數的滯後取值範圍,此處之後30階,繪製出原始數據"ts"的自相關圖
plt.show()  #展示原始數據"ts"的自相關圖/<code>
基於ARIMA模型股票趨勢預測

由自相關圖認為該樣本序列具有一定趨勢性且初步判斷為非平穩時間序列。

<code>#原始數據平穩性檢測(單位根檢驗)
plot_acf(ts,use_vlines=True,lags=30)  #"lags"自相關函數的滯後取值範圍,此處之後30階,繪製出原始數據"ts"的自相關圖
plt.show()  #展示原始數據"ts"的自相關圖  
print(u'原始序列的ADF檢驗結果為:', ADF(df[u'open'])) #展示單位根檢驗結果/<code>
基於ARIMA模型股票趨勢預測

由檢驗的結果顯示,Test Statistic的值是-1.5261142019098892,大於Critical Value給出的1%,5%,10%顯著性水平下的臨界值,同時p-value=-1.5261142019098892>0.05,因此無法拒絕原假設,說明該股票的開盤價序列是非平穩的。


四、差分運算


為消除隨機趨勢對於股票數據建模的影響 ,在此我們決定採用差分來消除隨機趨勢。

<code># 進行一階差分
D_ts = ts.diff().dropna() #對"ts數列"進行差分
D_ts.columns = [u'open差分']/<code>
<code># 繪製差分後時序圖
D_ts.plot()  #繪製出差分後的時序圖
plt.title("Renshou Insurance Open")  #添加圖標題
plt.show()   #展示差分後的時序圖/<code>
基於ARIMA模型股票趨勢預測

由差分後的時序圖,可以看出股票開盤價的隨機趨勢趨於平穩。

<code>from statsmodels.graphics.tsaplots import plot_acf #導入自相關函數
# 繪製差分後自相關圖與偏自相關圖
plot_acf(D_ts,use_vlines=True,lags=30)  #"lags"自相關函數的滯後取值範圍,此處之後30階,繪製出原始數據"ts"的自相關圖
plt.show() #展示差分後數據"D_ts"的自相關圖/<code>
基於ARIMA模型股票趨勢預測

由一階差分自相關圖,可以看出,該序列是趨於平穩的。

<code>from statsmodels.graphics.tsaplots import plot_pacf  #導入偏自相關函數
plot_pacf(D_ts,use_vlines=True,lags=30) #"lags"偏自相關函數的滯後取值範圍,此處之後30階,繪製出原始數據"ts"的自相關圖
plt.show()  #展示差分後數據"D_ts"的偏自相關圖/<code>
基於ARIMA模型股票趨勢預測

由一階差分偏自相關圖,同樣可以看出該序列趨於平穩。

<code># 對差分後數據進行單位根檢驗
#展示差分後單位根檢驗結果,返回統計量和p值

print(u'原始序列的ADF檢驗結果為:', ADF(D_ts))/<code>
基於ARIMA模型股票趨勢預測

由檢驗結果顯示得出,Test Statistic的值是-18.212736826608307小於Critical Value給出的1%,5%,10%顯著性水平下的臨界值,同時p-value=2.3904790005983094e-30<0.05,因此拒絕原假設,說明該開盤價序列經一階差分後是平穩的。

<code># 對差分後數據進行白噪聲檢驗
from statsmodels.tsa import stattools #對差分後達到平穩的數據進行白噪聲檢驗
LjungBox=stattools.q_stat(stattools.acf(D_ts)[1:12],len(D_ts)) #展示白噪聲檢驗結果,返回統計量和p值
LjungBox[1][-1]/<code>

結果為0.5486639075658513。

由運行出來的結果,我們可以得知,p-value=0.5486639075658513>0.05,因此無法拒絕原假設,也就是說此時差分後開盤價序列是平穩白噪聲序列。


五、模型定階


經一階差分後,數據序列變為平穩白噪聲序列,因此可初步判斷模型為AR(1)模型。

<code>from statsmodels.tsa.arima_model import ARIMA  
model=ARIMA(ts,order=(1,1,0))
result=model.fit(disp=-1)
result.summary()/<code>
基於ARIMA模型股票趨勢預測

<code>result.conf_int()#模型診斷/<code>
基於ARIMA模型股票趨勢預測

上述模型診斷結果中,通過z檢驗,我們發現P值均大於0.05,即無法拒絕原假設,說明模型診斷不通過,且係數的置信區間包含零,因此不能說在5%的置信水平下,所有係數都是顯著的,從而推翻AR(1)模型。



六、模型修正


<code>sm.tsa.arma_order_select_ic(D_ts,max_ar=6,max_ma=4,ic='aic')['aic_min_order'] #AIC確定階數
from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(ts,order=(2,1,2))
result=model.fit(disp=-1)
result.summary()/<code>
基於ARIMA模型股票趨勢預測

<code>result.conf_int()  #模型診斷/<code>
基於ARIMA模型股票趨勢預測

說明新修正的的模型為ARIMA(2,1,2),緊接著進行相應的診斷上述模型診斷結果中,通過z檢驗,我們發現所有P值中除截距項之外均小於0.05(說明沒有常數項),即拒絕原假設,說明模型診斷通過。為使模型更加精確,我們再進一步用confint()函數計算模型中的係數區間,上述運行結果中,可以看出,除截距項外,所有係數的置信區間都不包含零,因此我們可以說在5%的置信水平下,所有的係數都是顯著的,即模型通過檢驗。


七、模型預測


<code>result.forecast(5)/<code>
基於ARIMA模型股票趨勢預測

模型給出5天的股票預測值。

<code>

ax = plt.subplots(figsize=(12, 8))
ax = ts.ix['2015-09':].plot(ax=ax)fig = result.plot_predict(5,285)
plt.show()#數據預測並畫圖/<code>
基於ARIMA模型股票趨勢預測

數據擬合效果:

基於ARIMA模型股票趨勢預測

由圖可以看出數據擬合效果還可以,真實值與預測值相差不大。因此該模型對數據的預測有較好的效果。

後臺私信:python入門,獲取一份python入門視頻資料。


分享到:


相關文章: