📜  arma-garch 模型 python (1)

📅  最后修改于: 2023-12-03 15:29:28.143000             🧑  作者: Mango

ARMA-GARCH模型介绍

ARMA-GARCH模型是一种非常常见的金融时间序列模型,可以用来对波动性进行建模和预测。在Python中,我们可以使用statsmodels库中的ARIMA和ARCH模块来实现ARMA-GARCH模型。在本文中,我们将重点介绍ARMA-GARCH模型的原理、实现方法和实例。

什么是ARMA-GARCH模型?

ARMA-GARCH模型是由自回归滑动平均模型(ARMA)和广义自回归条件异方差模型(GARCH)组成的模型。ARMA模型用来对时间序列的均值进行建模,GARCH模型用来对时间序列的波动性进行建模。因为金融时间序列的波动性通常不是恒定的,而是具有聚集性和波动性聚焦等特征,因此ARMA-GARCH模型成为了一种流行的建模和预测工具。

怎么实现ARMA-GARCH模型?

在Python中可以使用statsmodels库中的ARIMA和ARCH模块来实现ARMA-GARCH模型。下面是一个简单的实现ARMA(2,1)-GARCH(1,1)模型的例子。

import numpy as np
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import arma_order_select_ic
from statsmodels.tsa.stattools import acf, pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa import stattools
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.stats.stattools import durbin_watson
from statsmodels.stats.diagnostic import het_arch
from statsmodels.tsa.statespace.sarimax import SARIMAX
import statsmodels.api as sm

#生成随机数据
np.random.seed(1)
n = 1000
#生成ARMA(2,1)数据
ar_coef = [1, -0.5, -0.2]
ma_coef = [1, 0.3]
arma_process = ArmaProcess(ar_coef, ma_coef)
y = arma_process.generate_sample(n)
#添加GARCH(1,1)波动性
from arch.univariate import GARCH
garch11 = GARCH(p=1, q=1)
res = garch11.fit(y)
pred_volatility = res.conditional_volatility
#描绘图像
import matplotlib.pyplot as plt
plt.plot(y, label='y')
plt.plot(pred_volatility, label='volatility')
plt.legend()
plt.show()
ARMA-GARCH模型的应用实例

ARMA-GARCH模型具有广泛的应用,包括金融领域的股票价格、汇率、期货价格等。以下是一个示例,我们使用ARMA-GARCH模型来预测股票价格。

首先是数据准备,我们使用pandas读取纽约证券交易所上的苹果公司(AAPL)的股票数据:

import pandas as pd
import pandas_datareader.data as web

start = pd.to_datetime('2010-01-01')
end = pd.to_datetime('2020-01-01')
aapl = web.DataReader('AAPL', 'yahoo', start, end)
aapl.head()

然后我们计算每日的对数收益率,并对其进行可视化

aapl['log_return'] = np.log(aapl['Adj Close']).diff()
aapl.dropna(inplace=True)

import matplotlib.pyplot as plt

plt.plot(aapl['log_return']);

AAPL_log_return.png

接下来我们可以使用滚动的方式估计模型参数,并进行模型预测

from arch import arch_model

train = aapl.iloc[:2000]
test = aapl.iloc[2000:]

model = arch_model(train['log_return'], p=1, q=1)
model_fit = model.fit()
print(model_fit.summary())

forecasts = model_fit.forecast(horizon=len(test), method='simulation')

最后我们将预测结果可视化,并计算预测误差

plt.plot(test['log_return']);
plt.plot(forecasts.mean.iloc[-1]);
plt.fill_between(
    forecasts.mean.index, forecasts.simulation['95%'], forecasts.simulation['5%'], alpha=0.2
)

print("MAE:", np.abs(forecasts.mean.iloc[-1] - test['log_return']).mean())
print("RMSE:", np.square(forecasts.mean.iloc[-1] - test['log_return']).mean())

AAPL_forecast.png

ARMA-GARCH模型在金融时间序列建模中是一个非常常见的工具,可以通过Python中的statsmodels库和arch库进行实现。在实际应用中,我们可以使用ARMA-GARCH模型来预测股票价格和波动性等。