GARCH时间序列滚动模型

本文介绍了如何使用ARIMA和GARCH滚动模型对股票收盘价进行时间序列分析,涉及数据预处理、划分训练集和测试集、以及滑动窗口下的模型训练与预测。代码示例可在finance褪黑素公众号获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滚动模型是一种经济模型,用于描述经济中的决策和动态调整。它通常用于分析长期决策的影响,并考虑在不同时间点上的变化和调整。
本文主要是ARIMA、garch滚动模型的解释和基础代码,原文数据可通过下方链接获取,代码可关注gzh‘finance褪黑素’回复【20240430】获取。

一、数据介绍

本文选用的时间序列数据为某股票1481天内的收盘价数据,如下图所示,第一列为未经处理过的年月日时间,第二列为收盘价数据,在进行正式的模型之前,一定要把时间序列数据处理为内置模型可接受的时间性数据,第二列数据一定要是数值型数据,不能是文本性数据,这也是容易出错的地方。

在这里插入图片描述

将第一列数据变为时间数据:

data['交易日期'] = pd.to_datetime(data['交易日期'])
data.set_index('交易日期', inplace=True)

有划分训练集和测试集来验证模型准确需要的可加如下代码:

train_start = '2018-03-01'
train_end = '2022-02-28'
test_start = '2023-03-01'
test_end = '2024-04-08'

train_data = data[train_start:train_end]['日收盘价']
test_data = data[test_start:test_end]['日收盘价']

这样train_data和test_data都变成有时间标签index的收盘价数据了

二、滑动garch模型

代码逻辑:首先,通过循环遍历每个测试期间的开始到结束日期,训练数据是从当前测试月份的开始日期往前推36个月的数据(开始时间),结束时期是从开始日期经过滑动窗口的长度后的日期,根据日期从整个集中数据中选择当前窗口内的训练数据,这些数据通常是用来模型的。
利用选定的训练数据,建立了GARCH模型,这是一种用于预测波动率的模型。
使用已完成的模型进行预测,得到一个时间步长为1的预测序列,将每个月的波动率预测结果添加到rolling_predictions列表中,最后输出每个月的波动率预测结果。

rolling_predictions = []
for test_month_start in pd.date_range(test_start, test_end, freq='MS'):
    test_month_end = test_month_start + pd.offsets.MonthEnd(0)
    train_end_window = test_month_start
    train_start_window = train_end_window - pd.offsets.MonthBegin(36)#向前移动一个月
    train_set = data[train_start_window:train_end_window]['日收盘价']
    model = arch_model(train_set, vol='Garch', p=1, q=1)
    model_fit = model.fit()
    forecast = model_fit.forecast(horizon=1)
    forecast_variance = forecast.variance.values.squeeze()
    rolling_predictions.append(forecast_variance)
print("Rolling Predictions:")
for prediction in rolling_predictions:
    print(prediction)

具体完整代码可关注gzh‘finance褪黑素’回复关键词【20240430】获取,数据可通过下方链接获取。

### 使用支持向量回归(SVR)进行时间序列滚动预测 对于时间序列分析和支持向量机的应用,在金融收益预测方面,有限混合ARMA-GARCH模型、BP神经网络以及支持向量机各有优劣[^1]。然而,当专注于使用支持向量回归(SVR)执行滚动预测时,主要关注点在于如何构建训练集和测试集,并通过不断更新数据窗口来进行连续预测。 #### 数据预处理 为了准备用于SVR的时间序列数据,通常需要先对原始数据实施标准化或归一化操作。这一步骤有助于提高模型性能并加快收敛速度。此外,考虑到许多实际应用中的非平稳特性,可能还需要差分或其他方法使序列达到稳定状态。 ```python from sklearn.preprocessing import StandardScaler import numpy as np scaler = StandardScaler() data_scaled = scaler.fit_transform(data.reshape(-1, 1)) ``` #### 构建特征矩阵与标签向量 创建滞后变量作为输入特征是常见做法之一。例如,如果要基于过去三个时刻的数据预测当前值,则可构造如下形式的X,y: | t-3 | t-2 | t-1 | | --- | --- | --- | | ... | ... | ... | 其中每一列代表不同延迟期数下的观测值;而y则是对应的实际目标值列表。 ```python def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) look_back = 3 trainX, trainY = create_dataset(data_scaled, look_back) testX, testY = create_dataset(test_data_scaled, look_back) ``` #### 训练SVR模型 选择合适的核函数(如线性、多项式、径向基等),并通过交叉验证优化超参数C,gamma等设置项后即可开始拟合过程。 ```python from sklearn.svm import SVR svr_model = SVR(kernel='rbf', C=1e3, gamma=0.1) svr_model.fit(trainX, trainY) ``` #### 实施滚动预测机制 定义一个滑动窗口大小w,每次仅用最新的w个样本重新训练一次新的SVR实例,从而实现对未来单步或多步提前量的有效估计。随着新观察到来,旧记录被移除以维持固定长度的历史片段参与迭代计算。 ```python predictions = list() for i in range(len(testX)): # 更新训练集 updated_trainX = np.vstack((trainX[-(window_size-1):], testX[:i])) updated_trainY = np.hstack((trainY[-(window_size-1):], testY[:i])) svr_model.fit(updated_trainX, updated_trainY) next_pred = svr_model.predict([testX[i]]) predictions.append(next_pred[0]) # 反变换回原尺度 original_predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1)) ``` 上述流程展示了基本框架下运用支持向量回归完成时间序列滚动预测的方法论概述及其Python代码示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值