前言寫個介紹時(shí)間序列的,專注于用Python實(shí)現(xiàn)時(shí)間序列的一些模型及性質(zhì),如果想更多得學(xué)習(xí)理論,推薦參閱一些時(shí)間序列的書籍。 參考文獻(xiàn)1.《金融時(shí)間序列分析》 第2版 Ruey S.Tsay著 王輝、潘家柱 譯 一、與時(shí)間序列分析相關(guān)的部分基礎(chǔ)知識/概念1.1 什么是時(shí)間序列簡而言之: 例如: 某股票A從2015年6月1日到2016年6月1日之間各個交易日的收盤價(jià),可以構(gòu)成一個時(shí)間序列;某地每天的最高氣溫可以構(gòu)成一個時(shí)間序列。 一些特征: 季節(jié)變動:是時(shí)間序列在一年內(nèi)重復(fù)出現(xiàn)的周期性波動。它是諸如氣候條件、生產(chǎn)條件、節(jié)假日或人們的風(fēng)俗習(xí)慣等各種因素影響的結(jié)果。 循環(huán)波動:是時(shí)間序列呈現(xiàn)出得非固定長度的周期性變動。循環(huán)波動的周期可能會持續(xù)一段時(shí)間,但與趨勢不同,它不是朝著單一方向的持續(xù)變動,而是漲落相同的交替波動。 不規(guī)則波動:是時(shí)間序列中除去趨勢、季節(jié)變動和周期波動之后的隨機(jī)波動。不規(guī)則波動通??偸菉A雜在時(shí)間序列中,致使時(shí)間序列產(chǎn)生一種波浪形或震蕩式的變動。只含有隨機(jī)波動的序列也稱為平穩(wěn)序列。 1.2平穩(wěn)性在百度詞條中是這樣粗略的講的:平穩(wěn)時(shí)間序列粗略地講,一個時(shí)間序列,如果均值沒有系統(tǒng)的變化(無趨勢)、方差沒有系統(tǒng)變化,且嚴(yán)格消除了周期性變化,就稱之是平穩(wěn)的。 我們不妨先來看下: IndexData = DataAPI.MktIdxdGet(indexID=u'',ticker=u'000001',beginDate=u'20130101',endDate=u'20140801',field=u'tradeDate,closeIndex,CHGPct',pandas='1') IndexData = IndexData.set_index(IndexData['tradeDate'])IndexData['colseIndexDiff_1'] = IndexData['closeIndex'].diff(1) # 1階差分處理IndexData['closeIndexDiff_2'] = IndexData['colseIndexDiff_1'].diff(1) # 2階差分處理IndexData.plot(subplots=True,figsize=(18,12))![]() 上圖中第一張圖為上證綜指部分年份的收盤指數(shù),是一個非平穩(wěn)時(shí)間序列;而下面兩張為平穩(wěn)時(shí)間序列(當(dāng)然這里沒有檢驗(yàn),只是為了讓大家看出差異,關(guān)于檢驗(yàn)序列的平穩(wěn)性后續(xù)會討論)細(xì)心的朋友已經(jīng)發(fā)現(xiàn),下面兩張圖,實(shí)際上是對第一個序列做了差分處理,方差和均值基本平穩(wěn),成為了平穩(wěn)時(shí)間序列,后面我們會談到這種處理。 下面可以給出平穩(wěn)性的定義了: 嚴(yán)平穩(wěn): 如果對所有的時(shí)刻t,任意正整數(shù)k和任意k個正整數(shù)(t1,t2…tk), ![]() 的聯(lián)合分布與 ![]() 的聯(lián)合分布相同,我們稱時(shí)間序列{rt}是嚴(yán)平穩(wěn)的。 也就是, ![]() 的聯(lián)合分布在時(shí)間的平移變換下保持不變,這是個很強(qiáng)的條件。而我們經(jīng)常假定的是平穩(wěn)性的一個較弱的方式 弱平穩(wěn): 若時(shí)間序列{rt}滿足下面兩個條件: ![]() 則時(shí)間序列{rt}為弱平穩(wěn)的。即該序列的均值,rt與rt?l的協(xié)方差不隨時(shí)間而改變,l為任意整數(shù)。 在金融數(shù)據(jù)中,通常我們所說的平穩(wěn)序列,是弱平穩(wěn)的。 差分 回頭我們再談之前說的差分操作: 差分(這里為前向),就是求時(shí)間序列{rt}在t時(shí)刻的值rt與t?1時(shí)刻的值rt?1的差不妨記做dt,則我們得到了一個新序列{dt},為一階差分,對新序列{dt}再做同樣的操作,則為二階差分。 通常非平穩(wěn)序列可以經(jīng)過d次差分,處理成弱平穩(wěn)或者近似弱平穩(wěn)時(shí)間序列?;仡^看上圖,我們發(fā)現(xiàn)二階差分得到的序列比一階差分效果更好。 1.3 相關(guān)系數(shù)和自相關(guān)函數(shù)1.3.1 相關(guān)系數(shù)對于兩個向量,我們希望定義它們是不是相關(guān)。一個很自然的想法,用向量與向量的夾角來作為距離的定義,夾角小,就距離小,夾角大,就距離大。 早在中學(xué)數(shù)學(xué)中,我們就經(jīng)常使用余弦公式來計(jì)算角度: ![]() 我們發(fā)現(xiàn),相關(guān)系數(shù)實(shí)際上就是計(jì)算了向量空間中兩個向量的夾角!協(xié)方差是去均值后兩個向量的內(nèi)積! 如果兩個向量平行,相關(guān)系數(shù)等于1或者-1,同向的時(shí)候是1,反向的時(shí)候就是-1。如果兩個向量垂直,則夾角的余弦就等于0,說明二者不相關(guān)。兩個向量夾角越小,相關(guān)系數(shù)絕對值越接近1,相關(guān)性越高。 只不過這里計(jì)算的時(shí)候?qū)ο蛄孔隽巳ゾ堤幚恚粗行幕僮?。而不是直接用向量X,Y計(jì)算。 對于減去均值操作,并不影響角度計(jì)算,是一種“平移”效果,如下圖所示: ![]() 1.3.2 自相關(guān)函數(shù) (Autocorrelation Function, ACF)相關(guān)系數(shù)度量了兩個向量的線性相關(guān)性,而在平穩(wěn)時(shí)間序列{rt}中,我們有時(shí)候很想知道,rt與它的過去值rt?i的線性相關(guān)性。這時(shí)候我們把相關(guān)系數(shù)的概念推廣到自相關(guān)系數(shù)。 ![]() ![]() 下面給出示例: from scipy import statsimport statsmodels.api as sm # 統(tǒng)計(jì)相關(guān)的庫data = IndexData['closeIndex'] # 上證指數(shù)m = 10 # 我們檢驗(yàn)10個自相關(guān)系數(shù)acf,q,p = sm.tsa.acf(data,nlags=m,qstat=True) ## 計(jì)算自相關(guān)系數(shù) 及p-valueout = np.c_[range(1,11), acf[1:], q, p]output=pd.DataFrame(out, columns=['lag', 'AC', 'Q', 'P-value'])output = output.set_index('lag')output![]() 我們?nèi)★@著性水平為0.05,可以看出,所有的p-value都小于0.05;則我們拒絕原假設(shè)H0。 因此,我們認(rèn)為該序列,即上證指數(shù)序列,是序列相關(guān)的 我們再來看看同期上證指數(shù)的日收益率序列: ![]() 可以看出,p-value均大于顯著性水平0.05。我們選擇假設(shè)H0,即上證指數(shù)日收益率序列沒有顯著的相關(guān)性 1.4 白噪聲序列和線性時(shí)間序列1.4.1 白噪聲序列隨機(jī)變量X(t)(t=1,2,3……),如果是由一個不相關(guān)的隨機(jī)變量的序列構(gòu)成的,即對于所有S不等于T,隨機(jī)變量Xt和Xs的協(xié)方差為零,則稱其為純隨機(jī)過程。 對于一個純隨機(jī)過程來說,若其期望和方差均為常數(shù),則稱之為白噪聲過程。白噪聲過程的樣本實(shí)稱成為白噪聲序列,簡稱白噪聲。之所以稱為白噪聲,是因?yàn)樗桶坠獾奶匦灶愃疲坠獾墓庾V在各個頻率上有相同的強(qiáng)度,白噪聲的譜密度在各個頻率上的值相同。 1.4.2 線性時(shí)間序列![]() 到目前為止介紹了一些基本知識和概念,如平穩(wěn)性、相關(guān)性、白噪聲、線性序列,介紹的過程中并沒有太深入,目前來說“夠用”了,一些細(xì)節(jié)會在后面章節(jié)補(bǔ)充。下面開始介紹一些線性模型。 二、自回歸(AR)模型![]() 2.1 AR(p)模型的特征根及平穩(wěn)性檢驗(yàn)![]() 該方程所有解的倒數(shù)稱為該模型的特征根,如果所有的特征根的模都小于1,則該AR(p)序列是平穩(wěn)的。下面我們就用該方法,檢驗(yàn)上證指數(shù)日收益率序列的平穩(wěn)性 temp = np.array(data2) # 載入收益率序列model = sm.tsa.AR(temp) results_AR = model.fit() plt.figure(figsize=(10,4))plt.plot(temp,'b',label='CHGPct')plt.plot(results_AR.fittedvalues, 'r',label='AR model')plt.legend()![]() 我們可以看看模型有多少階 17 可以看出,自動生成的AR模型是17階的。關(guān)于價(jià)次的討論在下節(jié)內(nèi)容,我們畫出模型的特征根,來檢驗(yàn)平穩(wěn)性 pi,sin,cos = np.pi,np.sin,np.cosr1 = 1theta = np.linspace(0,2*pi,360)x1 = r1*cos(theta)y1 = r1*sin(theta)plt.figure(figsize=(6,6))plt.plot(x1,y1,'k') # 畫單位圓roots = 1/results_AR.roots # 注意,這里results_AR.roots 是計(jì)算的特征方程的解,特征根應(yīng)該取倒數(shù)for i in range(len(roots)): plt.plot(roots[i].real,roots[i].imag,'.r',markersize=8) #畫特征根plt.show()![]() 可以看出,所有特征根都在單位圓內(nèi),則序列為平穩(wěn)的! 2.2 AR(p)模型的定階一般有兩種方法來決定p: 第一種:利用偏相關(guān)函數(shù)(Partial Auto Correlation Function,PACF) 第二種:利用信息準(zhǔn)則函數(shù) 2.2.1 偏相關(guān)函數(shù)判斷p對于偏相關(guān)函數(shù)的介紹,這里不詳細(xì)展開,重點(diǎn)介紹一個性質(zhì): AR(p)序列的樣本偏相關(guān)函數(shù)是p步截尾的。 所謂截尾,就是快速收斂應(yīng)該是快速的降到幾乎為0或者在置信區(qū)間以內(nèi)。 具體我們看下面的例子,還是以之前上證指數(shù)日收益率序列 ![]() 我們看出,按照截尾來看,模型階次p在110+,但是之前調(diào)用的自動生成AR模型,階數(shù)為17,這一點(diǎn)我也有些不解。。 當(dāng)然,我們很少會用這么高的階次。。 2.2.2 信息準(zhǔn)則— AIC、BIC、HQ現(xiàn)在有以上這么多可供選擇的模型,我們通常采用AIC法則。我們知道:增加自由參數(shù)的數(shù)目提高了擬合的優(yōu)良性,AIC鼓勵數(shù)據(jù)擬合的優(yōu)良性但是盡量避免出現(xiàn)過度擬合(Overfitting)的情況。所以優(yōu)先考慮的模型應(yīng)是AIC值最小的那一個。赤池信息準(zhǔn)則的方法是尋找可以最好地解釋數(shù)據(jù)但包含最少自由參數(shù)的模型。不僅僅包括AIC準(zhǔn)則,目前選擇模型常用如下準(zhǔn)則: ![]() 下面我們來測試下3種準(zhǔn)則下確定的p,仍然用上證指數(shù)日收益率序列。為了減少計(jì)算量,我們只計(jì)算間隔前10個看看效果。 aicList = []bicList = []hqicList = []for i in range(1,11): #從1階開始算 order = (i,0) # 這里使用了ARMA模型,order 代表了模型的(p,q)值,我們令q始終為0,就只考慮了AR情況。 tempModel = sm.tsa.ARMA(temp,order).fit() aicList.append(tempModel.aic) bicList.append(tempModel.bic) hqicList.append(tempModel.hqic)![]() 可以看出,3個準(zhǔn)則在第一點(diǎn)均取到最小值,也就是說,p的最佳取值應(yīng)該在1,我們只計(jì)算了前10個,結(jié)果未必正確。 Whatever,我們的目的是了解方法。 當(dāng)然,利用上面的方法逐個計(jì)算是很耗時(shí)間的,實(shí)際上,有函數(shù)可以直接按照準(zhǔn)則計(jì)算出合適的order,這個是針對ARMA模型的,我們后續(xù)再討論。 2.3 模型的檢驗(yàn)根據(jù)式2.0,如果模型是充分的,其殘差序列應(yīng)該是白噪聲,根據(jù)我們第一章里介紹的混成檢驗(yàn),可以用來檢驗(yàn)殘差與白噪聲的接近程度。 我們先求出殘差序列: delta = results_AR.fittedvalues - temp[17:] # 殘差plt.figure(figsize=(10,6))#plt.plot(temp[17:],label='original value')#plt.plot(results_AR.fittedvalues,label='fitted value')plt.plot(delta,'r',label=' residual error')plt.legend(loc=0)![]() 然后我們檢查它是不是接近白噪聲序列 ![]() 觀察p-value可知,該序列可以認(rèn)為沒有相關(guān)性,近似得可以認(rèn)為殘差序列接近白噪聲。 2.4 擬合優(yōu)度及預(yù)測2.4.1 擬合優(yōu)度我們使用下面的統(tǒng)計(jì)量來衡量擬合優(yōu)度: ![]() 但是,對于一個給定的數(shù)據(jù)集,R2是用參數(shù)個數(shù)的非降函數(shù),為了克服該缺點(diǎn),推薦使用調(diào)整后的R2: ![]() 它的值在0-1之間,越接近1,擬合效果越好。 下面我們計(jì)算之前對上證指數(shù)日收益率的AR模型的擬合優(yōu)度。 score = 1 - delta.var()/temp[17:].var()print score0.0405231650285 可以看出,模型的擬合程度并不好,當(dāng)然,這并不重要,也許是這個序列并不適合用AR模型擬合。 2.4.2 預(yù)測我們首先得把原來的樣本分為訓(xùn)練集和測試集,再來看預(yù)測效果,還是以之前的數(shù)據(jù)為例: ![]() predicts = output.predict(355, 364, dynamic=True)print len(predicts)comp = pd.DataFrame()comp['original'] = temp[-10:]comp['predict'] = predictscomp10 ![]() |
|
|