拓端tecdat|R語言時間序列:ARIMA / GARCH模型的交易策略在外匯市場預測應用


原文鏈接:http://tecdat.cn/?p=17622

 

 

最近,我們繼續對時間序列建模進行探索,研究時間序列模型的自回歸和條件異方差族。我們想了解自回歸移動平均值(ARIMA)和廣義自回歸條件異方差(GARCH)模型。它們在量化金融文獻中經常被引用。

接下來是我對這些模型的理解,基於擬合模型的預測的一般擬合程序和簡單交易策略的摘要。

 

這些時間序列分析模型是什么?

 

擬合ARIMA和GARCH模型是一種發現時間序列中的觀測值,噪聲和方差影響時間序列的方式。適當地擬合的這種模型將具有一定的預測效用,當然前提是該模型在將來的一段時間內仍非常適合基礎過程。

ARMA

ARMA模型是自回歸(AR)模型和移動平均(MA)模型的線性組合。AR模型其預測變量是該序列的先前值。MA模型在結構上類似於AR模型,除了預測變量是噪聲項。p,q階的自回歸移動平均模型– ARMA(p,q)–是兩者的線性組合,可以定義為:

其中 w是白噪聲,而a和 b是模型的系數。

ARIMA(p,d,q)模型是ARMA(p,q)模型,它們的差值是d倍-或積分(I)-以產生平穩序列。

GARCH

最后,GARCH模型還試圖說明時間序列的異方差行為(即,波動性聚類的特征)以及該序列先前值的序列影響(由AR解釋)和噪聲項(由MA解釋)。GARCH模型使用方差本身的自回歸過程,也就是說,它使用方差的歷史值來說明方差隨時間的變化。

那么我們如何應用這些模型?

有了這種背景,我接下來將ARIMA / GARCH模型擬合到EUR / USD匯率,並將其用作交易系統的基礎。使用擬合程序估算每天的模型參數,然后使用該模型預測第二天的收益,並相應保持一個交易日。

在每個交易日結束時,會使用滾動返回窗口來擬合最佳ARIMA / GARCH模型。擬合過程基於對參數的搜索,以最小化Aikake信息准則,但是也可以使用其他方法。例如,我們可以選擇最小化貝葉斯信息准則的參數,這可以通過懲罰復雜模型(即具有大量參數的模型)來減少過度擬合。

我選擇使用1000天的滾動窗口來擬合模型,但這是優化的參數。有一種情況是在滾動窗口中使用盡可能多的數據,但這可能無法足夠快地捕獲不斷變化的模型參數以適應不斷變化的市場。

這是代碼:

  1.  
    ### ARIMA / GARCH交易模型
  2.  
     
  3.  
    #獲取數據並初始化對象以保存預測
  4.  
    EURUSD <- read.csv('EURUSD.csv', header = T)
  5.  
     
  6.  
    returns <- diff(log(EURUSD$C)) ## ROC也可以使用:默認情況下計算對數
  7.  
     
  8.  
     
  9.  
    #遍歷每個交易日,從滾動窗口中估計最佳模型參數
  10.  
    #並預測第二天的收益
  11.  
    for (i in 0:forecasts.length) {
  12.  
      roll.returns <- returns[(1+i):(window.length + i)] #創建滾動窗口
  13.  
     
  14.  
     
  15.  
      # 估計最佳ARIMA模型
  16.  
      for (p in 0:5) for (q in 0:5) { #將可能的階限制為p,q <= 5
  17.  
        if (p == 0 && q == 0) next #將可能的階限制為p,q <= 5
  18.  
     
  19.  
     
  20.  
          current.aic <- AIC(arimaFit)
  21.  
          if (current.aic < final.aic) { #如果AIC降低則保留階數
  22.  
            final.aic <- current.aic
  23.  
            final.order <- c(p,0,q)
  24.  
            final.arima <- arima(roll.returns, order = final.order)
  25.  
          }
  26.  
        }
  27.  
        else next
  28.  
      }
  29.  
      # 指定並擬合GARCH模型
  30.  
      spec = ugarchspec(
  31.  
     
  32.  
      # 指定並擬合GARCH模型
  33.  
      # 模型並不總是收斂-在這種情況下,將0值分配給預測值和p.val
  34.  
      if (is(fit, "warning")) {
  35.  
        forecasts[i+1] <- 0
  36.  
     
  37.  
     
  38.  
        directions[i+1] <- ifelse(x[1] > 0, 1, -1) #僅定向預測
  39.  
        forecasts[i+1] <- x[1] # 預測的實際值
  40.  
        print(forecasts[i])
  41.  
        # 殘差分析
  42.  
        resid <- as.numeric(residuals(fit, standardize = TRUE))
  43.  
     
  44.  
     
  45.  
    }
  46.  
     
  47.  
     
  48.  
    forecasts.ts <- xts(forecasts, dates[(window.length):length(returns)])
  49.  
    # 創建滯后的序列預測
  50.  
     
  51.  
     
  52.  
    ag.direction <- ifelse(ag.forecasts > 0, 1, ifelse(ag.forecasts < 0, -1, 0))
  53.  
    # 創建滯后的序列預測
  54.  
    ag.direction.returns <- ag.direction * returns[(window.length):length(returns)]
  55.  
    ag.direction.returns[1] <- 0 # remove NA
  56.  
    # 創建ARIMA / GARCH買入持有的回測
  57.  
    ag.curve <- cumsum( ag.direction.returns)
  58.  
     
  59.  
     
  60.  
     
  61.  
     
  62.  
    # 繪制兩條曲線:策略收益和累積收益
  63.  
     
  64.  
     
  65.  
    plot(x = both.curves[,"Strategy returns"], xl

首先,僅是方向性預測:在預測正收益時購買,在預測負收益時出售。這種方法的結果如下所示(不包含交易費用): 在上面的模型擬合過程中,我保留了實際的預測收益值以及預測收益的方向。我想研究預測返回值的大小的預測能力。具體來說,當預測回報的幅度低於某個閾值時進行過濾交易會改善策略的性能嗎?下面的代碼以較小的返回閾值執行此分析。為簡單起見,我將預測對數收益率轉換為簡單收益率,以便能夠控制預測的信號並易於實現。

  1.  
    # 僅在預測超過閾值幅度時測試進入交易
  2.  
    simp.forecasts <- exp(ag.forecasts) - 1
  3.  
     
  4.  
     
  5.  
    ag.threshold.returns[1] <- 0 # 刪除缺失
  6.  
    ag.threshold.curve <- cumsum(ag.threshold.returns))
  7.  
     
  8.  
     
  9.  
    # 繪制兩條曲線:策略收益和累積收益
  10.  
    plot(x = both.curves[,"Strategy returns"], xlab = "Time", y

 結果覆蓋了原始策略: 在我看來,我們擬合某段時間的ARIMA / GARCH模型可能比其他時間更好或更糟地表示了基礎過程。當我們對模型缺乏信心時,過濾交易可能會改善性能。這種方法要求評估每天模型擬合的統計顯着性,並且僅在顯着性超過特定閾值時才輸入交易。有許多方法可以實現這一點。首先,我們可以檢查模型殘差的相關圖,並在此基礎上判斷擬合優度。理想情況下,殘差的相關圖類似於白噪聲過程,沒有序列相關性。殘差的相關圖可以在R中構造如下:


 

  1.  
    acf(fit@fit$residuals, main = 'ACF of Model Residuals')
  2.  
     

 



盡管此相關圖表明模型擬合良好,但顯然它不是一種很好的方法,因為它依賴於主觀判斷,更不用說人類有能力審查每天的模型。更好的方法是檢查Ljung-Box統計量是否適合模型擬合。Ljung-Box是用於評估擬合模型殘差的自相關是否與零顯着不同的假設檢驗。在該檢驗中,零假設是殘差的自相關為零;另一種是我們的時間序列分析具有序列相關性。否定空值並確認替代值將意味着該模型不是很好的擬合,因為殘差中存在無法解釋的結構。Ljung-Box統計量在R中的計算方式如下:

  1.  
     
  2.  
     
  3.  
    Box-Ljung test
  4.  
    data: resid
  5.  
    X-squared = 23.099, df = 20, p-value = 0.284

在這種情況下,p值可以證明殘差是獨立的,並且該特定模型非常合適。作為解釋,為了增加殘差的自相關,Ljung-Box測試統計量(在上面的代碼輸出中為X平方)變得更大。p值是在原假設下獲得大於或大於檢驗統計量的值的概率。因此,在這種情況下,高p值是殘差獨立性的證據。

將Ljung-Box檢驗應用於每天的模型擬合可發現很少幾天獨立殘差的零假設被拒絕,因此將策略擴展為過濾模型擬合不太可能增加太多價值:

時間序列分析結論和未來工作

在回溯測試期間,ARIMA / GARCH策略的表現優於歐元/美元匯率的買入和持有策略,但是,該表現並不出色。似乎可以通過過濾諸如預測幅度和模型擬合優度之類的特征來提高策略的性能,盡管后者在此特定示例中並沒有增加太多價值。另一個過濾選項是為每天的預測計算95%的置信區間,並且僅在每個信號相同時才輸入交易,盡管這會大大減少實際進行的交易數量。

GARCH模型還有許多其他種類,例如指數,積分,二次,閾值和轉換等。與本示例中使用的簡單GARCH(1,1)模型相比,這些方法可能會或可能不會更好地表示基礎過程。

我最近發現非常有趣的一個研究領域是通過不同模型的智能組合對時間序列進行預測。例如,通過取幾個模型的單個預測的平均值,或對預測的信號進行多數表決。要借用一些機器學習的術語,這種“集合”模型通常會比任何組合模型產生更准確的預測。也許有用的方法是使用經過適當訓練的人工神經網絡或其他統計學習方法來對此處提出的ARIMA / GARCH模型進行預測。也許我們可以期望ARIMA / GARCH模型能夠捕獲時間序列的任何線性特征,而神經網絡可能非常適合非線性特征。

如果您有任何想法可以改善時間序列分析模型的預測准確性,歡迎在下方評論或聯系我們。
 

 


最受歡迎的見解

1.HAR-RV-J與遞歸神經網絡(RNN)混合模型預測和交易大型股票指數的高頻波動率

2.R語言中基於混合數據抽樣(MIDAS)回歸的HAR-RV模型預測GDP增長

3.波動率的實現:ARCH模型與HAR-RV模型

4.R語言ARMA-EGARCH模型、集成預測算法對SPX實際波動率進行預測

5.GARCH(1,1),MA以及歷史模擬法的VaR比較

6.R語言多元COPULA GARCH 模型時間序列預測

7.R語言基於ARMA-GARCH過程的VAR擬合和預測

8.matlab預測ARMA-GARCH 條件均值和方差模型

9.R語言對S&P500股票指數進行ARIMA + GARCH交易策略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM