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

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

Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列(上):https://developer.aliyun.com/article/1490523


AR(1) 模型,ALPHA = 0.6


正如预期的那样,我们模拟的 AR(1) 模型的分布是正常的。滞后值之间存在显着的序列相关性,尤其是在滞后 1 处,如 PACF 图所示。

现在我们可以使用 Python 的 statsmodels 拟合 AR(p) 模型。首先,我们将 AR 模型拟合到我们的模拟数据并收益估计的 alpha 系数。然后我们使用 statsmodels 函数“order()”来查看拟合模型是否会选择正确的滞后。如果 AR 模型是正确的,估计的 alpha 系数将接近我们的真实 alpha 0.6,所选阶数等于 1。

# 拟合AR(p)模型到模拟的AR(1)模型,alpa=0.6
md = AR(x).itm=30, ic='aic', trnd='nc')
%time st_oer = mt.R(x).stor(
    mxag=30, ic='aic', trnd='nc')
tuerer = 1

看起来我们能够恢复模拟数据的基础参数。让我们用 alpha\_1 = 0.666 和 alpha\_2 = -0.333 来模拟 AR(2) 过程。为此,我们使用 statsmodel 的“generate_samples()”函数。该函数允许我们模拟任意阶数的 AR 模型。

# 模拟一个AR(2)过程
n = int(1000)
# Python要求我们指定零滞后值,即为1
# 还要注意,AR模型的字母必须是否定的
# 对于AR(p)模型,我们也将MA的betas设置为0
ar = nr_\[1, -ahas\]
ma = npr_\[1, beas\]
ar2 = smt.arme_pe(ar=ar, ma=a, nsale=n) 
plot(ar2, lags=lags)

AR(2) 模拟 ALPHA\_1 = 0.666 和 ALPHA\_2 = -0.333

让我们看看是否可以恢复正确的参数。

# 拟合AR(p)模型来模拟AR(2)过程
max_lag = 10
est_rer = st.AR(r2)sennc')
tu_rder = 2

让我们看看 AR(p) 模型将如何拟合 MSFT 对数收益。这是收益TS。

MSFT 对数收益时间序列


# 选择MSFT收益的最佳滞后阶数
max_ag = 30
ml = smt.AR(ls.MSFT).fit(mam_lg, c='aic', tnc)
es_rr = tAR(rts.FT).secter(
    maag=malag ic=aic', re=nc')
p('最佳估计滞后阶数 = {}'.format(etoer))

最好的阶数是 23 个滞后或 23 !任何具有这么多参数的模型在实践中都不太可能有用。显然,收益过程背后的复杂性比这个模型所能解释的要复杂得多。


移动平均模型 - MA(q)


MA(q) 模型与 AR(p) 模型非常相似。不同之处在于 MA(q) 模型是过去白噪声误差项的线性组合,而不是像 AR(p) 模型这样的过去观察的线性组合。MA 模型的目的是我们可以通过将模型拟合到误差项来直接观察误差过程中的“冲击”。在 AR(p) 模型中,通过使用 ACF 对过去的一系列观察结果间接观察到这些冲击。MA(q) 模型的公式是:

Omega (w) 是 E(wt) = 0 且方差为 sigma 平方的白噪声。让我们使用 beta=0.6 并指定 AR(p) alpha 等于 0 来模拟这个过程。

# 模拟一个MA(1)过程
n = int(1000)
# 设置AR(p)的alphas等于0
alpas = npray(\[0.\])
beas = np.ra(\[0.6\])
# 添加零滞后
ar = np_\[1, -alph\]
ma = np_\[1, beta\]
a1 = st.m_gerse(ar=ar, ma=a, naple=n) 
plot(ma1, lags=30)

BETA=0.6 的模拟 MA(1) 过程


ACF 函数显示滞后 1 很重要,这表明 MA(1) 模型可能适用于我们的模拟序列。当 ACF 仅在滞后 1 处显示显着性时,我不确定如何解释在滞后 2、3 和 4 处显示显着性的 PACF。我们现在可以尝试将 MA(1) 模型拟合到我们的模拟数据中。我们可以使用 “ARMA()” 函数来指定我们选择的阶数。我们调用它的“fit()” 方法来返回模型输出。

# 将MA(1)模型与我们模拟的时间序列相匹配
# 指定ARMA模型,阶数为(p,q)。
maxlag = 30
st.RMa1, orer=(0,1)).fit
    maag=maxg, ethod='e', tren='nc')

MA(1) 模型概要


该模型能够正确估计滞后系数,因为 0.58 接近我们的真实值 0.6。另请注意,我们的 95% 置信区间确实包含真实值。让我们尝试模拟 MA(3) 过程,然后使用我们的 ARMA 函数将三阶 MA 模型拟合到系列中,看看我们是否可以恢复正确的滞后系数(β)。Beta 1-3 分别等于 0.6、0.4 和 0.2。

# 模拟MA(3)过程,beta为0.6, 0.4, 0.2
n = nt(100)
ar = nr_\[1, -ahas\]
ma = np.r_\[1, betas\]
m3 = genrae_sle(ar=ar, ma=ma, sple=n)
plot(ma3, las=30)

BETAS = [0.6, 0.4, 0.2] 的模拟 MA(3) 过程

# 将MA(3)模型拟合模拟的时间序列
maxlg = 30
ARMA(ma3, order=(0, 3)).fit(
    xla=mx_ag, mehd='le',tred=nc').summary

MA(3) 模型总结


该模型能够有效地估计实际系数。我们的 95% 置信区间还包含 0.6、0.4 和 0.3 的真实参数值。现在让我们尝试将 MA(3) 模型拟合到 SPY 的对数收益。请记住,我们不知道_真正的_参数值。

# 将MA(3)与SPY收益拟合
x_ag = 30
Y = lrsSY
ARMA(Y, ordr=(0, 3)).it(
    mlg=m_lg, thd'le', rndn'.summry())
plot(md.rsd lgs=m_lg)

SPY MA (3) 模型总结


让我们看看模型残差。

不错。一些 ACF 滞后有点问题,尤其是在 5、16 和 18 处。这可能是采样错误,但再加上重尾,我认为这不是预测未来 SPY收益的最佳模型。


自回归移动平均模型 - ARMA(p, q)


ARMA 模型只是 AR(p) 和 MA(q) 模型之间的合并。让我们从量化金融的角度回顾一下这些模型对我们的意义:

  • AR(p) 模型试图捕捉_(解释)_交易市场中经常观察到的动量和均值回归效应。
  • MA(q) 模型试图捕捉_(解释)_在白噪声项中观察到的冲击效应。这些冲击效应可以被认为是影响观察过程的意外事件,例如意外收益、恐怖袭击等。

“对于杂货店中的一组产品,在不同时间推出的有效优惠券活动的数量将构成多重‘冲击’,从而影响相关产品的价格。”

- AM207: Pavlos Protopapas, Harvard University

ARMA 的弱点在于它忽略了在大多数金融时间序列中发现的_波动性聚类_效应。

模型公式为:

ARMA(P, Q) 方程


让我们用给定的参数模拟一个 ARMA(2, 2) 过程,然后拟合一个 ARMA(2, 2) 模型,看看它是否可以正确估计这些参数。设置 alpha 等于 [0.5,-0.25] 和 beta 等于 [0.5,-0.3]。

# 模拟一个ARMA(2, 2)模型,alphas=\[0.5,-0.25\],betas=\[0.5,-0.3\] 
max_lag = 30
n = int(5000) #大量的样本来帮助估算
burn = int(n/10) #拟合前要丢弃的样本数
ar = np.r_\[1, -alphas\]
ma = np.r_\[1, betas\]
aa22 = aample(ar=ar, ma=ma,samle=n)
plt(rm2, lagsxla)
ARMA(arma22, order=(2, 2)).fit(
    maxag=ma_lag, mtd='mle', ted='nc', brnn=brn).summry()

模拟 ARMA(2, 2) 过程


ARMA(2, 2) 模型总结


我们的真实参数包含在 95% 的置信区间内。

接下来我们模拟一个 ARMA(3, 2) 模型。之后,我们循环使用 p、q 的组合,以将 ARMA 模型拟合到我们的模拟序列中。我们根据哪个模型产生最低值来选择最佳组合Akaike Information Criterion (AIC)").

# 模拟一个ARMA(3, 2)模型,alphas=\[0.5,-0.25,0.4\],betas=\[0.5,-0.3\] 。
maxg = 30
n = int(5000)
burn = 2000
alpas = nparay(\[0.5, -0.25, 0.4\])
bets = np.ra(\[0.5, -0.3\])
ar = np.r_\[1, -alas\]
ma = np.r_\[1, betas\]
arma32 = armasamp(ar=ar, ma=ma, nsple=n, rin=burn)
plot(ara32, lgs=mxlg)
# 通过AIC选择最佳阶数 
# 最小的AIC值最优
for i in rn:
    for j in rn:
        try:
            tmpl = ARMA(arma32, orde=(i, j)).fit(meod='mle', tend='nc')
            aic = tp_ml.ac
            if tmpaic < bstaic:
                bst\_ic = mp\_aic
                bestrder = (i, j)
                bes_mdl = tmpdl
        excpt: ctinue

上面恢复了正确的阶数。下面我们看到了在任何模型拟合之前模拟时间序列的输出。

模拟 ARMA(3, 2) 系列,其中 Alpha = [0.5,-0.25,0.4] 和 BETAS = [0.5,-0.3]

ARMA(3, 2) 最佳模型总结


我们看到选择了正确的阶数并且模型正确地估计了我们的参数。但是请注意 MA.L1.y 系数;0.5 的真实值几乎在 95% 的置信区间之外!

下面我们观察模型的残差。显然这是一个白噪声过程,因此最好的模型已经被拟合来_解释_ 数据。

ARMA(3, 2) 最佳模型残差白噪声

接下来,我们将 ARMA 模型拟合到 SPY 收益。下图是模型拟合前的时间序列。

SPY收益率

# 将ARMA模型与SPY收益率拟合
rng = rng(5) # \[0,1,2,3,4,5\]
for i in rng:
    for j in rng:
        try:
            tmp_mdl = ARMA('SPY', oder=(i, j))fit
            tmp\_ic = tp\_dl.aic
            if tp\_ic < bes\_aic:
                bs\_aic = mp\_aic
                es_der = (i j)
                bst\_mdl = t\_mdl
        exet: cntnue


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

相关文章
|
21天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
23天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
1月前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
88 7
|
2月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
83 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
29天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
34 3
|
1月前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
46 2
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
2月前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
61 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2