計量經濟學(七)——時間序列GARCH模型

郝hai發表於2024-10-16

金融市場中的波動性建模是金融計量經濟學的重要研究內容。時間序列資料,尤其是金融市場資料,往往表現出強烈的波動聚集現象,這意味著波動率在某些時期較高,而在其他時期較低,波動性具有異方差性(heteroskedasticity)。為了有效描述這種現象,Engle(1982年)提出了ARCH(自迴歸條件異方差)模型,此後Bollerslev(1986年)又在其基礎上發展了GARCH(廣義自迴歸條件異方差)模型,成為金融波動性建模的重要工具。

方差在金融學中被廣泛用於衡量投資組合的風險和波動性。波動性反映了資產回報率的變動程度,方差則定量表示這一波動性。當資產的回報率方差較大時,投資收益的不確定性也較高,意味著風險較大。馬科維茨的資產組合理論(Markowitz Portfolio Theory)是現代投資組合理論的基石,該理論基於方差來最佳化投資組合的風險與收益平衡。馬科維茨提出,透過將不同資產組合在一起,投資者可以降低總體風險,因為各資產的收益率並非完全正相關。透過計算各資產的期望收益和方差,投資者可以找到“有效前沿”(Efficient Frontier),即在相同風險水平下最大化預期收益的投資組合。資產組合的總方差(即風險)不僅取決於各資產的方差,還取決於它們之間的協方差,因此分散投資有助於減少非系統性風險。

計量經濟學(七)——時間序列GARCH模型

一、ARCH模型的基本結構

金融資料的特性之一是波動性集中的特徵,這意味著大波動常常跟隨大波動,小波動跟隨小波動,這種現象與方差的動態變化密切相關。在經典的線性迴歸模型中,誤差項的方差通常被假設為常數,即同方差性(homoscedasticity),但對於金融時間序列,這一假設往往不成立。為了建模這種條件異方差性,Engle在1982年提出了ARCH模型,它可以捕捉到金融資料中波動性的時間依賴性。

1.1 ARCH模型的數學形式

ARCH模型是透過假設當前時刻的方差依賴於之前時刻的誤差項的平方來實現的。假設時間序列\(y_t\)​的生成過程如下:

\[y_t = \mu + \epsilon_t \quad \epsilon_t = \sigma_t z_t \]

其中,\(\epsilon_t\)為殘差,服從均值為0的條件正態分佈,\(\sigma_t^2\)為條件方差,且\(z_t\)​為獨立同分布(iid)隨機變數,通常假設其服從標準正態分佈。

ARCH(q)模型假設條件方差是前q期殘差平方的線性函式,表示為:

\[\sigma_t^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2 + \alpha_2 \epsilon_{t-2}^2 + \dots + \alpha_q \epsilon_{t-q}^2 \]

其中,\(\alpha_0 > 0\),且\(\alpha_i \geq 0(i=1, 2, \dots, q)\),以保證方差非負。透過ARCH模型,波動效能夠隨時間動態變化,且過去的誤差項會影響當前的條件方差。

1.2 ARCH模型的侷限性

ARCH模型透過有限個滯後期的誤差項平方描述方差的變化,因此模型的階數q越高,能夠捕捉的波動性資訊越多。但這一特性也帶來了侷限性:

  • 高階問題:為了捕捉長時間序列中的波動性,ARCH模型需要較高的階數,這使得模型估計過程變得複雜,引數估計也變得不穩定。
  • 波動永續性問題:ARCH模型假設波動性僅依賴於有限期的誤差項,未能有效捕捉金融資料中波動性的長記憶特性(即波動性永續性)。

為了克服這些問題,Bollerslev(1986年)在ARCH模型的基礎上提出了GARCH模型。

二、GARCH模型

GARCH模型是對ARCH模型的推廣,其透過引入條件方差的自迴歸結構來簡化模型的階數並同時捕捉到波動性永續性。與ARCH模型只包含滯後期的殘差平方不同,GARCH模型還引入了前期條件方差的自迴歸成分,從而降低了模型的階數需求,並有效捕捉到長時期的波動動態。

2.1 GARCH模型的數學形式

GARCH(p, q)模型結合了ARCH和ARMA模型的思想。它假設當前的條件方差不僅與過去的誤差項平方相關,還與之前的條件方差有關。其形式為:

\[y_t = \mu + \epsilon_t \]

\[\epsilon_t = \sigma_t z_t \]

\[\sigma_t^2 = \alpha_0 + \sum_{i=1}^{q} \alpha_i \epsilon_{t-i}^2 + \sum_{j=1}^{p} \beta_j \sigma_{t-j}^2 \]

其中,\(\alpha_i \geq 0\)\(\beta_j \geq 0\) 確保條件方差為正值;\(\alpha_0\) 是常數項;\(\alpha_i\) 為ARCH項的引數,表示誤差項平方的影響;\(\beta_j\) 為GARCH項的引數,表示前期條件方差的影響。

2.2 GARCH(1,1)模型

最常見的GARCH模型是GARCH(1,1),即條件方差僅依賴於上一期的誤差平方和上一期的條件方差。其形式為:

\[\sigma_t^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2 + \beta_1 \sigma_{t-1}^2 \]

GARCH(1,1)模型的優勢在於其簡潔性,儘管是一個低階模型,但通常能夠很好地擬合金融時間序列中的波動性特徵。

相比ARCH模型,GARCH模型具有以下優勢:

  • 降低模型階數:GARCH模型透過引入條件方差的自迴歸部分,減少了對高階ARCH項的依賴,從而簡化了模型的結構。
  • 波動性永續性:GARCH模型能夠捕捉到波動性的永續性,即大波動通常會持續較長時間,這與金融市場中的實際情況相符。
  • 自適應性:GARCH模型可以靈活調整,能夠適應不同金融時間序列的特性。

2.3 模型的轉換

ARCH模型的基本思想是條件方差依賴於過去的殘差項平方,這類似於自迴歸模型對均值的依賴。然而,ARCH模型的一個缺點是當需要捕捉長時記憶的波動性時,必須引入較高階的ARCH項,導致模型引數繁多,模型複雜性增加。為此,GARCH模型引入了條件方差的自迴歸部分,使得模型不僅依賴於過去的殘差項平方,還依賴於過去的條件方差。可以將GARCH模型視為將ARCH模型中的高階滯後項“打包”為條件方差的一個移動平均過程。其核心思想是:透過將高階ARCH模型的滯後結構簡化為條件方差的ARMA過程,減少了引數個數的同時,仍能捕捉到長期的波動性特徵。
在均值方程中,ARMA模型透過自迴歸和移動平均部分描述了時間序列的動態過程;類似地,在方差方程中,GARCH模型透過條件方差的自迴歸部分和誤差項平方的移動平均部分描述波動率的動態變化。因此,GARCH模型可以視作在異方差框架下的ARMA模型:
- ARCH部分類似於移動平均過程(MA),它描述了過去誤差項的影響。
- GARCH部分類似於自迴歸過程(AR),它描述了過去條件方差的影響。
這種類比為我們理解GARCH模型提供了直觀的框架。

三、GARCH模型的估計與檢驗

GARCH模型的引數估計通常採用最大似然估計(MLE)方法。具體來說,在給定樣本資料的情況下,透過對似然函式進行最大化處理,獲得模型引數的估計值。

3.1 構建似然函式

假設誤差項 \(\epsilon_t\) 服從正態分佈,即 \(z_t \sim N(0,1)\),那麼條件似然函式為:

\[L(\theta) = \prod_{t=1}^{n} f(y_t | \mathcal{F}_{t-1}, \theta) \]

其中,\(\theta\) 為模型引數的集合,\(\mathcal{F}_{t-1}\) 表示基於過去資訊的條件分佈,\(f(y_t | \mathcal{F}_{t-1}, \theta)\) 是條件正態分佈的機率密度函式。

對數似然函式為:

\[\ell(\theta) = \sum_{t=1}^{n} \log f(y_t | \mathcal{F}_{t-1}, \theta) \]

對於正態分佈的GARCH模型,條件對數似然函式為:

\[\ell(\theta) = -\frac{n}{2} \log(2\pi) - \frac{1}{2} \sum_{t=1}^{n} (\log \sigma_t^2 + \frac{\epsilon_t^2}{\sigma_t^2}) \]

透過最大化該對數似然函式,可以獲得模型的引數估計值。由於GARCH模型的條件方差方程是非線性的,對數似然函式的最大化通常需要使用數值最佳化演算法,如BFGS演算法或牛頓-拉夫森法。這些方法能夠有效地找到對數似然函式的最優解,從而估計出模型引數。

3.2 GARCH模型的檢驗方法

在估計GARCH模型後,需對其進行檢驗,以判斷模型的有效性和擬合優度。常見的檢驗方法包括殘差檢驗和引數顯著性檢驗。

殘差檢驗。對於GARCH模型,估計得到的標準化殘差應滿足獨立同分布的要求。因此,可以透過以下兩種方法對殘差進行檢驗:

  • Ljung-Box檢驗:用於檢驗殘差的自相關性,若模型正確擬合,則殘差序列應無顯著自相關。
  • ARCH效應檢驗:用於檢驗殘差平方序列是否存在自相關性,若模型正確擬合,則殘差平方序列應無顯著自相關。
    引數顯著性檢驗。估計得到的引數應滿足顯著性檢驗,即每個引數的t值應顯著不同於零。這可以透過檢驗引數的標準誤來實現,若引數的t值超過某一臨界值,則該引數被認為是顯著的。
    資訊準則選擇模型階數。為了選擇合適的GARCH模型階數,通常使用資訊準則(如AIC或BIC)來對不同階數的模型進行比較。資訊準則考慮了模型的擬合優度和複雜度,階數較低的模型通常具有較低的AIC/BIC值,因此可以透過比較資訊準則來選擇最佳模型。

四、案例分析

滬深300指數下載網址

計量經濟學(七)——時間序列GARCH模型

滬深300指數,是由滬深證券交易所於 2005 年 4 月 8 日聯合釋出的反映滬深 300 指數編制目標和執行狀況的金融指標,並能夠作為投資業績的評價標準,為指數化投資和指數衍生產品創新提供基礎條件。因此,本次資料來源於網易財經,研究的資料集物件是滬深 300 指數(股票程式碼為000300),此次分析選取了滬深 300 指數2013年1月4日到2019年10月17日的工作日收盤價格資料,資料檔案為000300.csv。

4.1 時序圖

為了分析資料的波動情況,對其進行對數化和差分得到對數收益率,下圖為滬深 300 指數的收盤價時序圖和對數收益率時序圖。

收盤價 對數收益率
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates  # 匯入處理日期格式的模組
import os

# 獲取當前工作路徑並找到資料檔案
current_path = os.getcwd()
file_path = os.path.join(current_path, '000300.csv')

# 讀取滬深300指數的CSV檔案
data = pd.read_csv(file_path)

# 確保 'Date' 列是時間序列格式,並矯正格式為 'YYYY-MM-DD'
# 假設 'Date' 列格式為 'YYYYMMDD',我們指定格式來解析它
data['Date'] = pd.to_datetime(data['Date'], format='%Y%m%d')
data.set_index('Date', inplace=True)

# 繪製滬深300指數收盤價時序圖
plt.figure(figsize=(10, 5))
plt.plot(data['Close'], label='HS300 Closing Price')
plt.title('HS300 Closing Price Time Series')
plt.xlabel('Date')
plt.ylabel('Closing Price')

# 只顯示年份在時間軸
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())

plt.grid(True)
plt.legend()
plt.show()

# 計算對數收益率:log(收盤價) 的差分
data['log_return'] = np.log(data['Close']).diff()

# 繪製對數收益率時序圖
plt.figure(figsize=(10, 5))
plt.plot(data['log_return'], label='HS300 Log Returns', color='orange')
plt.title('HS300 Log Returns Time Series')
plt.xlabel('Date')
plt.ylabel('Log Returns')

# 只顯示年份在時間軸
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())

plt.grid(True)
plt.legend()
plt.show()

4.2 ARCH模型建立

為了對收益率資料進行ARCH模型的檢驗,首先我們需要使用arch庫進行擬合和檢驗,確定其階數,並基於殘差和殘差平方的圖形表示模型的擬合效果。步驟概述:

對收益率資料(對數收益率)進行ARCH效應的檢驗,可以使用Ljung-Box檢驗來判斷是否存在自相關。
然後對ARCH模型進行擬合,透過AIC、BIC等準則確定最佳階數。
模型殘差和殘差平方圖:
繪製模型的殘差圖和殘差平方圖,以評估模型的擬合效果。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import os
from arch import arch_model
from statsmodels.stats.diagnostic import acorr_ljungbox

# 獲取當前工作路徑並找到資料檔案
current_path = os.getcwd()
file_path = os.path.join(current_path, '000300.csv')

# 讀取滬深300指數的CSV檔案
data = pd.read_csv(file_path)

# 確保 'Date' 列是時間序列格式,並矯正格式為 'YYYY-MM-DD'
data['Date'] = pd.to_datetime(data['Date'], format='%Y%m%d')
data.set_index('Date', inplace=True)

# 計算對數收益率:log(收盤價) 的差分
data['log_return'] = np.log(data['Close']).diff()

# 刪除NaN值(第一個值會是NaN,以及可能的其他NaN值)
data = data.dropna()

# **對數收益率縮放:乘以100**
data['log_return_scaled'] = data['log_return'] * 100

# 1. Ljung-Box檢驗:檢驗收益率序列的ARCH效應(是否存在自相關)
lb_test = acorr_ljungbox(data['log_return_scaled'], lags=[10], return_df=True)
print("Ljung-Box Test:")
print(lb_test)

# 2. 擬合ARCH模型
best_aic = np.inf
best_bic = np.inf
best_order = None
for i in range(1, 11):  # 嘗試1到10階的ARCH模型
    model = arch_model(data['log_return_scaled'], vol='ARCH', p=i)
    result = model.fit(disp='off')
    
    if result.aic < best_aic:
        best_aic = result.aic
        best_bic = result.bic
        best_order = i

    print(f'ARCH({i}) - AIC: {result.aic}, BIC: {result.bic}')

print(f"\n最佳階數:ARCH({best_order}) - AIC: {best_aic}, BIC: {best_bic}")

# 使用最佳階數擬合最終模型
final_model = arch_model(data['log_return_scaled'], vol='ARCH', p=best_order)
final_result = final_model.fit(disp='off')
print(final_result.summary())

# 3. 繪製殘差圖和殘差平方圖
residuals = final_result.resid
residuals_squared = residuals**2

# 殘差圖
plt.figure(figsize=(10, 5))
plt.plot(data.index, residuals, label='Residuals')
plt.title(f'ARCH({best_order}) Residuals')
plt.xlabel('Date')
plt.ylabel('Residuals')

# 只顯示年份在時間軸
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())

plt.grid(True)
plt.legend()
plt.show()

# 殘差平方圖
plt.figure(figsize=(10, 5))
plt.plot(data.index, residuals_squared, label='Squared Residuals', color='red')
plt.title(f'ARCH({best_order}) Squared Residuals')
plt.xlabel('Date')
plt.ylabel('Squared Residuals')

# 只顯示年份在時間軸
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())

plt.grid(True)
plt.legend()
plt.show()

透過Ljung-Box檢驗結果,初步判斷收益率是否存在自相關,從而決定是否適合ARCH模型。
透過比較不同階數的ARCH模型的AIC和BIC值,選擇最優的模型階數。
繪製殘差圖和殘差平方圖,進一步驗證模型擬合的合理性。

Ljung-Box Test:
      lb_stat  lb_pvalue
10  45.805398   0.000002
ARCH(1) - AIC: 5887.888532447291, BIC: 5904.11230541497
ARCH(2) - AIC: 5789.433050609739, BIC: 5811.064747899978
ARCH(3) - AIC: 5715.202078933974, BIC: 5742.241700546772
ARCH(4) - AIC: 5660.977670391141, BIC: 5693.425216326499
ARCH(5) - AIC: 5627.943603865988, BIC: 5665.799074123905
ARCH(6) - AIC: 5586.313260095362, BIC: 5629.576654675839
ARCH(7) - AIC: 5548.808974157157, BIC: 5597.480293060193
ARCH(8) - AIC: 5550.795393095225, BIC: 5604.874636320821
ARCH(9) - AIC: 5540.3366884804, BIC: 5599.823856028555
ARCH(10) - AIC: 5507.216214925034, BIC: 5572.111306795749

最佳階數:ARCH(10) - AIC: 5507.216214925034, BIC: 5572.111306795749
                      Constant Mean - ARCH Model Results                      
==============================================================================
Dep. Variable:      log_return_scaled   R-squared:                       0.000
Mean Model:             Constant Mean   Adj. R-squared:                  0.000
Vol Model:                       ARCH   Log-Likelihood:               -2741.61
Distribution:                  Normal   AIC:                           5507.22
Method:            Maximum Likelihood   BIC:                           5572.11
                                        No. Observations:                 1649
Date:                Wed, Oct 16 2024   Df Residuals:                     1648
Time:                        20:47:08   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.0716  2.945e-02      2.432  1.501e-02 [1.391e-02,  0.129]
                               Volatility Model                              
=============================================================================
                 coef    std err          t      P>|t|       95.0% Conf. Int.
-----------------------------------------------------------------------------
omega          0.3085  8.471e-02      3.642  2.701e-04      [  0.143,  0.475]
alpha[1]       0.0168  4.802e-02      0.350      0.726   [-7.733e-02,  0.111]
alpha[2]       0.1130  4.295e-02      2.632  8.495e-03    [2.885e-02,  0.197]
alpha[3]       0.1345  4.211e-02      3.193  1.406e-03    [5.194e-02,  0.217]
alpha[4]       0.1062  5.821e-02      1.825  6.800e-02   [-7.855e-03,  0.220]
alpha[5]       0.1094  4.917e-02      2.225  2.611e-02    [1.301e-02,  0.206]
alpha[6]       0.0823  5.225e-02      1.576      0.115   [-2.009e-02,  0.185]
alpha[7]       0.1702  6.311e-02      2.698  6.986e-03    [4.655e-02,  0.294]
alpha[8]   9.0539e-03  3.242e-02      0.279      0.780 [-5.449e-02,7.260e-02]
alpha[9]       0.0884  5.176e-02      1.708  8.757e-02   [-1.302e-02,  0.190]
alpha[10]      0.1462  5.563e-02      2.628  8.597e-03    [3.714e-02,  0.255]
=============================================================================
殘差圖 殘差平方圖

ARCH模型表示式: σ²ₜ = 0.3085 + 0.0168 * ε²ₜ₋1 + 0.1130 * ε²ₜ₋2 + 0.1345 * ε²ₜ₋3 + 0.1062 * ε²ₜ₋4 + 0.1094 * ε²ₜ₋5 + 0.0823 * ε²ₜ₋6 + 0.1702 * ε²ₜ₋7 + 0.0091 * ε²ₜ₋8 + 0.0884 * ε²ₜ₋9 + 0.1462 * ε²ₜ₋10

4.3 GARCH模型建立

資料處理:程式首先讀取CSV檔案並將日期列轉換為時間序列格式。計算對數收益率並刪除缺失值。
Ljung-Box檢驗:對收益率序列進行Ljung-Box檢驗,判斷是否存在自相關性。
模型階數評估:程式嘗試不同的GARCH模型階數 (p, q),並計算每個模型的AIC和BIC值。透過遍歷多種組合,我們能夠選擇AIC/BIC最小的模型作為最優模型。
GARCH模型擬合:選擇AIC最小值對應的GARCH模型進行擬合,並輸出其詳細的估計結果。
殘差分析:繪製了模型的殘差及殘差平方的時序圖,以檢驗模型的擬合效果。
輸出GARCH模型表示式:程式從最優模型中提取引數,輸出該GARCH模型的數學表示式。並透過Markdown語法格式化成紅色加粗的字型,字號放大。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from arch import arch_model
from statsmodels.stats.diagnostic import acorr_ljungbox

# 獲取當前工作路徑並找到資料檔案
current_path = os.getcwd()
file_path = os.path.join(current_path, '000300.csv')

# 讀取滬深300指數的CSV檔案
data = pd.read_csv(file_path)

# 確保 'Date' 列是時間序列格式,並設定為索引
data['Date'] = pd.to_datetime(data['Date'], format='%Y%m%d')
data.set_index('Date', inplace=True)

# 計算對數收益率:log(收盤價) 的差分
data['log_return'] = np.log(data['Close']).diff()

# 刪除缺失值(首次差分會產生NaN)
data = data.dropna()

# 對收益率進行放大100倍,避免DataScaleWarning
data['log_return_scaled'] = data['log_return'] * 100

# 繪製對數收益率時序圖
plt.figure(figsize=(10, 5))
plt.plot(data['log_return_scaled'], label='HS300 Scaled Log Returns', color='orange')
plt.title('HS300 Scaled Log Returns Time Series')
plt.xlabel('Date')
plt.ylabel('Scaled Log Returns')
plt.grid(True)
plt.legend()
plt.show()

# Ljung-Box檢驗
lb_test = acorr_ljungbox(data['log_return_scaled'], lags=[10], return_df=True)
print(f"Ljung-Box Test:\n{lb_test}")

# 設定最大階數範圍
max_p = 5  # GARCH模型的最大p階
max_q = 5  # GARCH模型的最大q階

# 用於儲存AIC和BIC的結果
aic_values = np.zeros((max_p, max_q))
bic_values = np.zeros((max_p, max_q))

# 遍歷不同的(p, q)階數的GARCH模型,評估AIC/BIC
for p in range(1, max_p + 1):
    for q in range(1, max_q + 1):
        try:
            model = arch_model(data['log_return_scaled'], vol='Garch', p=int(p), q=int(q))
            result = model.fit(disp='off')
            aic_values[p-1, q-1] = result.aic
            bic_values[p-1, q-1] = result.bic
        except Exception as e:
            print(f"Error for GARCH({p},{q}): {e}")
            aic_values[p-1, q-1] = np.nan
            bic_values[p-1, q-1] = np.nan

# 找到AIC/BIC最小值對應的(p, q)階數
min_aic_idx = np.unravel_index(np.nanargmin(aic_values), aic_values.shape)
min_bic_idx = np.unravel_index(np.nanargmin(bic_values), bic_values.shape)

optimal_p_aic, optimal_q_aic = int(min_aic_idx[0] + 1), int(min_aic_idx[1] + 1)
optimal_p_bic, optimal_q_bic = int(min_bic_idx[0] + 1), int(min_bic_idx[1] + 1)

print(f"Optimal (p, q) based on AIC: GARCH({optimal_p_aic}, {optimal_q_aic})")
print(f"Optimal (p, q) based on BIC: GARCH({optimal_p_bic}, {optimal_q_bic})")

# 選擇AIC最小值對應的最優GARCH模型進行擬合
final_model = arch_model(data['log_return_scaled'], vol='Garch', p=optimal_p_aic, q=optimal_q_aic)
garch_fit = final_model.fit(disp='off')
print(garch_fit.summary())

# 提取殘差
residuals = garch_fit.resid
# 殘差平方
residuals_squared = residuals ** 2

# 繪製殘差圖
plt.figure(figsize=(10, 5))
plt.plot(residuals, label='Residuals')
plt.title('GARCH Model Residuals')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.legend()
plt.show()

# 繪製殘差平方的時序圖
plt.figure(figsize=(10, 5))
plt.plot(residuals_squared, label='Squared Residuals', color='purple')
plt.title('GARCH Model Squared Residuals')
plt.xlabel('Date')
plt.ylabel('Squared Residuals')
plt.grid(True)
plt.legend()
plt.show()

# 輸出最優GARCH模型表示式
params = garch_fit.params
omega = params['omega']
alpha1 = params['alpha[1]']
beta1 = params['beta[1]']

# 構建GARCH模型的表示式
garch_expression = f"σ²ₜ = {omega:.4f} + {alpha1:.4f} * ε²ₜ₋1 + {beta1:.4f} * σ²ₜ₋1"
print(f"Optimal GARCH Model Expression (AIC-based):\n{garch_expression}")

# Markdown格式輸出模型表示式
markdown_expression = f"""
<p style="font-size: 2em; color: red; font-weight: bold;">
    {garch_expression}
</p>
"""
print("\nMarkdown GARCH Model Expression:")
print(markdown_expression)
Ljung-Box Test:
      lb_stat  lb_pvalue
10  45.805398   0.000002
Optimal (p, q) based on AIC: GARCH(2, 1)
Optimal (p, q) based on BIC: GARCH(1, 1)
                     Constant Mean - GARCH Model Results                      
==============================================================================
Dep. Variable:      log_return_scaled   R-squared:                       0.000
Mean Model:             Constant Mean   Adj. R-squared:                  0.000
Vol Model:                      GARCH   Log-Likelihood:               -2706.18
Distribution:                  Normal   AIC:                           5422.35
Method:            Maximum Likelihood   BIC:                           5449.39
                                        No. Observations:                 1649
Date:                Wed, Oct 16 2024   Df Residuals:                     1648
Time:                        21:05:44   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.0565  2.593e-02      2.179  2.933e-02 [5.679e-03,  0.107]
                               Volatility Model                              
=============================================================================
                 coef    std err          t      P>|t|       95.0% Conf. Int.
-----------------------------------------------------------------------------
omega      8.1043e-03  5.496e-03      1.474      0.140 [-2.668e-03,1.888e-02]
alpha[1]       0.0101  3.563e-02      0.285      0.776 [-5.968e-02,7.997e-02]
alpha[2]       0.0641  4.308e-02      1.487      0.137   [-2.036e-02,  0.149]
beta[1]        0.9254  1.766e-02     52.402      0.000      [  0.891,  0.960]
=============================================================================

Garch模型表示式:σ²ₜ = 0.0081 + 0.0101 * ε²ₜ₋1 + 0.9254 * σ²ₜ₋1

總結

從ARCH模型到GARCH模型的發展反映了計量經濟學家在處理時間序列波動性方面的不斷創新與進步。ARCH模型透過引入條件異方差性成功描述了金融市場中的波動聚集現象,而GARCH模型則透過條件方差的自迴歸結構進一步增強了對波動性永續性的描述能力。兩者都為金融市場的波動性分析提供了重要的工具。隨著GARCH模型的不斷擴充套件,如EGARCH、TGARCH等,研究者能夠捕捉到更多複雜的金融市場特徵,如波動性非對稱性和厚尾分佈。透過適當的估計和檢驗方法,GARCH模型能夠為金融風險管理和市場預測提供堅實的理論基礎和實用工具。

計量經濟學(七)——時間序列GARCH模型

參考資料

  1. 計量經濟學經典eviewsARCH和GARCH估計
  2. 【R語言】GARCH模型的應用
  3. 波動性GARCH模型與波動率預測(程式碼+結果分析)

相關文章