zoukankan      html  css  js  c++  java
  • 使用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系列模型的讨论,我想通过考虑长存储过程,状态空间模型和协整时间序列来继续进行时间序列分析讨论。

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

     

     

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

     
  • 相关阅读:
    HDU
    HDU-1166 敌兵布阵 (基础线段树)
    Matrices with XOR property (暴力)
    CF-825E Minimal Labels (反向拓扑)
    CodeForces-1144E Median String (模拟)
    操作文件和目录
    文件读写
    装饰器
    数据结构和算法
    Scrapy shell调试返回403错误
  • 原文地址:https://www.cnblogs.com/tecdat/p/11587113.html
Copyright © 2011-2022 走看看