全文链接:https://tecdat.cn/?p=33398
金融市场的股票价格时间序列分析一直以来都是投资者和研究者关注的主题之一。准确预测股票价格的趋势对于制定有效的投资策略和决策具有重要意义。因此,许多研究人员使用各种统计方法和模型来分析和预测股票价格的变动(点击文末“阅读原文”获取完整代码数据)。
本文的目标是帮助客户应用GARCH模型对ADBL(ABC Development Bank Limited)股票价格的时间序列进行分析和预测,并通过可视化分析的方式展示结果。ADBL是尼泊尔地区最大的商业银行之一,其股票价格波动对投资者和研究者来说具有重要意义。
首先,我们将收集ADBL股票价格的历史数据,并对其进行描述性统计和可视化分析,以获取对股票价格的初步认识。然后,我们将使用GARCH模型对ADBL股票价格的波动进行建模,并通过模型参数的估计和模型检验来验证模型的适应性。
接下来,我们将利用已建立的GARCH模型对ADBL股票价格的未来走势进行预测。预测结果将以图表和可视化方式呈现,以便读者更加直观地理解和分析。
最后,我们将对模型的预测效果进行评估,并讨论模型的局限性和未来研究的方向。通过本文的研究,我们希望为投资者和研究者提供一个有效的工具和方法,帮助他们更好地理解和预测ADBL股票价格的趋势。
导入库
# 广义自回归条件异方差(GARCH模型) from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error plt.rcParams['figure.figsize'] = (12,6)
这段代码的主要作用是导入所需的库和模块,为接下来的数据处理、图表绘制和模型评估等操作提供必要的工具和函数。
导入数据
# df = df[df['Date'] >= '2015-01-01'] df.head()
这段代码主要是导入数据并对数据进行处理的操作。具体而言,代码的功能如下:
pd.read_csv('ADBL_data.csv')
: 使用pandas
库的read_csv()
函数读取名为 "ADBL_data.csv" 的 CSV 文件,并将数据加载到一个名为df
的数据框(DataFrame)中。df['Date'] = pd.to_datetime(df.Date)
: 将df
数据框中的 "Date" 列转换为日期时间类型。这里使用pd.to_datetime()
函数将日期字符串转换为日期时间格式。# df = df[df['Date'] >= '2015-01-01']
: 这一行代码是对数据进行筛选的注释,表示根据日期进行过滤,只保留日期大于等于 "2015-01-01" 的数据。注释符号#
表示该行代码不会被执行。df.head()
: 打印输出df
数据框的前几行数据,默认显示前5行。通过调用head()
方法可以快速查看数据框的结构和内容。
综上所述,这段代码的作用是读取名为 "ADBL_data.csv" 的 CSV 文件,并将其加载到名为 df
的数据框中。然后对数据进行了格式转换并打印出前几行的数据。
"ADBL的时间序列图"
plt.ylabel("Price") plt.show()
点击标题查阅往期内容
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析
01
02
03
04
df.reset_index(drop=True, inplace=True) df
df.returns.plot() plt.show()
df.returns.describe()
# "平方股票收益的自相关图" plot_acf(df.returns**2) plt.show()
从ACF图中可以看出,在1个滞后时间步长内,方差存在显著的正相关关系。
识别 p 和 q
# 基于最小AIC确定的最佳p和q项 for p in range(1, 15): for q in range(1, 15): try: print(f'GARCH order is ({p}, {q})')
这段代码的主要功能是基于最小化赤池信息准则(AIC)来确定 GARCH 模型的最佳 p 和 q 值。具体而言,代码的执行过程如下:
- 创建一个空字典
dict_aic
,用于保存每个不同 p 和 q 值组合对应的 AIC 值。 - 使用两个嵌套的循环遍历从 1 到 14 的所有整数值。外层循环控制 p 值的范围,内层循环控制 q 值的范围。
- 在每次循环迭代中,尝试构建一个 GARCH 模型,其中 vol 参数设为 'Garch',p 参数设为当前的外层循环变量 p,q 参数设为当前的内层循环变量 q。
- 如果成功拟合模型,则计算该模型的 AIC 值,并将其保存到
dict_aic
字典中对应的键值对中,键为 (p, q),值为 AIC 值。
综上所述,这段代码的作用是通过遍历多个 p 和 q 值的组合,并拟合 GARCH 模型来计算对应的 AIC 值。然后,基于最小 AIC 值确定最佳的 p 和 q 值,并输出结果。
训练/测试分割
# 将训练集和测试集按照70/30的比例分割 st.shape)
模型训练
model.summary()
这段代码的目的是使用 GARCH 模型对训练数据进行拟合,并打印出模型的摘要信息。
具体而言,代码的执行流程如下:
- 创建一个 GARCH 模型对象并将其赋值给变量
model
,其中X_train
是作为训练数据的输入。vol='Garch'
表示使用 GARCH 方式进行建模。p
和q
是 GARCH 模型中的参数,分别表示 ARCH 部分和 GARCH 部分的滞后阶数。
综上所述,这段代码的作用是创建一个 GARCH 模型对象并使用训练数据进行拟合,然后打印出模型的摘要信息,以便查看模型拟合的结果和相关统计指标。
测试集上的滚动预测
# 基于滚动测试集预测波动性。 forecasts = list() for i in range(X_test.shape[0]): forecasts.appe
这段代码的目的是基于滚动测试集预测波动性。
具体而言,代码的执行流程如下:
- 创建一个空列表
forecasts
,用于保存每个时间点的波动性预测结果。 - 进行一个循环,循环次数根据测试数据的行数来确定,每次循环表示一个时间点的波动性预测。
- 在每次循环迭代中,首先获取用于预测的测试数据。通过
df.returns[:-(X_test.shape[0] - i)]
获取了从开始到当前循环迭代索引位置的训练数据。 - 创建一个 GARCH 模型对象,并将预测数据作为输入。模型对象中的
p
和q
参数由之前确定的值指定。
综上所述,这段代码的作用是在每个时间点上,基于滚动的测试数据来预测波动性。通过一个循环,在每次循环迭代中,根据当前的训练数据来构建 GARCH 模型,并使用该模型进行波动性预测,将预测结果保存在 forecasts
列表中。
损失分析
from sklearn.metri # 计算均方根误差 testScore = mean_sq
# 参考训练集最后一个指数的实际收盘价,根据预测收益生成收盘价 # 今日值 = 昨日值 + (pct_returns * 昨日值) / 100 pred_vals = [] for i in range(len(forecasts)): if pred_vals: pre # 今日值 = 昨日值 + (pct_returns * 昨日值) / 100 testSco
date_range = df['Date'][-X_test.shape[0]:] plt.title( plt.legend(fontsize=14) plt.show()