時(shí)間序列數(shù)據(jù)的平穩(wěn)性對于我們采用什么樣的分析方式、選擇什么樣的模型有著至關(guān)重要的影響。 我們想一下,假如一個(gè)時(shí)間序列的波動(dòng)趨勢從來沒有穩(wěn)定過,那么它每個(gè)時(shí)期的波動(dòng)對于之后一段時(shí)期的影響都是無法預(yù)測的,因?yàn)樗S時(shí)可能“變臉”。而當(dāng)一個(gè)時(shí)間序列的特征維持穩(wěn)定,比如它的均值和方差是穩(wěn)定的,那么我們認(rèn)為在之后的一段時(shí)間里,它的數(shù)據(jù)分布跟歷史的數(shù)據(jù)分布大概率是保持一致的,這時(shí),我們就可以基于歷史數(shù)據(jù)對未來的走勢做一個(gè)預(yù)測,這能幫助我們找到更大概率成功的決策。 股票數(shù)據(jù),就是極為常見的一種時(shí)間序列數(shù)據(jù)。在量化過程中應(yīng)用時(shí)間序列分析手段時(shí),我們往往需要先進(jìn)行平穩(wěn)性檢驗(yàn),從而選擇合適的研究方法。 在學(xué)習(xí)平穩(wěn)性之前,我們先了解一下自相關(guān)性的概念。 一、自相關(guān)性自相關(guān)性與相關(guān)性 我們知道,相關(guān)性常用于統(tǒng)計(jì)兩個(gè)變量之間是否存在某種關(guān)聯(lián)。那么,自相關(guān)性代表了變量與自身之間的相關(guān)性,只不過一般情況下我們統(tǒng)計(jì)的是兩組隸屬于不同時(shí)間區(qū)間的數(shù)據(jù)。當(dāng)兩組數(shù)據(jù)的時(shí)間范圍相同時(shí),其相關(guān)性為1(相當(dāng)于兩組完全相同的數(shù)據(jù))。 之前我們曾經(jīng)學(xué)習(xí)過Pearson相關(guān)系數(shù),自相關(guān)系數(shù)的計(jì)算和Pearson相關(guān)系數(shù)的計(jì)算過程非常相似,但是它們在分母上有些區(qū)別。Pearson相關(guān)系數(shù)的計(jì)算中,分母為兩個(gè)變量的標(biāo)準(zhǔn)差之積;而在自相關(guān)系數(shù)的計(jì)算中,我們會(huì)直接使用第k期時(shí)間序列數(shù)據(jù)的方差: 自協(xié)方差的計(jì)算與協(xié)方差的計(jì)算是一致的: 事實(shí)上,自相關(guān)性存在一定的問題。一般來說,在一組時(shí)間序列數(shù)據(jù)中,相鄰時(shí)間節(jié)點(diǎn)的數(shù)據(jù)間往往存在某些關(guān)聯(lián)。第1期對第2期有影響,第2期對第3期有影響……也就是說,我們的自相關(guān)系數(shù)衡量的不僅僅是 期之前的數(shù)據(jù)對當(dāng)前期數(shù)據(jù)的影響,也包含了更早期的數(shù)據(jù)帶來的間接影響。 為了解決這個(gè)問題,我們引入了偏自相關(guān)系數(shù),它是X(k)與X(k-l)之間的條件自相關(guān)系數(shù)。其計(jì)算非常復(fù)雜,這里不再展開。好在我們可以用Python的statsmodels庫非常輕易地完成計(jì)算。 自相關(guān)系數(shù)和偏自相關(guān)系數(shù)的計(jì)算 在Python中,可以用statsmodels提供的工具來計(jì)算自相關(guān)性和偏自相關(guān)性。我們以上證綜指的收益率數(shù)據(jù)來進(jìn)行演示。 import tushare as tsfrom statsmodels.tsa import stattoolspro = ts.pro_api()df = pro.index_daily(ts_code='000001.SH', start_date='20180901')print('自相關(guān)系數(shù): \n', stattools.acf(df.pct_chg, nlags=10))print('自相關(guān)系數(shù): \n', stattools.pacf(df.pct_chg, nlags=10)) 輸出為: 自相關(guān)系數(shù): [ 1. -0.1692613 -0.03035227 0.22164563 -0.11543326 -0.05630536 -0.18736445 0.04942778 -0.02089329 -0.00722488 -0.03940862]自相關(guān)系數(shù): [ 1. -0.17100626 -0.06204206 0.21965218 -0.04895894 -0.08142805 -0.30000036 0.00808857 0.01488787 0.11432786 -0.12407987] 可以看到,這里自相關(guān)系數(shù)和偏自相關(guān)系數(shù)的計(jì)算都返回了長度為10的數(shù)組。它們分別代表了當(dāng) 的取值為從0到10時(shí)的自相關(guān)性統(tǒng)計(jì)。這里acf()方法用于計(jì)算自相關(guān)系數(shù),pacf()用于計(jì)算偏自相關(guān)系數(shù),nlags參數(shù)用于指定最大的l,這里我們指定了10,所以就會(huì)最多對比當(dāng)前期與10期之前的時(shí)間序列數(shù)據(jù),這里10期就是10個(gè)交易日。 二、平穩(wěn)性平穩(wěn)性分為強(qiáng)平穩(wěn)和弱平穩(wěn)。 強(qiáng)平穩(wěn)的要求非常嚴(yán)格,它要求兩組數(shù)據(jù)之間的任何統(tǒng)計(jì)性質(zhì)都不會(huì)隨著時(shí)間改變。其要求過于嚴(yán)苛,理論上很難證明、實(shí)際中難以檢驗(yàn),因此它基本上沒有什么應(yīng)用場景。 弱平穩(wěn) 與強(qiáng)平穩(wěn)對應(yīng)的是弱平穩(wěn),其應(yīng)用比較廣泛,它有三個(gè)要求: 簡而言之,一組時(shí)間序列數(shù)據(jù)的均值恒定、方差始終存在、自協(xié)方差不隨時(shí)間波動(dòng),即可認(rèn)定其為弱平穩(wěn)序列。 強(qiáng)平穩(wěn)與弱平穩(wěn)之間并沒有包含關(guān)系,弱平穩(wěn)不一定是強(qiáng)平穩(wěn),強(qiáng)平穩(wěn)也不一定是弱平穩(wěn)。這是因?yàn)榉蠌?qiáng)平穩(wěn)標(biāo)準(zhǔn)的時(shí)間序列數(shù)據(jù)不一定存在均值和方差,而當(dāng)強(qiáng)平穩(wěn)序列存在均值和方差時(shí),它就一定也是弱平穩(wěn)序列。 另外,一個(gè)服從正態(tài)分布的弱平穩(wěn)時(shí)間序列也是強(qiáng)平穩(wěn)的。這是因?yàn)樵谡龖B(tài)分布中,確定了均值和方差,也就確定了整個(gè)分布,也就是說該時(shí)間序列的不同時(shí)期的分布是相同的,這就符合了強(qiáng)平穩(wěn)的定義。 三、平穩(wěn)性的檢驗(yàn)我們還是用上證綜指的行情數(shù)據(jù)來演示如何在Python中進(jìn)行平穩(wěn)性檢驗(yàn)。 時(shí)序圖 這次我們?nèi)∩蚤L一些的時(shí)間區(qū)間:從18年6月份至今的數(shù)據(jù)。然后我們將日期字符串轉(zhuǎn)換成日期類型,并且設(shè)置為數(shù)據(jù)框的索引,并且對數(shù)據(jù)按照時(shí)間增序排列。 df = pro.index_daily(ts_code='000001.SH', start_date='20180601')df.index = pd.to_datetime(df.trade_date)df = df.sort_index(ascending=True)plt.figure(figsize=(10,5))df.pct_chg.plot(); 可以看到,上證綜指的收盤收益率數(shù)據(jù)基本上是圍繞著0軸上下波動(dòng),在0軸上方和下方的波動(dòng)幅度基本一致。我們可以初步認(rèn)定,該時(shí)間序列是平穩(wěn)的。 自相關(guān)圖和偏自相關(guān)圖 我們還經(jīng)常結(jié)合自相關(guān)圖和偏自相關(guān)圖來判斷時(shí)間序列的平穩(wěn)性。 plt.stem(stattools.acf(df.pct_chg)); 可以看到,0階自相關(guān)系數(shù)和0階偏自相關(guān)系數(shù)都恒為1。在下面兩幅圖中,自相關(guān)系數(shù)和偏自相關(guān)系數(shù)迅速由1減小到0附近,之后隨著階數(shù) 的上升在0軸上下小幅波動(dòng),這基本上是符合平穩(wěn)性的要求的。 plt.stem(stattools.pacf(df.pct_chg)); 單位根檢驗(yàn) 前兩種方式很直觀,但也很主觀。它們?nèi)咳庋鄣呐袛嗪团袛嗳说慕?jīng)驗(yàn),不同的人看到同樣的圖形,很可能會(huì)給出不同的判斷。 因此我們需要一個(gè)更有說服力、更加客觀的統(tǒng)計(jì)方法來幫助我們檢驗(yàn)時(shí)間序列的平穩(wěn)性,這種方法,就是單位根檢驗(yàn)。 當(dāng)一個(gè)時(shí)間序列的滯后算子多項(xiàng)式方程存在單位根時(shí),我們認(rèn)為該時(shí)間序列是非平穩(wěn)的;反之,當(dāng)該方程不存在單位根時(shí),我們認(rèn)為該時(shí)間序列是平穩(wěn)的。其原理比較復(fù)雜,想要理解它需要較好的數(shù)學(xué)基礎(chǔ),因此這里我們主要看如何在Python中應(yīng)用它,原理部分可以自行搜索相關(guān)資料閱讀。 常見的單位根檢驗(yàn)方法有DF檢、ADF檢驗(yàn)和PP檢驗(yàn),今天我們會(huì)用ADF檢驗(yàn)來為大家演示。 在Python中,有兩個(gè)常用的包提供了ADF檢驗(yàn),分別是statsmodel和arch。 from statsmodels.stats.diagnostic import unitroot_adfunitroot_adf(df.pct_chg) 輸出為: 這里包含了檢驗(yàn)值、p-value、滯后階數(shù)、自由度等信息。我們看到了檢驗(yàn)統(tǒng)計(jì)量為-14.46,遠(yuǎn)小于1%的臨界值-3.47,即p值遠(yuǎn)小于0.01,因此我們拒絕原假設(shè),認(rèn)為該時(shí)間序列是平穩(wěn)的。(這里原假設(shè)是存在單位根,即時(shí)間序列為非平穩(wěn)的。) 使用arch的方法為: from arch.unitroot import ADFADF(df.pct_chg) 其輸出信息基本是一致的。 |
|