1.單變量波動率模型
1.1引言
1.2 舉例
1.3 預測
1.4 預測舉例
1.5 預測類型
1.6 均值模型
1.7 波動率過程
1.8 不變方差過程
1.9 分佈
1.10 背景及引用
1.1 關於ARCH 模型的介紹
1.1.1理論模型
ARCH 模型是一種流行的波動率建模方法,其主要使用收益率或殘差的觀測值作爲波動率參考方式。一種基本的GARCH 模型表示如下:
完整的GARCH模型需要上述三個部分,然而簡單的計算可以利用下式得出:
import datetime as dt
import pandas_datareader.data as web
from arch import arch_model
start = dt.datetime(2000, 1, 1)
end = dt.datetime(2014, 1, 1)
sp500 = web.DataReader('^GSPC', 'yahoo', start=start, end=end)
returns = 100 * sp500['Adj Close'].pct_change().dropna()
am = arch_model(returns)
注:實際無法運行,由於Yahoo網絡變動,導致出現提示:
ImmediateDeprecationError:
Yahoo Daily 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
am = arch_model(returns)
也可從結構設計開始手動構建ARCH模型:
from arch import ConstantMean, GARCH, Normal
am = ConstantMean(returns)
am.volatility = GARCH(1, 0, 1)
am.distribution = Normal()
-----
這幾行代碼已經無法正常使用,應該是升級導致。因此,直接的使用應該是:
am = arch_model(abc3.iloc[1:800,:])
res=am.fit() #擬合
res.summary#擬合結果
1.1.2 關鍵內容:關於arch_model方法
arch.
arch_model
(y, x=None, mean='Constant', lags=0, vol='Garch', p=1, o=0, q=1, power=2.0, dist='Normal', hold_back=None)[source]
使用便利函數以便arch模型快速初始化:
Parameters: |
|
---|---|
Returns: |
model – Configured ARCH model |
Return type: |
除了直接使用arch_model以外,也可以具體表明GARCH參數來描述均值及波動率模型:
am = arch_model(returns, mean='AR', lags=2, vol='harch', p=[1, 5, 22])
下面可以是一個0均值,TGARCH模型,誤差爲學生T分佈的通用ARCH模型:
am = arch_model(returns, mean='zero', p=1, o=1, q=1, power=1.0, dist='StudentsT')
注意:
輸入內容並非特指,均值爲0的滯後期設定等,默認忽略。
模型結果
所有模型返回同樣的對象,即結果類(ARCHModelResult)
1.1.3 ARCHModelResult
class arch.univariate.base.
ARCHModelResult
(params, param_cov, r2, resid, volatility, cov_type, dep_var, names, loglikelihood, is_pandas, optim_output, fit_start, fit_stop, model)[source]
ARCHModel 模型的估計結果
Parameters: |
|
---|
summary
() [source] :對結果進行彙總。
plot
() :對波動率和標準化的殘差進行繪圖。
conf_int
()[source] :置信區間。
loglikelihood :浮點型,對數似然率的值。
params :時間序列類型,估計所得參數。
param_cov :DataFrame類型,估計參數的方差協方差。
resid :
{ndarray, Series}:觀察值數組,包括模型殘差。
model
ARCHModel –Model:用來擬合的模型實例
conf_int
(alpha=0.05)[source]
Parameters: | alpha (浮點型,可選) – 構建置信區間的規模(即概率). |
---|---|
Returns: | ci – 數組型,第i行包括第i個參數的置信區間。 |
Return type: | ndarray(n維數組型) |
forecast
(params=None, horizon=1, start=None, align='origin', method='analytic', simulations=1000, rng=None)
利用估計所得模型參數進行預測
Parameters: |
|
---|---|
Returns: |
forecasts – t*h data frame 的預測結果。其預測或計算方式由align參數控制。 |
Return type: |
注意:
最基本的1步式預測將會返回與原始數據同維的向量,這裏第t個值即爲用於t+1時間預測的值。當步數大於1時且計算方式默認時,在 [t, h] 處的預測值即爲在t時間, h+1步的預測值。
如果模型包括外生變量(model.x非空),那麼僅僅有1步式預測可用。當步數 > 1時,將會出現提示,且所有列除第一列外,全部爲空。
如果計算方式爲 ‘origin’,[t,h] 預測值基於y[:t] 預測且步數爲h+1(那就是說,截至但不包括t). 例如,y[100,2] 表示使用前100個數據點進行3步式預測,即實現結果爲 y[100 + 2]. 如果計算方式是 ‘target’, 那麼同樣的預測表示爲 [102, 2]。這樣是爲了與原始數值一致便於比較,但是仍然在同一列中。
hedgehog_plot(params=None, horizon=10, step=10, start=None, type='volatility', method='analytic', simulations=1000)
基於估計模型將預測結果圖形化。
Parameters: |
|
---|
Returns: |
fig – 圖形手柄 |
---|---|
Return type: |
圖形 |
Examples
>>> import pandas as pd
>>> from arch import arch_model
>>> am = arch_model(None,mean='HAR',lags=[1,5,22],vol='Constant')
>>> sim_data = am.simulate([0.1,0.4,0.3,0.2,1.0], 250)
>>> sim_data.index = pd.date_range('2000-01-01',periods=250)
>>> am = arch_model(sim_data['data'],mean='HAR',lags=[1,5,22], vol='Constant')
>>> res = am.fit()
>>> fig = res.hedgehog_plot(type='mean')
plot
(annualize=None, scale=None)
標準化殘差或波動率的圖形化展示
Parameters: | |
---|---|
Returns: |
fig – 圖形手柄 |
Return type: |
圖形 |
舉例:
>>> from arch import arch_model
>>> am = arch_model(None)
>>> sim_data = am.simulate([0.0, 0.01, 0.07, 0.92], 2520)
>>> am = arch_model(sim_data['data'])
>>> res = am.fit(update_freq=0, disp='off')
>>> fig = res.plot()
使用年化波動率畫圖:
>>> fig = res.plot(annualize='D')
使用252日代替360日畫圖,以便更符合實際:
>>> fig = res.plot(scale=360)
summary
()[source]
構建模型擬合結果.
Returns: | summary – 對象,包括表格以及便利輸出類內容,諸如 text, html or latex |
---|---|
Return type: | 結果實例 |
如果使用 fix
方法, 該對象 (ARCHModelFixedResult
) 與另一對象 (ARCHModelResult
)不同,兩者在參數沒有估計時不存在相關關係。
1.1.4 ARCHModelFixedResult
class arch.univariate.base.
ARCHModelFixedResult
(params, resid, volatility, dep_var, names, loglikelihood, is_pandas, model)[source]
對於固定參數ARCH模型的估計結果
Parameters: |
---|
summary
() source] :彙總結果。
plot
()[source]
對波動率和標準化殘差畫圖。
forecast
()[source]
利用模型構建預測。
loglikelihood
float – 對數似然值
params
Series – 所估計參數。
resid
{ndarray, Series} – 包括模型殘差的觀察值數組。
model
ARCHModel – 用於擬合的模型實例。
forecast
(params=None, horizon=1, start=None, align='origin', method='analytic', simulations=1000, rng=None)[source]
利用估計模型進行預測。
Parameters: |
|
---|---|
Returns: |
forecasts – t*h大小的dataframe格式的預測結果。該預測的方法由align參數控制。 |
Return type: |
注意:
最基本的1步式預測會返回與原始數據同樣長度的向量,且第t個值爲t時對於t+1時的預測。當預測步數大於1時且使用默認align方式,[t,h]的預測值即是時間t對h+1步的預測。
如果模型包括外生變量(model.x爲非空),則僅有1步式預測可用。預測步數大於1時將會產生警示信息,所有列除第1列外,將會被空值填充。
如果align方式爲原始方法,對於步數h + 1,預測結果[t,h]包括數據 y[:t] (即趨近t但不包括t). 例如, y[100,2] 爲3步式預測,使用前100個數據點,對應結果 y[100 + 2]. 如果選擇 ‘target’方法, 那麼同樣的預測位置爲 [102, 2], 因此與預測時使用的原始數據一致,但是仍然爲同一列。
hedgehog_plot
(params=None, horizon=10, step=10, start=None, type='volatility', method='analytic', simulations=1000)[source]
Plot forecasts from estimated model
Parameters: |
|
---|---|
Returns: |
fig – 繪圖手柄。 |
Return type: |
圖像 |
舉例:
>>> import pandas as pd
>>> from arch import arch_model
>>> am = arch_model(None,mean='HAR',lags=[1,5,22],vol='Constant')
>>> sim_data = am.simulate([0.1,0.4,0.3,0.2,1.0], 250)
>>> sim_data.index = pd.date_range('2000-01-01',periods=250)
>>> am = arch_model(sim_data['data'],mean='HAR',lags=[1,5,22], vol='Constant')
>>> res = am.fit()
>>> fig = res.hedgehog_plot(type='mean')
plot
(annualize=None, scale=None)[source]
標準化殘差及條件波動率的圖示。
Parameters: | |
---|---|
Returns: |
fig – 繪圖手柄 |
Return type: |
圖像 |
舉例
>>> from arch import arch_model
>>> am = arch_model(None)
>>> sim_data = am.simulate([0.0, 0.01, 0.07, 0.92], 2520)
>>> am = arch_model(sim_data['data'])
>>> res = am.fit(update_freq=0, disp='off')
>>> fig = res.plot()
年化波動率圖:
>>> fig = res.plot(annualize='D')
以360日代替慣常使用的 252 日來畫圖:
>>> fig = res.plot(scale=360)
summary
()[source]
擬合結果:
Returns: | summary –包括表格以及文本,html和latex等便利輸出內容。 |
---|---|
Return type: | 結果實例 |