FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

GARCH(1,1)モデルでドル円のボラ予測。

クオンツ達の間では、株価の予測は難しいが株価のボラティリティ(値動きの激しさ)を予測することは比較的簡単だとよく言われている。この記事では実際にRのrugarchパッケージを使って株価のボラティリティ予測を試してみる。( stockedge.jpの技術メモより)

という記事もあるので、レジーム判定にはGARCHモデルを使ってみようと思います。
(記事ではEGARCHでしたが、FXで非対称はどうかと思うのでGARCHを採用。)

GARCH モデルとは「ボラティリティの不均一性を仮定しつつ、価格の変化率とその分散(変動性)を同時に推定するモデル」だそうです。 

まずはGARCHモデルによるボラティリティの予測を行ってみました。

f:id:fxborg:20160813014657p:plain

上段・・・USDJPY 日足 
下段・・・ボラティリティの予測値(年率に換算)

Rのrugarchを使用したボラティリティ予測

まずはDUKASCOPYから日足データをダウンロードして、「USDJPY.csv」というファイル名でRの作業ディレクトリに保存します。これをRに読み込むにはこのようにします。

library(xts)

data <- read.csv("USDJPY.csv", sep = ",")
data$Gmt.time <- as.POSIXct(strptime(data$Gmt.time, format="%d.%m.%Y %H:%M:%OS"))
data <- as.xts(data[,2:6], order.by=data$Gmt.time)
data <- data[data$Volume != 0,]

f:id:fxborg:20160813022622p:plain

次に日次リターンを計算します。

USDJPY=data$Close
USDJPYret=diff(log(USDJPY))
USDJPYret["2001-08-01"]=0
plot(USDJPYret)

f:id:fxborg:20160813024028p:plain

今度はGARCHモデルのパラメータをセットします。こちらのサイトの設定を参考にしました。

Shishir Shakya's Blog: GARCH model estimation, Backtesting the risk model and Forecasting

library(rugarch)
spec <- ugarchspec(variance.model = list(garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1)))
ctrl = list(tol = 1e-7, delta = 1e-9)

f:id:fxborg:20160813023054p:plain

いよいよGARCHモデルでのボラティリティ予測です。ugarchroll を使うと指定した期間の日々の予測値を記録してくれます。

library(parallel)
cl <- makePSOCKcluster(4)

roll <- ugarchroll(spec, USDJPYret, n.start = 500,
          refit.every = 1, refit.window = "moving",
          solver = "hybrid", calculate.VaR = T,
          VaR.alpha =c(0.01, 0.05),cluster=cl,
          keep.coef = T,solver.control = ctrl,
          fit.control = list(scale = 1))

stopCluster(cl)

 roll オブジェクトに結果が記録されます。

print(roll)

 f:id:fxborg:20160813033905p:plain

 リターンの絶対値とGarchモデルの推定値を比較してみましょう。

out<- as.xts(as.data.frame(roll))
plot.new()
layout(1:2)

plot(abs(tail(USDJPYret,n=1000)))
plot(tail(out$Sigma,n=1000))

f:id:fxborg:20160813013731p:plain

 最後にシステムで扱いやすいように年率に変換します。こちらの記事を参考にしました。
Trading using Garch Volatility Forecast | Systematic Investor

library(quantmod)

percent.rank <- function
(
    data, # data
    n=252 # window length
)
{
    pctRank <- function(x,i) sum(x[i,1] >= x[(i- (n-1) ):i,])
    out = data
    data = coredata(data)
    if( is.null(dim(data)) ) dim(data) = c(length(data),1)
    rng = n:length(data)
    out[] = c( rep(NA,(n-1)), sapply(rng, function(i) pctRank(data, i) / n) )
    return(out)
}

rank = percent.rank(SMA(percent.rank(out$Sigma, 252),5), 250)
plot.new()
layout(1:2)
plot(tail(USDJPY,n=1000))
plot(tail(rank,n=1000))
abline(h = 0.5,col="red")

f:id:fxborg:20160813014621p:plain

0.5の水準に赤いラインを表示しています。これを基準にレジームを判定する予定。
この結果をファイルに出力するにはこうします。

 write.zoo(na.omit(rank),"rank.csv",sep=",")

f:id:fxborg:20160813035347p:plain

 最後に

GARCHモデルによるボラティリティ予測を行いました。今後はこの結果を利用してレジーム・スイッチを実装したいと思います。そろそろEA作りに復帰したいと思います。