请问有没有自己编写的(很少使用有关garch程序包中的拟合作用等函数)比较完整的GARCH拟合股票收益率的程序

我想用AR(1)-GARCH(1,1)模型来拟合股票收益率数据,想得到估计后的模型参数,能算VaR就更好了。
但由于参考的论文所使用的innovation的分布的密度函数不常见,在相关garch包里面不提供可选参数,garch程序包里面一般只有(偏)高斯、学生T、广义误差等,只能自己编写设定函数形式,但我又没有可供参考的完整garch拟合程序来学习。
我想用的是在Gram-Charlier分布上修改了一点的函数形式,f(x|gamma_1, gamma_2, delta)是以标准正态分布(均值0,方差1)为基础的有限项展开,表达式如下:

img

我也尝试下载了r语言的rugarch包源代码,由于包里面函数太多,理不清勾结关系。

library(rugarch)
sGARCHspec = ugarchspec(mean.model = list(armaOrder = c(1, 0), 
                                          include.mean = TRUE), 
                        variance.model = list(model = 'sGARCH', 
                                              garchOrder = c(1, 1)), 
                        distribution.model = 'ged')
sGARCHfit = ugarchfit(sGARCHspec, data = df$rate, solver = 'hybrid')

我可以学和懂python、r、Matlab
想问问大家有没有自己编写的较为完整的garch拟合程序,求不吝赐教或指条明路。

背景是沪深300指数的收益率,基于该基础上实现的:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
from arch import arch_model

data = pd.read_csv('hs300.csv', index_col=0, parse_dates=True)
returns = 100 * data['pct_chg'].dropna()
model = arch_model(returns, vol='Garch', p=1, q=1)
results = model.fit()
print(results.summary())


horizon = 10
forecast = results.forecast(horizon=horizon)
var_95 = np.sqrt(forecast.variance.iloc[-1] * 252) * norm.ppf(0.05)


print('VaR (95%):', var_95)

fig, ax = plt.subplots(figsize=(12, 6))
returns.plot(ax=ax, label='observed')
forecast.variance.plot(ax=ax, label='forecast')
plt.legend()
plt.show()


MATLAB用GARCH模型对股票市场收益率时间序列波动的拟合与预测
可以借鉴下
https://blog.csdn.net/qq_19600291/article/details/121343853

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
若您想要自己编写GARCH拟合股票收益率的程序,可以参考以下步骤:

  1. 从数据源(如Quandl)获取股票收益率数据。

  2. 设定GARCH模型的参数,包括ARCH和GARCH的滞后阶数、收益率的初始值等等。

  3. 编写GARCH拟合的函数,函数需要包括以下步骤:

    a. 预处理股票收益率数据,包括去除均值和计算收益率。

    b. 设定初始值并计算拟合模型。

    c. 为了计算VaR,需要估计模型残差序列的分布,可以使用频率分布、正态分布等等,或者更加复杂的分布。根据对残差分布的设定,计算模型的条件异方差(Conditional Heteroskedasticity)和波动率。

    d. 根据逐步加入新的残差,逐个计算VaR。

  4. 最后可以使用模型的参数和计算结果,进行回测和风险度量。

下面是Python代码的一个示例,使用了ARCH校准来计算初值:

from scipy.optimize import minimize
import numpy as np

def garch_logL(parameters, data, ar, ma, dist):
    # 定义GARCH-log似然函数
    alpha = parameters[:ar]
    beta = parameters[ar:]
    L = len(data)
    s = np.ones(L) * np.var(data)
    eps = data / np.sqrt(s)
    logl = 0
    for i in range(ar, L):
        s[i] = np.dot(alpha, eps[i-ar:i]**2) + np.dot(beta, s[i-ma:i])
        if dist == "Normal":
            logl += -0.5*np.log(2*np.pi) - 0.5*np.log(s[i]) - 0.5*eps[i]**2/s[i]
        elif dist == "t":
            logl += np.log(gamma((nu+1)/2) / ( gamma(nu/2) * np.sqrt(np.pi*nu) )) \
                    + 0.5*np.log(1 + eps[i]**2/nu/s[i]) - 0.5*(nu+1)*np.log(1 + eps[i]**2/nu/s[i])
    logl = -np.mean(logl)
    return logl

def get_init_values(data, ar, ma):
    # 使用ARCH校准的方法计算初始值
    L = len(data)
    r2 = np.ones(ar) * np.var(data)
    for i in range(ar, L):
        eps = data[i-ar:i]
        r2 = np.append(r2, np.dot(eps, eps) / ar)
    s = np.update.rolling_sum(r2, ma)[-1] / ma
    return {"s":s, "r2":r2}

def garch_fit(data, ar=1, ma=1, dist="Normal"):
    init = get_init_values(data, ar, ma)
    args = (data, ar, ma, dist)
    parameters = np.concatenate((init["r2"]/(ar+ma), init["s"]/ma))
    bounds = [(0,1)] * (ar+ma) * 2
    bounds += [(1e-10, None)]
    res = minimize(garch_logL, parameters, args=args, bounds=bounds, method="L-BFGS-B")
    alpha = res.x[:ar]
    beta = res.x[ar:]
    sigma2 = np.ones_like(data) * np.mean(data**2)
    for i in range(ar, len(data)):
        sigma2[i] = np.dot(alpha, data[i-ar:i]**2) + np.dot(beta, sigma2[i-ma:i])
    return {"theta":res.x, "sigma2":sigma2}

这个代码使用了最小化GARCH的负对数似然函数来求解GARCH模型的参数,可以自行尝试将优化方法改为其他算法。同时,代码还使用了ARCH校准的方法计算GARCH模型的初值,这在数据量较大的时候可以提高拟合效率。

在使用该函数拟合股票收益率数据后,我们可以得到模型的参数和条件异方差序列。同时,您可以进行以下操作:

  1. 使用不同的分布计算VaR。

  2. 使用拟合后的模型,对未来的数据进行预测。

  3. 使用回测来评估模型的表现,包括计算策略的收益和风险度量。
    如果我的回答解决了您的问题,请采纳!

我无法提供一个完整的自己编写的GARCH拟合程序,因为这需要深入的数学和统计知识,同时也需要对编程语言的熟悉程度。但是我可以给出一些指导和建议来帮助你开始自己编写一个GARCH拟合程序。

首先,你需要了解GARCH模型的基本原理和数学公式,并且理解如何通过最大似然估计来估计GARCH模型的参数。

其次,你需要熟悉Matlab的相关函数和工具箱,如garch()函数用于创建GARCH模型的对象,estimate()函数用于估计模型参数,forecast()函数用于预测未来期间的方差和收益率等。

第三,你需要了解如何在Matlab中处理股票收益率数据,如如何导入数据、如何对数据进行处理和转换等等。

最后,你需要自己编写一个函数来代表你的GARCH模型,并设置相应的参数和函数形式。在此过程中,你可以参考其他研究论文和相关的Matlab代码,同时也可以利用Rugarch包等其他语言的工具箱来加深自己的理解和学习。

以下是一个示例代码,用于创建一个GARCH模型对象,并用于估计股票收益率数据的参数,并利用预测的方差和收益率来计算VaR值。这只是一个简单的示例代码,仅供参考。

%导入数据
data = readtable('stock_price.csv');
returns = diff(log(data.Close)); %计算log收益率的一阶差分

%创建GARCH(1,1)模型对象
garchMdl = garch(1,1);

%估计模型参数
garchEstMdl = estimate(garchMdl, returns);

%预测下一期的方差和收益率
[forecastReturns, forecastVar] = forecast(garchEstMdl, 1, 'Y0', returns);

%计算VaR
VaR = - norminv(0.05, forecastReturns, sqrt(forecastVar));