機器學習之時間序列

arima

創建時間序列

timestamp
period
interval
date_range 可以指定開始時間與週期  H D M
rng = pd.date_range('2016/07/01', periods=10, freq='D') #起始時間 週期 

time = pd.Series(np.random.randn(20), index=pd.date_range(dt.datetime(2013,1,1),periods=20))

time.truncate(before="2016/01/01")過濾

數據重採樣
時間數據由一個頻率轉換到另一個頻率
降採樣 升採樣

ts.resample(‘M’) .sum() .mean() 一個月的總和,均值 3D,

ffill空值取前面的值
bfill空值取後面的值
interpolate線性取值

滑動窗口
基於窗口做平均

data = pd.Series(np.random.randn(600), index=pd.date_range('7/1/2016',freq='D',periods=600))
data.rolling(window=10) 
data.mean()   窗口的均值

plt.figure(figsize=(15,5))
df.plot(style='r--')
df.rolling(window=10).mean().plot(style='b')

平穩性要求序列的均值和方差不發生明顯變化
嚴平穩 :不隨時間改變而改變 ,
弱平穩:期望與相關係數(依賴性)不變 未來某時刻的值依賴於它的過去信息

差分法:時間序列在t與t-1時刻的差值

sentiment_short['diff_1'] = sentiment_short['UMCSENT'].diff(1)
sentiment_short['diff_2'] = sentiment_short['diff_1'].diff(1)
sentiment_short.plot(subplots=True, figsize(18.12))

自迴歸模型(AR)
描述當前值與歷史值之間的關係,
自迴歸模型必須滿足平穩性的要求 (平穩性,自相關性,自相關係數小於0.5不宜採用)

I 差分
p爲自迴歸項,q爲移動平均項數,d爲時間序列成爲平穩時所做的差分次數
移動平均模型(MA)
自迴歸模型中的誤差項的累加
有效地消除預測中的隨機波動

自相關係數ACF
有序的隨機變量序列與自身相比較
自相關函數反映了同一序列在不同時序的取值之間的相關性

偏自相關係數
PACF 剔除了k-1個隨機變量的干擾之後 x(t-k)對x(t)的影響

import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodel.tsa.api as smt

import seaborn as sns

ARIMA建模流程:
1.將序列平穩(差分法確定d)
2.p和q階數確定:ACF和PACF
3.ARIMA(p,d,q)

繪圖模板:

def teplot(y, lags=None, title='', figsize=(14,8)):
    fig = plt.figure(figsize=figsize)
    layout =(2,2)
    ts_ax = plt.subplot2grid(layout,(0,0))
    hist_ax = plt.subplot2grid(layout,(0,1))
    acf_ax = plt.subplot2grid(layout,(1,0))
    pacf_ax = plt.subplot2grid(layout,(1,1))

    y.plot(ax=ts_ax)
    ts_ax.set_title(title)
    y.plot(ax=hist_ax, kind='hist', bins=25)
    hist_ax.set_title('Histogram')
    smt.graphics.plot_acf(y, lags=lags, ax=acf_ax)
    smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax)
    [ax.set_xlim(0) for ax in [acf_ax,pacf_ax]]
    sns.despine()
    plt.tight_layout()
    return ts_ax, acf_ax, pacf_ax

arima200 = sm.tsa.SARIMAX(ts_train, order=(2,0,0))
model_results = arima200.fit()

import itertools
p_min=0
d_min=0
q_min=0
p_max=4
d_max=0
q_max=4

result_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],
                                          columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
for p,d,q in itertools.product(range(p_min,P_max+1), 
                                            range(d_min,d_max+1), 
                                            range(q_min,q_max+1)):
    if p==0 and d==0 and q==0:
        results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)]=np.nan
        continue
    try:
        model = sm.tsa.SARIMAX(ts_train, order(p,d,q),)
        result = model.fit()
        result_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bic
    expect:
        continue
results_bic = results_bic[results_bic.columns].astype(float)

AIC:遲遲信息準則
BIC:貝葉斯信息準則
k爲模型參數個數,n爲樣本數量, L爲似然函數

模型殘差檢驗:

股票預測

import pandas_datareader
import datetime
from matplotlib.pylab import style
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf

stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0])

stock_week = stock['Close'].resample('W-MON').mean()
stock_train = stock_week['2000':'2015']

stock_train.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("Stock Close")
sns.despine()

stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()
plt.figure()
plt.plot(stock_diff)
plt.title('一階差分')
plt.show()

acf=plot_acf(stock_diff, lags=20)
plt.title("ACF")
acf.show()

model = ARIMA(stock_train, order=(1,1,1),freq='W-MON')
result = model.fit()
result.summary()
pred = result.predict('20140609', '20160701', dynamic=True, typ='levels')

plt.figure(figsize=(6,6))
plt.plot(pred)
plt.plot(stock_train)

model = ARIMA(a_train_diff2, order=(1,2,1),freq='D')
result = model.fit()
pred = result.predict('2016/11/22', '2016/11/30', dynamic=True)
plt.figure(figsize=(15,5))
plt.plot(pred, c='b')
plt.plot(time, c='r')
plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章