1.3 舉例
參考附加說明,使用遞歸可以利用ARCH類模型方便的進行多期預測。在特定情況下,那些不與平方項或殘差同步的模型並不具有可追蹤的正態解析多期預測。
所有模型支持三種預測方式:
- 解析:基於ARCH類型的結果,解析預測方法對1步式預測總是可用的;多步解析預測方法僅僅適用於對殘差平方項呈線性關係的模型,比如 GARCH 或者 HARCH.
- 模擬:雖然基於模擬方法的預測對任何步數都可用,但是基於ARCH類型的第一個樣本外預測不變,模擬預測方法僅僅適應於步數大於1的情況。模擬預測利用了ARCH類型的結構,並假設殘差服從一定分佈,例如正態分佈或學生T分佈等進行模擬。
- 自舉:自舉方法在估計中利用了源自實際數據的標準化殘差而非假定分佈, 其他則與模擬預測方法類似。與模擬預測方法一樣,自舉預測僅僅對步數大於1的情況有效。此外,自舉預測方法需要一個最小樣本內數量以便產生預測結果。
本文將使用常數均值的標準GARCH(1,1)過程來解釋預測方法。該模型可以表述如下:
代碼中使用了標準普爾500指數數據:
(注:返回以下出錯提示,具體測試時可以使用自己的數據,導入即可)
ImmediateDeprecationError:
Yahoo Actions has been immediately deprecated due to large breaks in the API without the
introduction of a stable replacement. Pull Requests to re-enable these data
connectors are welcome.
See https://github.com/pydata/pandas-datareader/issues
from arch import arch_model
import datetime as dt
import pandas_datareader.data as web
start = dt.datetime(2000,1,1)
end = dt.datetime(2014,1,1)
sp500 = web.get_data_yahoo('^GSPC', start=start, end=end)
returns = 100 * sp500['Adj Close'].pct_change().dropna()
am = arch_model(returns, vol='Garch', p=1, o=0, q=1, dist='Normal')
該模型將使用前10年數據估計參數,然後對最後5年進行預測。
split_date = dt.datetime(2010,1,1)
res = am.fit(last_obs=split_date)
1.3.1 解析預測
解析預測對於大多數與殘差平方項線性相關的模型,比如 GARCH, HARCH等等。這些預測方法利用了
等式的關係,遞歸計算預測結果。對於條件方差的方差預測構建模型如下:
forecasts = res.forecast(horizon=5, start=split_date)
forecasts.variance[split_date:].plot()
1.3.2 模擬預測
基於模擬的預測使用隨機數生成器來模擬標準化的殘差數據流,比如, 這些隨機數被用於生成預先定義路徑的方差,然後平均化方差用於預測。在線性GARCH類模型中,與模擬預測相比並無很多亮點。這些方法在利用如EGARCH等多步模型進行多步預測時更有價值。
假定存在BB模擬路徑,一個單路徑模擬過程如下:
這裏模擬衝擊爲 ,且 bb 表明獨立的模擬路徑。注意,第一個殘差,是樣本殘差,因而並非模擬得出。
最終預測的方差經過BB模擬後得出。
forecasts = res.forecast(horizon=5, start=split_date, method='simulation')
1.3.3 自舉預測
自舉預測(也稱拔靴預測)除了標準化的殘差由模型生成意外,本質與模擬預測一致。標準化的殘差由觀察值生成,估計參數爲:
除了模擬衝擊(使用正態分佈替換)來自,其他與模擬預測方法一致。因此,僅僅t時刻的數據用於模擬路徑。
1.3.4 預測參數
預測方法 forecast()
是模型擬合結果方法的子方法。
params
- 該模型參數用於預測均值和方差。如果沒有指明,則使用擬合結果的參數.horizon
- 正整數值,表示預測最大步數。start
-正整數值,或者輸入模式爲DataFrame格式的日期型數據(string,date或datetime64或Timestamp)。預測自start起至樣本最終結束。如果沒有指明,start設定爲數據長度減1,也就是一步式預測。align
- 原始(默認)或者目標兩種方法,表明預測使用的結果表述方式。原始選項將預測對齊到最後一個觀察值,而目標方法則將預測結果與觀察值索引對齊。method
- 解析(默認),模擬或自舉,表明預測方法。並非所有方法支持所有步數。simulations
- 非負整數,方法爲simulation或bootstrap時表明模擬次數。
1.3.4 預測結果解讀
調用 forecast()
方法會返回 ARCHModelForecast
目標類,它具有3個核心屬性和另外1個模擬預測或自舉預測有用的屬性。
三個屬性爲:
mean
- 預測條件均值。variance
- 預測條件方差。residual_variance
- 預測殘差的方差。當步數大於1的模型動態變化時,這與方差variance不同(比如AR模型)。
每一種屬性包含一個共同的DataFrame結構。
print(forecasts.variance.tail())
h.1 h.2 h.3 h.4 h.5
Date
2013-12-24 0.489534 0.495875 0.501122 0.509194 0.518614
2013-12-26 0.474691 0.480416 0.483664 0.491932 0.502419
2013-12-27 0.447054 0.454875 0.462167 0.467515 0.475632
2013-12-30 0.421528 0.430024 0.439856 0.448282 0.457368
2013-12-31 0.407544 0.415616 0.422848 0.430246 0.439451
h.1列中的值表示一步預測結果,其他h.2,...,h.5分別表示再往前2,...,5列的預測結果。表示結果時日期列是最後使用數據日期進行預測的時間,因而h.1
在行 2013-12-31
是指使用包括2013年12月31日的數據提前一步預測的結果。
默認預測則僅在最後觀察值之後對模型進行估計。
day = dt.timedelta(1)
print(forecasts.variance[split_date - 5 * day:split_date + 5 * day])
返回值如下:
h.1 h.2 h.3 h.4 h.5
Date
2009-12-28 NaN NaN NaN NaN NaN
2009-12-29 NaN NaN NaN NaN NaN
2009-12-30 NaN NaN NaN NaN NaN
2009-12-31 NaN NaN NaN NaN NaN
2010-01-04 0.739303 0.741100 0.744529 0.746940 0.752688
2010-01-05 0.695349 0.702488 0.706812 0.713342 0.721629
2010-01-06 0.649343 0.654048 0.664055 0.672742 0.681263
結果總與數據輸入行相同;無預測值由nan填充(注:即空值).
1.3.5 結果類
class arch.univariate.base.
ARCHModelForecast
(index, mean, variance, residual_variance, simulated_paths=None, simulated_variances=None, simulated_residual_variances=None, simulated_residuals=None, align='origin')[source]
基於ARCH模型的預測容器。
Parameters: |
|
---|
mean
DataFrame – 過程條件均值的預測值
variance
DataFrame – 過程條件方差的預測值
residual_variance
DataFrame – 殘差的條件方差的預測值
classarch.univariate.base.
ARCHModelForecastSimulation
(values, residuals, variances, residual_variances)[source]
基於ARCH模型的模擬或自舉預測容器
Parameters: |
|
---|
values
DataFrame – 過程模擬值
residuals
DataFrame – 產生值的模擬殘差
variances
DataFrame – 模擬值方差
residual_variances
DataFrame – 模擬殘差的方差