スプレッドの構築

スプレッドを計算する関数。

> 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)
+ }

UFJのデータとTOPIXのデータを使用する。

> 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) #繋げたデータのグラフ