原文链接:http://tecdat.cn/?p=7207
在本文中,我想向您展示如何应用S&P500美国股票市场指数的交易策略。
通过组合ARIMA和GARCH模型,从长期来看,我们可以大大胜过“买入并持有”方法。
策略概述
该策略在“滚动”的基础上执行:
- 对于每一天,股票指数的对数收益的前_k_天的前_k_天被用作拟合最佳ARIMA和GARCH模型的窗口。
- 组合模型用于对第二天的收益进行预测。
- 如果预测为负,则在上一个收盘时做空股票,而如果预测为正,则做多。
- 如果预测与前一天的方向相同,则什么都不会改变。
战略实施
第一个任务是在R中安装和导入必要的库:
如果已经安装了库,则可以简单地导入它们:
library(quantmod)\n> library(lattice)\n> library(timeSeries)\n> library(rugarch)","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">> library(quantmod) > library(lattice) > library(timeSeries) > library(rugarch)
完成后,将把该策略应用于S&P500。
然后,我们可以创建标准普尔500的“收盘价”的对数收益率差异,并去除初始NA值:
根据Akaike信息准则,循环过程将为我们提供“最佳”拟合ARMA模型,然后我们可以将其用于输入GARCH模型:
final.aic <- Inf\n> final.order <- c(0,0,0)\n> for (p in 0:5) for (q in 0:5) {\n> if ( p == 0 && q == 0) {\n> next\n> }\n> \n> arimaFit = tryCatch( arima(spReturnsOffset, order=c(p, 0, q)),\n> error=function( err ) FALSE,\n> warning=function( err ) FALSE )\n> \n> if( !is.logical( arimaFit ) ) {\n> current.aic <- AIC(arimaFit)\n> if (current.aic < final.aic) {\n> final.aic <- current.aic\n> final.order <- c(p, 0, q)\n> final.arima <- arima(spReturnsOffset, order=final.order)\n> }\n> } else {\n> next\n> }\n> }","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">> 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\")) {\n> forecasts[d+1] = paste(index(spReturnsOffset[windowLength]), 1, sep=\",\")\n> print(paste(index(spReturnsOffset[windowLength]), 1, sep=\",\"))\n> } else {\n> fore = ugarchforecast(fit, n.ahead=1)\n> ind = fore@forecast$seriesFor\n> forecasts[d+1] = paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=\",\")\n> print(paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=\",\")) \n> }\n> }","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">> 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 ) )\n> spBuyHoldCurve = log( cumprod( 1 + spIntersect[,2] ) )\n> spCombinedCurve = merge( spArimaGarchCurve, spBuyHoldCurve, all=F )","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">> spArimaGarchCurve = log( cumprod( 1 + spArimaGarchReturns ) ) > spBuyHoldCurve = log( cumprod( 1 + spIntersect[,2] ) ) > spCombinedCurve = merge( spArimaGarchCurve, spBuyHoldCurve, all=F )
最后,我们可以使用以下xyplot
命令在同一图上绘制两条权益曲线:
xyplot( \n> spCombinedCurve,\n> superpose=T,\n> col=c(\"darkred\", \"darkblue\"),\n> lwd=2,\n> key=list( \n> text=list(\n> c(\"ARIMA+GARCH\", \"Buy & Hold\")\n> ),\n> lines=list(\n> lwd=2, col=c(\"darkred\", \"darkblue\")\n> )\n> )\n> )","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">> 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系列模型的讨论,我想通过考虑长存储过程,状态空间模型和协整时间序列来继续进行时间序列分析讨论。
时间序列的这些后续领域将向我们介绍一些模型,这些模型可以改善我们的预测,使其超出我在此处提出的预测,这将大大提高我们的交易获利能力和/或降低风险。