Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列(上)

简介: Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列

原文链接:http://tecdat.cn/?p=24092


前言


在量化金融中,我学习了各种时间序列分析技术以及如何使用它们。

通过发展我们的时间序列分析 (TSA) 方法组合,我们能够更好地了解已经发生的事情,_并对_未来做出更好、更有利的预测。示例应用包括预测未来资产收益、未来相关性/协方差和未来波动性。


在我们开始之前,让我们导入我们的 Python 库。

import pandas as pd
import numpy as np

让我们使用pandas包通过 API 获取一些示例数据。

# 原始调整后的收盘价
daa = pdDatrme({sx(sm)for sm i syos})
# 对数收益率
ls = log(dta/dat.sit(1)).dropa()


基础知识


什么是时间序列?


时间序列是按时间顺序索引的一系列数据点。——Wikipedia


平稳性


为什么我们关心平稳性?

  • 平稳时间序列 (TS) 很容易预测,因为我们可以假设未来的统计属性与当前的统计属性相同或成比例。
  • 我们在 TSA 中使用的大多数模型都假设协方差平稳。这意味着这些模型预测的描述性统计数据(例如均值、方差和相关性)仅在 TS 平稳时才可靠,否则无效。
“例如,如果序列随着时间的推移不断增加,样本均值和方差会随着样本规模的增加而增长,并且他们总是会低估未来时期的均值和方差。如果一个序列的均值和方差是没有明确定义,那么它与其他变量的相关性也不是。”

话虽如此,我们在金融中遇到的大多数 TS 都不是平稳的。因此,TSA 的很大一部分涉及识别我们想要预测的序列是否是平稳的,如果不是,我们必须找到方法将其转换为平稳的。(稍后会详细介绍)


自相关


本质上,当我们对时间序列建模时,我们将序列分解为三个部分:趋势、季节性/周期性和随机。随机分量称为残差或误差。它只是我们的预测值和观察值之间的差异。序列相关是指我们的 TS 模型的残差(误差)彼此相关。


为什么我们关心序列相关性?


我们关心序列相关性,因为它对我们模型预测的有效性至关重要,并且与平稳性有着内在的联系。回想一下,根据定义,_平稳_TS的残差(误差)是连续_不相关_的!如果我们在我们的模型中没有考虑到这一点,我们系数的标准误差就会被低估,从而夸大了我们的 T 统计量。结果是太多的 1 类错误,即使原假设为真,我们也会拒绝原假设!通俗地说,忽略自相关意味着我们的模型预测将是胡说八道,我们可能会得出关于模型中自变量影响的错误结论。


白噪声和随机游走


白噪声是我们需要了解的第一个时间序列模型(TSM)。根据定义,作为白噪声过程的时间序列具有连续不相关的误差,这些误差的预期平均值等于零。对连续不相关的误差的另一种描述是,独立和相同分布(i.i.d.)。这一点很重要,因为如果我们的TSM是合适的,并且成功地捕捉了基本过程,我们模型的残差将是i.i.d.,类似于白噪声过程。因此,TSA的一部分实际上是试图将一个模型适合于时间序列,从而使残差序列与白噪声无法区分。

让我们模拟一个白噪声过程并查看它。下面我介绍一个方便的函数,用于绘制时间序列和直观地分析序列相关性。

我们可以轻松地对白噪声过程进行建模并输出 TS 图检查。

np.random.seed(1)
# 绘制离散白噪声的曲线
ads = radooral(size=1000)
plot(ads, lags=30)


高斯白噪声


我们可以看到该过程似乎是随机的并且以零为中心。自相关 (ACF) 和偏自相关 (PACF) 图也表明没有显着的序列相关。请记住,我们应该在自相关图中看到大约 5% 的显着性,这是由于从正态分布采样的纯偶然性。下面我们可以看到 QQ 和概率图,它们将我们的数据分布与另一个理论分布进行了比较。在这种情况下,该理论分布是标准正态分布。显然,我们的数据是随机分布的,并且应该遵循高斯(正常)白噪声。

p("nmean: {:.3f}\\{:.3f}\\stde: {:.3f}"
.format(ademean(), nerva(), der.td()))

随机游走的意义在于它是非平稳的,因为观测值之间的协方差是时间相关的。如果我们建模的 TS 是随机游走,则它是不可预测的。

让我们使用“random”函数从标准正态分布中采样来模拟随机游走。

# 没有漂移的随机行走
np.rao.sed(1)
n = 1000
x = w = np.aonral(size=n)
for t in rnge(_sples):
    x\[t\] = x\[t-1\] + w\[t\]
splt(x, las=30)


无漂移的随机行走


显然,我们的 TS 不是平稳的。让我们看看随机游走模型是否适合我们的模拟数据。回想一下随机游走是xt = xt-1 + wt。使用代数我们可以说xt - xt-1 = wt。因此,我们随机游走系列的第一个差异应该等于白噪声过程,我们可以在我们的 TS 上使用“ np.diff()” 函数,看看这是否成立。

# 模拟的随机游走的第一个差值
plt(p.dffx), las=30)

随机行走的一阶差分


我们的定义成立,因为这看起来与白噪声过程完全一样。如果我们对 SPY 价格的一阶差分进行随机游走会怎么样?


点击标题查阅往期内容


R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列


01

02

03

04




# SPY价格的一阶差分
plt(diff(dt.PY), lag=30)

将随机行走模型拟合到ETF价格


它与白噪声非常相似。但是,请注意 QQ 和概率图的形状。这表明该过程接近正态分布,但具有“重尾”。 ACF 和 PACF 在滞后 1、5?、16?、18 和 21 附近似乎也存在一些显着的序列相关性。这意味着应该有更好的模型来描述实际的价格变化过程。


线性模型


线性模型又称趋势模型,代表了一个可以用直线作图的TS。其基本方程为。

在这个模型中,因变量的值由β系数和一个单一的自变量--时间决定。一个例子是,一家公司的销售额在每个时间段都会增加相同的数量。让我们来看看下面的一个特制的例子。在这个模拟中,我们假设坚定的ABC公司在每个时间段的销售额为-50.00元(β0或截距项)和+25.00元(β1)。

# 模拟线性趋势
# 例子 公司ABC的销售额默认为-50元,在每个时间步长为+25元
w = n.anom.ann(100)
y = nppt_lke(w)
b0 = -50.
b1 = 25.
for t in rge(lnw)):
    y\[t\] = b0 + b1*t + w\[t\]
    
 plt(y, lags=ls)

线性趋势模型模拟


在这里我们可以看到模型的残差是相关的,并且作为滞后的函数线性减少。分布近似正态。在使用此模型进行预测之前,我们必须考虑并消除序列中存在的明显自相关。PACF 在滞后 1 处的显着性表明_自回归_ 模型可能是合适的。


对数线性模型


这些模型与线性模型类似,只是数据点形成了一个指数函数,代表了相对于每个时间步的恒定变化率。例如,ABC公司的销售额在每个时间步长增加X%。当绘制模拟的销售数据时,你会得到一条看起来像这样的曲线。

# 模拟ABC的指数式增长
# 日期
pdat_rge('2007-01-01', '2012-01-01', freq='M')
# 假设销售额以指数速度增长
ale = \[exp( x/12 ) for x inage1, len(id)+1)\]
# 创建数据框架并绘图
df = d.ataame(sals, ix=x)
plt()

模拟指数函数


然后我们可以通过采用销售额的自然对数来转换数据。现在线性回归拟合数据。

# ABC对数销售 
indexid.plot()

指数函数的自然对数


如前所述,这些模型有一个致命的弱点。它们假设连续不相关的误差,正如我们在线性模型的例子中看到的那样。在现实生活中,TS数据通常会违反我们的平稳假设,这使我们转向自回归模型。


自回归模型 - AR(p)


当因变量针对自身的一个或多个滞后值进行回归时,该模型称为自回归模型。公式如下所示:

AR (P) 模型


当您描述 模型的“阶”时,例如阶“p”的 AR 模型 p 表示模型中使用的滞后变量的数量。例如,AR(2) 模型或_二阶_自回归模型如下所示:

AR (2) 模型


这里,alpha (a) 是系数,omega (w) 是白噪声项。在 AR 模型中,Alpha 不能等于 0。请注意,alpha 设置为 1 的 AR(1) 模型是_随机游走_ ,因此不是平稳的。

AR(1) 模型,ALPHA = 1;随机漫步

让我们模拟一个 alpha 设置为 0.6 的 AR(1) 模型

# 模拟一个α=0.6的AR(1)过程
rndm.sed(1)
n_sams = int(1000)
a = 0.6
x = w = n.amma(siz=_apes)
for t in rane(n_saps):
    x\[t\] = a*x\[t-1\] + w\[t\]
    
plot(x, gs=lgs)


Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列(中):https://developer.aliyun.com/article/1490525?spm=a2c6h.13148508.setting.33.658d4f0eueN6WO

相关文章
|
2天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
106 73
|
5天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
42 21
|
7天前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
42 23
|
8天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
44 19
|
5天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
38 15
|
9天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费趋势分析的深度学习模型
使用Python实现智能食品消费趋势分析的深度学习模型
58 18
|
9天前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现深度学习模型:智能食品消费行为预测
使用Python实现深度学习模型:智能食品消费行为预测
43 8
|
6天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
27 2
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
12天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。