スプレッドの構築
スプレッドを計算する関数。
> calculate_spread<-function(x, y, beta){
+ return (y - beta*x)
+ }
βとレベルを計算する関数。
> calculate_beta_and_level<-function(x, y, start_date, end_date){ + require(xts) + time_range<-paste(start_date, "::", end_date, sep="") + x<-x[time_range] + y<-y[time_range] + dx<-diff(x[time_range]) + dy<-diff(y[time_range]) + r<-prcomp(~dx+dy) + beta<-r$rotation[2,1]/r$rotation[1,1] + spread<-calculate_spread(x, y, beta) + names(spread)<-"spread" + level<-mean(spread, na.rm=TRUE) + outL<-list() + outL$spread<-spread + outL$beta<-beta + outL$level<-level + return(outL) + } >
売買シグナル生成関数。
> calculate_buy_sell_signals<-function(spread, beta, level, lower_threshold, upper_threshold){ + buy_signals<-ifelse(spread<=level-lower_threshold, 1, 0) + sell_signals<-ifelse(spread>=level+upper_threshold, 1, 0) + output<-cbind(spread, buy_signals, sell_signals) + colnames(output)<-c("spread", "buy_signals", "sell_signals") + return(output) + }
> x<-YJ998405_20130101_20140101[,4] > y<-YJ8306_20130101_20140101[,6] > head(x) YJ998405.Close 2013-01-04 888.51 2013-01-07 881.06 2013-01-08 871.88 2013-01-09 879.05 2013-01-10 889.02 2013-01-11 898.69 > head(y) YJ8306.Adjusted 2013-01-04 484 2013-01-07 476 2013-01-08 462 2013-01-09 469 2013-01-10 474 2013-01-11 479
βとレベルを計算。
> results<-calculate_beta_and_level(x, y, start_date, end_date) > results$beta [1] 0.6029875 > results$level [1] -89.43862
可視化。
> plot(results$spread, ylab = "Spread", main="UFJ - beta*TOPIX", cex.main=0.8, cex.lab=0.8, cex.axis=0.8)
同様のことを、ここで使用した期間の次の期間のデータを使用して行う。
> start_date [1] "2013-08-01" > end_date [1] "2013-11-30" > start_date_outOfsample<-"2013-12-01" > end_date_outOfsample<-"2014-07-31" > range<-paste(start_date_outOfsample, "::", end_date_outOfsample, sep="") > spread_outOfsample<-calculate_spread(x[range], y[range], results$beta) > plot(spread_outOfsample, main="UFJ - beta * TOPIX", cex.main=0.8,cex.lab=0.8, cex.axis=0.8) > abline(h=results$level, lwd=2)
インサンプルの結果とアウトオブサンプルの結果を繋げてグラフを描く。
> spread1<-rbind(results$spread, spread_outOfsample) #データをつなげる > par(mfrow=c(3,1)) > plot(results$spread, ylab = "Spread", main="UFJ - beta*TOPIX", cex.main=0.8, cex.lab=0.8, cex.axis=0.8) #インサンプルデータのグラフ > plot(spread_outOfsample, main="UFJ - beta * TOPIX", cex.main=0.8,cex.lab=0.8, cex.axis=0.8) #アウトオブサンプルデータのグラフ > plot(spread1, ylab = "Spread", main="UFJ - beta*TOPIX", cex.main=0.8, cex.lab=0.8, cex.axis=0.8) #繋げたデータのグラフ