原文鏈接: http://tecdat.cn/?p=24092
原文出處:拓端數據部落公眾號
前言
在量化金融中,我學習了各種時間序列分析技術以及如何使用它們。
通過發展我們的時間序列分析 (TSA) 方法組合,我們能夠更好地了解已經發生的事情,並對未來做出更好、更有利的預測。示例應用包括預測未來資產收益、未來相關性/協方差和未來波動性。
在我們開始之前,讓我們導入我們的 Python 庫。
-
-
import pandas as pd
-
import numpy as np
讓我們使用pandas包通過 API 獲取一些示例數據。
-
-
# 原始調整后的收盤價
-
daa = pdDatrme({sx(sm)for sm i syos})
-
# 對數收益率
-
ls = log(dta/dat.sit(1)).dropa()
基礎知識
什么是時間序列?
時間序列是按時間順序索引的一系列數據點。——Wikipedia
平穩性
為什么我們關心平穩性?
-
平穩時間序列 (TS) 很容易預測,因為我們可以假設未來的統計屬性與當前的統計屬性相同或成比例。
-
我們在 TSA 中使用的大多數模型都假設協方差平穩。這意味着這些模型預測的描述性統計數據(例如均值、方差和相關性)僅在 TS 平穩時才可靠,否則無效。
“例如,如果序列隨着時間的推移不斷增加,樣本均值和方差會隨着樣本規模的增加而增長,並且他們總是會低估未來時期的均值和方差。如果一個序列的均值和方差是沒有明確定義,那么它與其他變量的相關性也不是。”
話雖如此,我們在金融中遇到的大多數 TS 都不是平穩的。因此,TSA 的很大一部分涉及識別我們想要預測的序列是否是平穩的,如果不是,我們必須找到方法將其轉換為平穩的。(稍后會詳細介紹)
自相關
本質上,當我們對時間序列建模時,我們將序列分解為三個部分:趨勢、季節性/周期性和隨機。隨機分量稱為殘差或誤差。它只是我們的預測值和觀察值之間的差異。序列相關是指我們的 TS 模型的殘差(誤差)彼此相關。
為什么我們關心序列相關性?
我們關心序列相關性,因為它對我們模型預測的有效性至關重要,並且與平穩性有着內在的聯系。回想一下,根據定義,平穩TS的殘差(誤差)是連續不相關的!如果我們在我們的模型中沒有考慮到這一點,我們系數的標准誤差就會被低估,從而誇大了我們的 T 統計量。結果是太多的 1 類錯誤,即使原假設為真,我們也會拒絕原假設!通俗地說,忽略自相關意味着我們的模型預測將是胡說八道,我們可能會得出關於模型中自變量影響的錯誤結論。
白噪聲和隨機游走
白噪聲是我們需要了解的第一個時間序列模型(TSM)。根據定義,作為白噪聲過程的時間序列具有連續不相關的誤差,這些誤差的預期平均值等於零。對連續不相關的誤差的另一種描述是,獨立和相同分布(i.i.d.)。這一點很重要,因為如果我們的TSM是合適的,並且成功地捕捉了基本過程,我們模型的殘差將是i.i.d.,類似於白噪聲過程。因此,TSA的一部分實際上是試圖將一個模型適合於時間序列,從而使殘差序列與白噪聲無法區分。
讓我們模擬一個白噪聲過程並查看它。下面我介紹一個方便的函數,用於繪制時間序列和直觀地分析序列相關性。
我們可以輕松地對白噪聲過程進行建模並輸出 TS 圖檢查。
-
np.random.seed(1)
-
-
# 繪制離散白噪聲的曲線
-
-
ads = radooral(size=1000)
-
plot(ads, lags=30)
高斯白噪聲
我們可以看到該過程似乎是隨機的並且以零為中心。自相關 (ACF) 和偏自相關 (PACF) 圖也表明沒有顯着的序列相關。請記住,我們應該在自相關圖中看到大約 5% 的顯着性,這是由於從正態分布采樣的純偶然性。下面我們可以看到 QQ 和概率圖,它們將我們的數據分布與另一個理論分布進行了比較。在這種情況下,該理論分布是標准正態分布。顯然,我們的數據是隨機分布的,並且應該遵循高斯(正常)白噪聲。
-
p("nmean: {:.3f}\{:.3f}\stde: {:.3f}"
-
.format(ademean(), nerva(), der.td()))
-
隨機游走的意義在於它是非平穩的,因為觀測值之間的協方差是時間相關的。如果我們建模的 TS 是隨機游走,則它是不可預測的。
讓我們使用“random”函數從標准正態分布中采樣來模擬隨機游走。
-
# 沒有漂移的隨機行走
-
-
np.rao.sed(1)
-
n = 1000
-
-
x = w = np.aonral(size=n)
-
for t in rnge(_sples):
-
x[t] = x[t-1] + w[t]
-
splt(x, las=30)
無漂移的隨機行走
顯然,我們的 TS 不是平穩的。讓我們看看隨機游走模型是否適合我們的模擬數據。回想一下隨機游走是xt = xt-1 + wt。使用代數我們可以說xt - xt-1 = wt。因此,我們隨機游走系列的第一個差異應該等於白噪聲過程,我們可以在我們的 TS 上使用“ np.diff()” 函數,看看這是否成立。
-
# 模擬的隨機游走的第一個差值
-
-
plt(p.dffx), las=30)
隨機行走的一階差分
我們的定義成立,因為這看起來與白噪聲過程完全一樣。如果我們對 SPY 價格的一階差分進行隨機游走會怎么樣?
-
# SPY價格的一階差分
-
plt(diff(dt.PY), lag=30)
將隨機行走模型擬合到ETF價格
它與白噪聲非常相似。但是,請注意 QQ 和概率圖的形狀。這表明該過程接近正態分布,但具有“重尾”。 ACF 和 PACF 在滯后 1、5?、16?、18 和 21 附近似乎也存在一些顯着的序列相關性。這意味着應該有更好的模型來描述實際的價格變化過程。
線性模型
線性模型又稱趨勢模型,代表了一個可以用直線作圖的TS。其基本方程為。
在這個模型中,因變量的值由β系數和一個單一的自變量--時間決定。一個例子是,一家公司的銷售額在每個時間段都會增加相同的數量。 讓我們來看看下面的一個特制的例子。在這個模擬中,我們假設堅定的ABC公司在每個時間段的銷售額為-50.00元(β0或截距項)和+25.00元(β1)。
-
# 模擬線性趨勢
-
# 例子 公司ABC的銷售額默認為-50元,在每個時間步長為+25元
-
w = n.anom.ann(100)
-
y = nppt_lke(w)
-
-
b0 = -50.
-
b1 = 25.
-
for t in rge(lnw)):
-
y[t] = b0 + b1*t + w[t]
-
-
plt(y, lags=ls)
線性趨勢模型模擬
在這里我們可以看到模型的殘差是相關的,並且作為滯后的函數線性減少。分布近似正態。在使用此模型進行預測之前,我們必須考慮並消除序列中存在的明顯自相關。PACF 在滯后 1 處的顯着性表明自回歸 模型可能是合適的。
對數線性模型
這些模型與線性模型類似,只是數據點形成了一個指數函數,代表了相對於每個時間步的恆定變化率。例如,ABC公司的銷售額在每個時間步長增加X%。當繪制模擬的銷售數據時,你會得到一條看起來像這樣的曲線。
-
# 模擬ABC的指數式增長
-
-
# 日期
-
pdat_rge('2007-01-01', '2012-01-01', freq='M')
-
-
# 假設銷售額以指數速度增長
-
ale = [exp( x/12 ) for x inage1, len(id)+1)]
-
-
# 創建數據框架並繪圖
-
df = d.ataame(sals, ix=x)
-
plt()
-
模擬指數函數
然后我們可以通過采用銷售額的自然對數來轉換數據。現在線性回歸擬合數據。
-
# ABC對數銷售
-
indexid.plot()
指數函數的自然對數
如前所述,這些模型有一個致命的弱點。它們假設連續不相關的誤差,正如我們在線性模型的例子中看到的那樣。在現實生活中,TS數據通常會違反我們的平穩假設,這使我們轉向自回歸模型。
自回歸模型 - AR(p)
當因變量針對自身的一個或多個滯后值進行回歸時,該模型稱為自回歸模型。公式如下所示:
AR (P) 模型
當您描述 模型的“階”時,例如階“p”的 AR 模型, p 表示模型中使用的滯后變量的數量。例如,AR(2) 模型或二階自回歸模型如下所示:
AR (2) 模型
這里,alpha (a) 是系數,omega (w) 是白噪聲項。在 AR 模型中,Alpha 不能等於 0。請注意,alpha 設置為 1 的 AR(1) 模型是隨機游走 ,因此不是平穩的。
AR(1) 模型,ALPHA = 1;隨機漫步
讓我們模擬一個 alpha 設置為 0.6 的 AR(1) 模型
-
# 模擬一個α=0.6的AR(1)過程
-
-
rndm.sed(1)
-
n_sams = int(1000)
-
a = 0.6
-
x = w = n.amma(siz=_apes)
-
-
for t in rane(n_saps):
-
x[t] = a*x[t-1] + w[t]
-
-
plot(x, gs=lgs)
AR(1) 模型,ALPHA = 0.6
正如預期的那樣,我們模擬的 AR(1) 模型的分布是正常的。滯后值之間存在顯着的序列相關性,尤其是在滯后 1 處,如 PACF 圖所示。
現在我們可以使用 Python 的 statsmodels 擬合 AR(p) 模型。首先,我們將 AR 模型擬合到我們的模擬數據並收益估計的 alpha 系數。然后我們使用 statsmodels 函數“order()”來查看擬合模型是否會選擇正確的滯后。如果 AR 模型是正確的,估計的 alpha 系數將接近我們的真實 alpha 0.6,所選階數等於 1。
-
# 擬合AR(p)模型到模擬的AR(1)模型,alpa=0.6
-
-
md = AR(x).itm=30, ic='aic', trnd='nc')
-
%time st_oer = mt.R(x).stor(
-
mxag=30, ic='aic', trnd='nc')
-
-
tuerer = 1
看起來我們能夠恢復模擬數據的基礎參數。讓我們用 alpha_1 = 0.666 和 alpha_2 = -0.333 來模擬 AR(2) 過程。為此,我們使用 statsmodel 的“generate_samples()”函數。該函數允許我們模擬任意階數的 AR 模型。
-
# 模擬一個AR(2)過程
-
-
-
n = int(1000)
-
-
-
# Python要求我們指定零滯后值,即為1
-
# 還要注意,AR模型的字母必須是否定的
-
# 對於AR(p)模型,我們也將MA的betas設置為0
-
ar = nr_[1, -ahas]
-
ma = npr_[1, beas]
-
ar2 = smt.arme_pe(ar=ar, ma=a, nsale=n)
-
plot(ar2, lags=lags)
AR(2) 模擬 ALPHA_1 = 0.666 和 ALPHA_2 = -0.333
讓我們看看是否可以恢復正確的參數。
-
# 擬合AR(p)模型來模擬AR(2)過程
-
-
-
max_lag = 10
-
est_rer = st.AR(r2)sennc')
-
-
tu_rder = 2
-
-
讓我們看看 AR(p) 模型將如何擬合 MSFT 對數收益。這是收益TS。
MSFT 對數收益時間序列
-
# 選擇MSFT收益的最佳滯后階數
-
-
-
max_ag = 30
-
ml = smt.AR(ls.MSFT).fit(mam_lg, c='aic', tnc)
-
es_rr = tAR(rts.FT).secter(
-
maag=malag ic=aic', re=nc')
-
p('最佳估計滯后階數 = {}'.format(etoer))
最好的階數是 23 個滯后或 23 !任何具有這么多參數的模型在實踐中都不太可能有用。顯然,收益過程背后的復雜性比這個模型所能解釋的要復雜得多。
移動平均模型 - MA(q)
MA(q) 模型與 AR(p) 模型非常相似。不同之處在於 MA(q) 模型是過去白噪聲誤差項的線性組合,而不是像 AR(p) 模型這樣的過去觀察的線性組合。MA 模型的目的是我們可以通過將模型擬合到誤差項來直接觀察誤差過程中的“沖擊”。在 AR(p) 模型中,通過使用 ACF 對過去的一系列觀察結果間接觀察到這些沖擊。MA(q) 模型的公式是:
Omega (w) 是 E(wt) = 0 且方差為 sigma 平方的白噪聲。讓我們使用 beta=0.6 並指定 AR(p) alpha 等於 0 來模擬這個過程。
-
# 模擬一個MA(1)過程
-
-
-
n = int(1000)
-
-
# 設置AR(p)的alphas等於0
-
alpas = npray([0.])
-
beas = np.ra([0.6])
-
-
# 添加零滯后
-
ar = np_[1, -alph]
-
ma = np_[1, beta]
-
a1 = st.m_gerse(ar=ar, ma=a, naple=n)
-
plot(ma1, lags=30)
BETA=0.6 的模擬 MA(1) 過程
ACF 函數顯示滯后 1 很重要,這表明 MA(1) 模型可能適用於我們的模擬序列。當 ACF 僅在滯后 1 處顯示顯着性時,我不確定如何解釋在滯后 2、3 和 4 處顯示顯着性的 PACF。我們現在可以嘗試將 MA(1) 模型擬合到我們的模擬數據中。我們可以使用 “ARMA()” 函數來指定我們選擇的階數。我們調用它的“fit()” 方法來返回模型輸出。
-
# 將MA(1)模型與我們模擬的時間序列相匹配
-
# 指定ARMA模型,階數為(p,q)。
-
-
maxlag = 30
-
st.RMa1, orer=(0,1)).fit
-
maag=maxg, ethod='e', tren='nc')
MA(1) 模型概要
該模型能夠正確估計滯后系數,因為 0.58 接近我們的真實值 0.6。另請注意,我們的 95% 置信區間確實包含真實值。讓我們嘗試模擬 MA(3) 過程,然后使用我們的 ARMA 函數將三階 MA 模型擬合到系列中,看看我們是否可以恢復正確的滯后系數(β)。Beta 1-3 分別等於 0.6、0.4 和 0.2。
-
# 模擬MA(3)過程,beta為0.6, 0.4, 0.2
-
-
-
n = nt(100)
-
ar = nr_[1, -ahas]
-
ma = np.r_[1, betas]
-
-
m3 = genrae_sle(ar=ar, ma=ma, sple=n)
-
plot(ma3, las=30)
BETAS = [0.6, 0.4, 0.2] 的模擬 MA(3) 過程
-
# 將MA(3)模型擬合模擬的時間序列
-
-
-
maxlg = 30
-
ARMA(ma3, order=(0, 3)).fit(
-
xla=mx_ag, mehd='le',tred=nc').summary
-
MA(3) 模型總結
該模型能夠有效地估計實際系數。我們的 95% 置信區間還包含 0.6、0.4 和 0.3 的真實參數值。現在讓我們嘗試將 MA(3) 模型擬合到 SPY 的對數收益。請記住,我們不知道真正的參數值。
-
# 將MA(3)與SPY收益擬合
-
-
-
x_ag = 30
-
Y = lrsSY
-
ARMA(Y, ordr=(0, 3)).it(
-
mlg=m_lg, thd'le', rndn'.summry())
-
plot(md.rsd lgs=m_lg)
-
SPY MA (3) 模型總結
讓我們看看模型殘差。
不錯。一些 ACF 滯后有點問題,尤其是在 5、16 和 18 處。這可能是采樣錯誤,但再加上重尾,我認為這不是預測未來 SPY收益的最佳模型。
自回歸移動平均模型 - ARMA(p, q)
ARMA 模型只是 AR(p) 和 MA(q) 模型之間的合並。讓我們從量化金融的角度回顧一下這些模型對我們的意義:
-
AR(p) 模型試圖捕捉(解釋)交易市場中經常觀察到的動量和均值回歸效應。
-
MA(q) 模型試圖捕捉(解釋)在白噪聲項中觀察到的沖擊效應。這些沖擊效應可以被認為是影響觀察過程的意外事件,例如意外收益、恐怖襲擊等。
“對於雜貨店中的一組產品,在不同時間推出的有效優惠券活動的數量將構成多重‘沖擊’,從而影響相關產品的價格。”
ARMA 的弱點在於它忽略了在大多數金融時間序列中發現的波動性聚類效應。
模型公式為:
ARMA(P, Q) 方程
讓我們用給定的參數模擬一個 ARMA(2, 2) 過程,然后擬合一個 ARMA(2, 2) 模型,看看它是否可以正確估計這些參數。設置 alpha 等於 [0.5,-0.25] 和 beta 等於 [0.5,-0.3]。
-
# 模擬一個ARMA(2, 2)模型,alphas=[0.5,-0.25],betas=[0.5,-0.3]
-
max_lag = 30
-
-
n = int(5000) #大量的樣本來幫助估算
-
burn = int(n/10) #擬合前要丟棄的樣本數
-
-
ar = np.r_[1, -alphas]
-
ma = np.r_[1, betas]
-
-
aa22 = aample(ar=ar, ma=ma,samle=n)
-
plt(rm2, lagsxla)
-
-
ARMA(arma22, order=(2, 2)).fit(
-
maxag=ma_lag, mtd='mle', ted='nc', brnn=brn).summry()
模擬 ARMA(2, 2) 過程
ARMA(2, 2) 模型總結
我們的真實參數包含在 95% 的置信區間內。
接下來我們模擬一個 ARMA(3, 2) 模型。之后,我們循環使用 p、q 的組合,以將 ARMA 模型擬合到我們的模擬序列中。我們根據哪個模型產生最低值來選擇最佳組合Akaike Information Criterion (AIC).
-
# 模擬一個ARMA(3, 2)模型,alphas=[0.5,-0.25,0.4],betas=[0.5,-0.3] 。
-
-
maxg = 30
-
-
n = int(5000)
-
burn = 2000
-
-
alpas = nparay([0.5, -0.25, 0.4])
-
bets = np.ra([0.5, -0.3])
-
-
ar = np.r_[1, -alas]
-
ma = np.r_[1, betas]
-
-
arma32 = armasamp(ar=ar, ma=ma, nsple=n, rin=burn)
-
plot(ara32, lgs=mxlg)
-
# 通過AIC選擇最佳階數
-
# 最小的AIC值最優
-
-
-
for i in rn:
-
for j in rn:
-
try:
-
tmpl = ARMA(arma32, orde=(i, j)).fit(meod='mle', tend='nc')
-
aic = tp_ml.ac
-
if tmpaic < bstaic:
-
bst_ic = mp_aic
-
bestrder = (i, j)
-
bes_mdl = tmpdl
-
excpt: ctinue
-
-
上面恢復了正確的階數。下面我們看到了在任何模型擬合之前模擬時間序列的輸出。
模擬 ARMA(3, 2) 系列,其中 Alpha = [0.5,-0.25,0.4] 和 BETAS = [0.5,-0.3]
ARMA(3, 2) 最佳模型總結
我們看到選擇了正確的階數並且模型正確地估計了我們的參數。但是請注意 MA.L1.y 系數;0.5 的真實值幾乎在 95% 的置信區間之外!
下面我們觀察模型的殘差。顯然這是一個白噪聲過程,因此最好的模型已經被擬合來解釋 數據。
ARMA(3, 2) 最佳模型殘差白噪聲
接下來,我們將 ARMA 模型擬合到 SPY 收益。下圖是模型擬合前的時間序列。
SPY收益率
-
# 將ARMA模型與SPY收益率擬合
-
-
-
-
rng = rng(5) # [0,1,2,3,4,5]
-
for i in rng:
-
for j in rng:
-
try:
-
tmp_mdl = ARMA('SPY', oder=(i, j))fit
-
tmp_ic = tp_dl.aic
-
if tp_ic < bes_aic:
-
bs_aic = mp_aic
-
es_der = (i j)
-
bst_mdl = t_mdl
-
exet: cntnue
-
-
我們繪制模型殘差。
SPY最佳模型殘差 ARMA(4, 4)
ACF 和 PACF 沒有顯示出顯着的自相關。QQ 和概率圖顯示殘差近似正態並帶有重尾。然而,這個模型的殘差看起來不像白噪聲,可以看到模型未捕獲的明顯條件異方差(條件波動性)的突出顯示區域。
自回歸綜合移動平均模型 - ARIMA(p, d, q)
ARIMA是ARMA模型類別的自然延伸。如前所述,我們的許多TS並不是平穩的,但是它們可以通過差分而成為平穩的。我們看到了一個例子,當我們采取Guassian隨機游走的第一次差分,並證明它等於白噪聲。換句話說,我們采取了非平穩的隨機行走,並通過第一次差分將其轉變為平穩的白噪聲。
不用太深入地研究這個方程,只要知道 "d "是指我們對序列進行差分的次數。順便提一下,在Python中,如果我們需要對一個序列進行多次差分,我們必須使用np.diff()函數。pandas函數DataFrame.diff()/Series.diff()只處理數據幀/序列的第一次差分,沒有實現TSA中需要的遞歸差分。
在下面的例子中,我們通過(p, d, q)訂單的非顯著數量的組合進行迭代,以找到適合SPY收益的最佳ARIMA模型。我們使用AIC來評估每個模型。最低的AIC獲勝。
-
# 將ARIMA(p, d, q)模型適用於SPY收益
-
# 根據AIC選擇最佳階數和最終模型
-
-
for i in prng:
-
for d in rng:
-
for j in prng:
-
try:
-
tp_dl = ARIMAfit(lrs, orer=(i,d,j))
-
if tpaic < betaic:
-
bestic = tmp_ic
-
bes_orer = (i, d, j)
-
bestl = tpmdl
-
-
# ARIMA模型的殘差圖
-
plot(resid, lags=30)
最好的模型的差值為 0 也就不足為奇了。回想一下,我們已經用對數價格的第一個差值來計算股票收益。下面,我繪制了模型殘差。結果與我們上面擬合的 ARMA(4, 4) 模型基本相同。顯然,這個 ARIMA 模型也沒有解釋序列中的條件波動!
擬合SPY收益的 ARIMA 模型
現在我們至少積累了足夠的知識來對未來的收益進行簡單的預測。這里我們使用我們模型的predict() 方法。作為參數,要預測的時間步數需要一個整數,alpha 參數需要一個小數來指定置信區間。默認設置為 95% 置信度。對於 99%,設置 alpha 等於 0.01。
-
# 創建一個具有95%、99%CI的21天SPY收益預測
-
n_steps = 21
-
-
-
fc9 =atFae(ncolmack([c99])
-
inx=clus=['wr_ci99', upr_ci_99')
-
fc_ll.head(
-
# 繪制21天的SPY收益預測圖
-
-
-
ilc[-500:].cpy()
-
-
# 在樣本預測中
-
prdct(side[0], t.id[-1])
-
-
plt(ax=x, stye=styes)
-
21 天SPY收益預測 - ARIMA(4,0,4)
自回歸條件異方差模型 - ARCH(p)
ARCH(p) 模型可以簡單地認為是應用於時間序列方差的 AR(p) 模型。另一種思考方式是,我們的時間序列 在時間 t的方差取決於對先前時期方差的過去觀察。
ARCH(1) 模型公式
假設系列的均值為零,我們可以將模型表示為:
零均值的 ARCH(1) 模型
-
# 模擬ARCH(1)序列
-
# Var(yt) = a_0 + a_1*y{t-1}**2
-
# 如果a_1在0和1之間,那么yt就是白噪聲
-
-
-
Y = np.epy_lik
-
-
for t in rng(ln()):
-
Y[t] = w[t * sqrt((a0 + a1*y[t-1**2)
-
# 模擬的ARCH(1)序列,看起來像白噪聲
-
plot(Y, lags=30)
模擬ARCH(1)過程
模擬ARCH(1)**2 過程
請注意 ACF 和 PACF 似乎在滯后 1 處顯示顯着性,表明方差的 AR(1) 模型可能是合適的。
廣義自回歸條件異方差模型 - GARCH(p,q)
簡單地說,GARCH(p, q) 是一個應用於時間序列方差的 ARMA 模型,即它有一個自回歸項和一個移動平均項。AR(p) 對殘差的方差(平方誤差)或簡單地對我們的時間序列平方進行建模。MA(q) 部分對過程的方差進行建模。基本的 GARCH(1, 1) 公式是:
GARCH(1, 1) 公式
Omega (w) 是白噪聲,alpha 和 beta 是模型的參數。此外 alpha_1 + beta_1 必須小於 1,否則模型不穩定。我們可以在下面模擬一個 GARCH(1, 1) 過程。
-
# 模擬一個GARCH(1, 1)過程
-
-
-
-
n = 10000
-
w = rnom.ral(sze=n)
-
eps = np.er_ike(w)
-
gsq =pzslie(w)
-
-
for i in rne1, n):
-
sis[i] = a+ a1*(eps[i-1]**2) + b1*siq[i-1]
-
es[i] = w[i] * srt(sisq[i])
模擬 GARCH(1, 1) 過程
再次注意到,總體上這個過程與白噪聲非常相似,然而當我們查看平方的eps序列時,請看一下。
模擬 GARCH(1, 1) 過程平方
顯然存在着自相關,ACF和PACF的滯后期的重要性表明我們的模型需要AR和MA。讓我們看看我們是否能用GARCH(1, 1)模型恢復我們的過程參數。這里我們使用ARCH包中的arch_model函數。
-
# 將GARCH(1, 1)模型與我們模擬的EPS序列相匹配
-
# 我們使用arch函數
-
-
am = arch(ps)
-
fit(dae_freq=5)
-
summary())
GARCH 模型擬合摘要
現在讓我們運行一個使用 SPY 收益的示例。過程如下:
-
迭代 ARIMA(p, d, q) 模型的組合來擬合我們的時間序列。
-
根據 AIC 最低的 ARIMA 模型選擇 GARCH 模型階數。
-
將 GARCH(p, q) 模型擬合到我們的時間序列。
-
檢查模型殘差和殘差平方的自相關
另請注意,我選擇了一個特定的時間段來更好地突出關鍵點。然而,根據研究的時間段,結果會有所不同。
-
-
for i in pq_g:
-
for d in d_ng:
-
for j in p_ng:
-
try:
-
tpml = ARIMA(T,order(i,d,j).fi
-
-
if tmp_aic < best_aic:
-
best_ic =mpac
-
best_oder = (i, d, j)
-
best_ml =tm_ml
-
-
# 注意我已經選擇了一個特定的時間段來運行這個分析
-
bstmoel(TS)
-
-
擬合SPY收益的 ARIMA(3,0,2) 模型的殘差
看起來像白噪聲。
擬合SPY收益的 ARIMA(3,0,2) 模型的平方殘差
平方殘差顯示自相關。讓我們擬合一個 GARCH 模型。
-
# 現在我們可以使用最適合的arima模型參數來擬合arch模型
-
-
p_ = bst_dr
-
o= st_orde
-
q = bst_er
-
-
# 使用學生T分布通常能提供更好的擬合
-
arcd(TS, p=p_, o=o_, q=q_, 'StdensT')
-
fit(uat_eq=5, sp='ff')
-
-
summary
GARCH(3, 2) 模型擬合SPY收益
在處理非常小的數字時,會出現收斂警告。在必要時,將數字乘以10倍的系數以擴大幅度,可以起到幫助作用,但是對於這個演示來說,沒有必要這樣做。下面是模型的殘差。
擬合SPY收益的 GARCH(3, 2) 模型殘差
上面看起來像白噪聲。現在讓我們查看平方殘差的 ACF 和 PACF。
我們已經實現了良好的模型擬合,因為平方殘差沒有明顯的自相關。
最受歡迎的見解
1.HAR-RV-J與遞歸神經網絡(RNN)混合模型預測和交易大型股票指數的高頻波動率
2.R語言中基於混合數據抽樣(MIDAS)回歸的HAR-RV模型預測GDP增長
4.R語言ARMA-EGARCH模型、集成預測算法對SPX實際波動率進行預測