時(shí)間序列
簡(jiǎn)而言之侠鳄,時(shí)間序列就是帶時(shí)間戳的數(shù)值序列。股票送讲,期貨等金融數(shù)據(jù)就是典型的時(shí)間序列奸笤。量化的過(guò)程,很多時(shí)間都是在分析時(shí)間序列哼鬓,找到穩(wěn)定賺錢因子监右。
平穩(wěn)性定義
所謂時(shí)間序列的平穩(wěn)性,是指時(shí)間序列的均值异希,方差以及協(xié)方差都是常數(shù)健盒,與時(shí)間t無(wú)關(guān)。這樣的序列才可以作為我們基于歷史預(yù)測(cè)未來(lái)的基礎(chǔ)称簿。
滿足以上條件屬于嚴(yán)平穩(wěn)扣癣,一般達(dá)到弱平穩(wěn)都是可以接受的。
平穩(wěn)性是當(dāng)前時(shí)間序列分析的前提條件憨降,因?yàn)槲覀兊慕_^(guò)程基本都是以大數(shù)定理和中心極限定理為理論基礎(chǔ)(比如ARMA父虑,ARIMA模型等),而大數(shù)定理和中心極限定理也是有前提條件的授药,那就是要求樣本同分布(等價(jià)于時(shí)間序列的平穩(wěn)性)士嚎。如果這個(gè)條件不滿足呜魄,那么我們的很多分析結(jié)果是不可靠的。
- 白噪聲屬于平穩(wěn)序列莱衩,因?yàn)樗木禐?爵嗅,方差為常數(shù),協(xié)方差為0笨蚁。但白噪聲屬于純隨機(jī)序列睹晒,基于它預(yù)測(cè)是沒有意義的。
- 隨機(jī)游走屬于非平穩(wěn)序列括细,因?yàn)樗木禐槌?shù)册招,但是方差為非常數(shù),與時(shí)間t有關(guān)勒极。
平穩(wěn)性檢驗(yàn)
對(duì)于一個(gè)時(shí)間序列,我們?nèi)绾翁幚砟兀?br>
1 檢驗(yàn)序列是否平穩(wěn)性序列
2 如果序列非平穩(wěn)虑鼎,通過(guò)數(shù)學(xué)變換為平穩(wěn)性序列
3 檢驗(yàn)序列是否白噪聲
4 下一步
平穩(wěn)性檢驗(yàn)常用方法有ADF檢驗(yàn)和KPSS檢驗(yàn)辱匿。
平穩(wěn)性檢驗(yàn)-ADF Test
ADF Test:Augmented Dickey-Fuller Test
首先假設(shè)時(shí)間序列是不穩(wěn)定的,根據(jù)假設(shè)求得的置信度P值如果小于閾值(一般為1%)炫彩,那么我們認(rèn)為假設(shè)不成立匾七,時(shí)間序列是穩(wěn)定的;反之江兢,假設(shè)成立昨忆。
Python和R都有相應(yīng)平穩(wěn)性檢驗(yàn)的模塊。
Python需安裝statsmodels模塊杉允。
R需安裝tseries模塊邑贴。
這里以Python為例:
#python
import numpy as np
from statsmodels.tsa.stattools import adfuller
ss = np.random.randn(10000)
adfuller(ss)
#(-100.04436307924058,
# 0.0, ##(P Value)
# 0,
# 9999,
# {'1%': -3.4310041633725734,
# '10%': -2.566923883481157,
# '5%': -2.861829101294412},
# 28143.20974307366)
檢驗(yàn)結(jié)果的第二項(xiàng)為P值,這里為0.0%叔磷,遠(yuǎn)低于閾值1%拢驾,因?yàn)槲覀儥z驗(yàn)的是一個(gè)標(biāo)準(zhǔn)正太分布,因此假設(shè)肯定是不成立的改基,我們的序列為穩(wěn)定性時(shí)間序列繁疤。
平穩(wěn)性檢驗(yàn)-KPSS Test
KPSS Test:Kwiatkowski-Phillips-Schmidt-Shin Test
首先假設(shè)序列是平穩(wěn)的,根據(jù)假設(shè)求得的P值如果小于閾值(一般為5%)秕狰,那么假設(shè)不成立稠腊;反之,假設(shè)成立鸣哀。仍以Python為例:
#python
import numpy as np
from statsmodels.tsa.stattools import kpss
ss = np.random.randn(10000)
kpss(ss)
# (0.09407968315491025,
# 0.1, ##(P Value)
# 38,
# {'1%': 0.739, '10%': 0.347, '2.5%': 0.574, '5%': 0.463})
檢驗(yàn)結(jié)果的第二項(xiàng)為P值架忌,這里為10%,遠(yuǎn)高于閾值5%诺舔,因此假設(shè)是成立的鳖昌,我們的序列為穩(wěn)定性時(shí)間序列备畦。
白噪聲檢驗(yàn)-Ljung-Box Test
首先假設(shè)序列為白噪聲,根據(jù)假設(shè)求得的P值如果小于閾值(一般為5%)许昨,那么假設(shè)不成立懂盐;反之,假設(shè)成立糕档。仍以Python為例:
#python
import numpy as np
from statsmodels.stats.diagnostic import acorr_ljungbox as ljbox
ss = np.random.randn(10000)
ljbox(ss, lags=1)
# (array([0.00307541]),
# array([0.95577487])) ##P-Value
檢驗(yàn)結(jié)果的第二項(xiàng)為P值莉恼,這里為95.57%,遠(yuǎn)高于閾值5%速那,因此假設(shè)是成立的俐银,我們的序列為白噪聲序列(實(shí)際是隨機(jī)序列)。
峰度 - Kurtosis
峰度表征統(tǒng)計(jì)分布在平均值處峰值高低的度量端仰,反應(yīng)了峰部的尖度捶惜。
峰度按數(shù)值包括三類:
- 正態(tài)分布(Kurtosis = 0)
- 厚尾分布(Kurtosis > 0)
- 瘦尾分布(Kurtosis < 0)
金融時(shí)間序列一般都是厚尾分布。
Python峰度計(jì)算采用scipy模塊荔烧,R峰度計(jì)算采用moments模塊吱七。
這里需要說(shuō)明的是:Python峰度計(jì)算是以0為中間值,R中峰度計(jì)算是以3位中間值(R峰度計(jì)算過(guò)程中沒有減3的操作)鹤竭。
以Python為例:
#python
import numpy as np
from scipy.stats import kurtosis
ss = np.random.randn(10000)
kurtosis(ss)
# -0.045421184138716875
偏度 - Skewness
偏度表征統(tǒng)計(jì)分布偏斜方向和程度的度量踊餐,是統(tǒng)計(jì)分布非對(duì)稱程度的數(shù)字特征。
偏度按數(shù)值包括三類:
- 正態(tài)分布(skew = 0)
- 左偏分布(skew < 0)臀稚,峰在左邊吝岭。
- 右偏分布(skew > 0),峰在右邊吧寺。
以Python為例:
#python
import numpy as np
from scipy.stats import skew
ss = np.random.randn(10000)
skew(ss)
# -0.0071660377825474705
非平穩(wěn)變換
非平穩(wěn)的序列如何變換成平穩(wěn)系列呢窜管?
一般有如下幾種方法:
- 對(duì)數(shù)變換
- 平滑變換(移動(dòng)平均,指數(shù)平均等)
- 差分變換(一階差分撮执,二階差分微峰,高階差分等)
- 分解變換(多成分分解 = 長(zhǎng)期趨勢(shì) + 中期趨勢(shì) + 隨機(jī))
這里就不展開了。