在本文中,我想向您展現如何應用S&P500股票市場指數的交易策略。算法
經過組合ARIMA和GARCH模型,從長期來看,咱們能夠超過「買入並持有」方法。網絡
該策略在「滾動」預測的基礎上執行:數據結構
第一個任務是在R中安裝和導入必要的庫:spa
若是已經安裝了庫,則能夠簡單地導入它們:code
> library(quantmod) > library(lattice) > library(timeSeries) > library(rugarch)
完成後,將把該策略應用於S&P500。 blog
而後,咱們能夠建立標準普爾500的「收盤價」的對數收益率差分序列,並去除初始NA值:遞歸
根據Akaike信息準則,循環過程將爲咱們提供「最佳」擬合ARMA模型,而後咱們能夠將其用於輸入GARCH模型:rem
> 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文件的輸出,我建立了一個字符串,其中包含用逗號分隔的數據,並帶有次日的預測方向:get
> 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( > 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") > ) > ) > )
資產曲線以下:
ARIMA + GARCH策略的股票曲線與S&P500的「買入並持有」
如您所見,在65年的時間裏,ARIMA + GARCH策略的表現明顯優於「買入並持有」。可是,您還能夠看到,大部分收益發生在1970年至1980年之間。
所以,在將此類模型創建以前將其應用於歷史序列真的合適嗎?另外一種選擇是開始將模型應用於最新數據。實際上,咱們能夠考慮一下從2005年1月1日至今的最近十年的表現:
從2005年至今,ARIMA + GARCH策略與S&P500的「買入並持有」股票曲線
如今,咱們已經完成了ARIMA和GARCH模型的討論,我想經過考慮長狀態空間模型和協整時間序列來繼續進行時間序列分析討論。
時間序列的這些後續領域將向咱們介紹一些模型,這些模型能夠改善咱們的預測,這將大大提升咱們的交易獲利能力和/或下降風險。
參考文獻
1.HAR-RV-J與遞歸神經網絡(RNN)混合模型預測和交易大型股票指數的高頻波動率
2.R語言中基於混合數據抽樣(MIDAS)迴歸的HAR-RV模型預測GDP增加
4.R語言ARMA-EGARCH模型、集成預測算法對SPX實際波動率進行預測