使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略

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

 

在本文中,我想向您展示如何应用S&P500美国股票市场指数的交易策略。

 通过组合ARIMAGARCH模型,从长期来看,我们可以大大胜过“买入并持有”方法。

策略概述

 该策略在“滚动”的基础上执行:

  1. 对于每一天,股票指数的对数收益的前k天的前k天被用作拟合最佳ARIMA和GARCH模型的窗口。 
  2. 组合模型用于对第二天的收益进行预测。
  3. 如果预测为负,则在上一个收盘时做空股票,而如果预测为正,则做多。
  4. 如果预测与前一天的方向相同,则什么都不会改变。

 

战略实施

 

 

 第一个任务是在R中安装和导入必要的库:

如果已经安装了库,则可以简单地导入它们:

> library(quantmod)
> library(lattice)
> library(timeSeries)
> library(rugarch)

完成后,将把该策略应用于S&P500。 

然后,我们可以创建标准普尔500的“收盘价”的对数收益率差异,并去除初始NA值:

 

根据Akaike信息准则,循环过程将为我们提供“最佳”拟合ARMA模型,然后我们可以将其用于输入GARCH模型:

>     final.aic <- Inf
>     final.order <- c(0,0,0)
>     for (p in 0:5) for (q in 0:5) {
>         if ( p == 0 && q == 0) {
>             next
>         }
> 
>         arimaFit = tryCatch( arima(spReturnsOffset, order=c(p, 0, q)),
>                              error=function( err ) FALSE,
>                              warning=function( err ) FALSE )
> 
>         if( !is.logical( arimaFit ) ) {
>             current.aic <- AIC(arimaFit)
>             if (current.aic < final.aic) {
>                 final.aic <- current.aic
>                 final.order <- c(p, 0, q)
>                 final.arima <- arima(spReturnsOffset, order=final.order)
>             }
>         } else {
>             next
>         }
>     }

 

如果GARCH模型无法收敛,那么我们只需将日期设置为产生“长期”预测 。 

为了准备CSV文件的输出,我创建了一个字符串,其中包含用逗号分隔的数据,并带有第二天的预测方向:

>     if(is(fit, "warning")) {
>       forecasts[d+1] = paste(index(spReturnsOffset[windowLength]), 1, sep=",")
>       print(paste(index(spReturnsOffset[windowLength]), 1, sep=","))
>     } else {
>       fore = ugarchforecast(fit, n.ahead=1)
>       ind = fore@forecast$seriesFor
>       forecasts[d+1] = paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=",")
>       print(paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=",")) 
>     }
> }

倒数第二步是将CSV文件输出 。 

 确保在与forecasts.csv文件相同的目录中运行它:

forecasts = open("forecasts.csv", "r").readlines()

至此,我们已将更正的指标文件存储在中forecasts_new.csv。 

策略结果

现在,我们已经生成了指标CSV文件,我们需要将其效果与“买入并持有”进行比较。

我们首先从CSV文件中读取指标并将其存储为spArimaGarch

然后,我们将ARIMA + GARCH预测的日期与S&P500的原始收益集相交。 

一旦获得ARIMA + GARCH策略的收益,就可以为ARIMA + GARCH模型和“买入并持有”创建资产曲线。最后,我们将它们合并为一个数据结构:

> spArimaGarchCurve = log( cumprod( 1 + spArimaGarchReturns ) )
> spBuyHoldCurve = log( cumprod( 1 + spIntersect[,2] ) )
> spCombinedCurve = merge( spArimaGarchCurve, spBuyHoldCurve, all=F )

最后,我们可以使用以下xyplot命令在同一图上绘制两条权益曲线:

> xyplot( 
>   spCombinedCurve,
>   superpose=T,
>   col=c("darkred", "darkblue"),
>   lwd=2,
>   key=list( 
>     text=list(
>       c("ARIMA+GARCH", "Buy & Hold")
>     ),
>     lines=list(
>       lwd=2, col=c("darkred", "darkblue")
>     )
>   )
> )

截至2015年10月6日的资产曲线如下:


 ARIMA + GARCH策略的股票曲线与S&P500的“买入并持有”

如您所见,在65年的时间里,ARIMA + GARCH策略的表现明显优于“买入并持有”。但是,您还可以看到,大部分收益发生在1970年至1980年之间。 

  因此,在将此类模型发明之前将其应用于历史系列真的合适吗?另一种选择是开始将模型应用于最新数据。实际上,我们可以考虑一下从2005年1月1日至今的最近十年的表现:


从2005年至今,ARIMA + GARCH策略与S&P500的“买入并持有”股票曲线

 

现在,我们已经完成了ARIMA和GARCH系列模型的讨论,我想通过考虑长存储过程,状态空间模型和协整时间序列来继续进行时间序列分析讨论。

时间序列的这些后续领域将向我们介绍一些模型,这些模型可以改善我们的预测,使其超出我在此处提出的预测,这将大大提高我们的交易获利能力和/或降低风险。

 

 如果您有任何疑问,请在下面发表评论。 

 

 

  

大数据部落 -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和统计分析咨询服务

统计分析和数据挖掘咨询服务:y0.cn/teradat(咨询服务请联系官网客服

点击这里给我发消息QQ:3025393450

 

​QQ交流群:186388004 

【服务场景】  

科研项目; 公司项目外包;线上线下一对一培训;数据爬虫采集;学术研究;报告撰写;市场调查。

【大数据部落】提供定制化的一站式数据挖掘和统计分析咨询

欢迎选修我们的R语言数据分析挖掘必知必会课程!

 

 

转载于:https://www.cnblogs.com/tecdat/p/11587113.html

variance.model = list(model = "sGARCH", garchOrder = c(1, 1),submodel = NULL, external.regressors = NULL, variance.targeting = FALSE) distribution.model = "norm" ugarchfit(spec, datax, out.sample = 0, solver = "solnp", solver.control = list(),fit.control = list(stationarity = 1, fixed.se = 0, scale = 0)) myspec=ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1), submodel = NULL, external.regressors = NULL, variance.targeting = FALSE), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE, archm = FALSE, archpow = 1, arfima = FALSE, external.regressors = NULL, archex = FALSE), distribution.model = "norm") myfit=ugarchfit(myspec,data=datax,solver="solnp") #rugarch包中模型结果的提取要依靠as.data.frame函数。比如提取模型的拟合值 as.data.frame(myfit,which="fitted") #提取残差序列: as.data.frame(myfit,which=" residuals") #提取方差序列: as.data.frame(myfit,which="sigma") #当然,也可以同时查看所有: as.data.frame(myfit,which=all) #通过plot(myfit)可以对模型结果进行图形诊断: plot(myfit) #如果模型通过检验,可以用ugarchforcast函数对未来进行预测: for<-ugarchforcast(myfit,n.ahead=20) library(zoo) #时间格式预处理 library(xts) #同上 library(timeSeires) #同上 library(urca) #进行单位根检验 library(tseries) #arma模型 library(fUnitRoots) #进行单位根检验 library(FinTS) #调用其中的自回归检验函数 library(fGarch) #GARCH模型 library(nlme) #调用其中的gls函数 library(fArma) #进行拟合和检验
下面是使用Python中的statsmodels库实现ARIMA+GARCH模型的代码示例: ```python import pandas as pd from statsmodels.tsa.arima_model import ARIMA from statsmodels.tsa.arima_model import ARIMAResults from statsmodels.tsa.stattools import acf, pacf from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.tsa.arima_process import ArmaProcess from arch import arch_model import matplotlib.pyplot as plt # 加载时间序列数据 df = pd.read_csv('data.csv', index_col='date', parse_dates=True) # 拆分训练集和测试集 train_data = df[:'2018'] test_data = df['2019':] # ARIMA模型参数选择 # 确定d值 diff = 0 adf_result = adfuller(train_data['value']) while adf_result[1] >= 0.05: diff += 1 adf_result = adfuller(train_data['value'].diff(diff).dropna()) # 确定p和q值 lag_acf = acf(train_data['value'].diff(diff).dropna(), nlags=20, fft=False) lag_pacf = pacf(train_data['value'].diff(diff).dropna(), nlags=20, method='ols') # 绘制ACF和PACF图形 plt.figure() plt.subplot(211) plot_acf(train_data['value'].diff(diff).dropna(), ax=plt.gca(), lags=20) plt.subplot(212) plot_pacf(train_data['value'].diff(diff).dropna(), ax=plt.gca(), lags=20) plt.show() # ARIMA模型训练和预测 model_arima = ARIMA(train_data['value'].diff(diff).dropna(), order=(1, diff, 1)) model_arima_fit = model_arima.fit() print(model_arima_fit.summary()) predict_arima = model_arima_fit.predict(start='2019-01-01', end='2019-12-01', typ='levels') # GARCH模型训练和预测 model_garch = arch_model(train_data['value'], p=1, q=1) model_garch_fit = model_garch.fit() print(model_garch_fit.summary()) predict_garch = model_garch_fit.forecast(start='2019-01-01', horizon=12) # 结合ARIMA和GARCH的预测结果 predict = predict_arima + predict_garch.mean.iloc[-1] test_data['predict'] = predict test_data[['value', 'predict']].plot(figsize=(12, 6)) plt.show() ``` 以上代码首先加载时间序列数据,并将其拆分为训练集和测试集。然后使用ADF检验确定差分阶数,使用ACF和PACF图形确定ARIMA模型的p和q值。接下来训练ARIMA模型,并使用GARCH模型训练波动率。最后,将ARIMA和GARCH模型的预测结果相结合,生成最终的预测结果,并将其与测试集数据一起绘制在图表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值