先行指標を使った戦略①
相関係数のみ
通貨ペア:EURUSD
先行指標:GSPC
期間:1999年1月1日~2013年11月22日
ルール①:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が正相関の場合、前日のGSPCの終値変化率がプラスならEURUSDを買い、前日のGSPCの終値変化率がマイナスならEURUSDを売り。
ルール②:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が逆相関の場合、前日のGSPCの終値変化率がマイナスならEURUSDを買い、前日のGSPCの終値変化率がプラスならEURUSDを売り。
ルール③:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:1ユニット当たりの損益はリターン((当日終値-前日終値)/前日終値)*100)で計算。
備考③:コストは考慮していない。
備考④:パラメータとして相関係数の計算期間は5~250まで5刻みとし、計50回のバックテストを行う。

通貨ペア:EURUSD
先行指標:GSPC
期間:1999年1月1日~2013年11月22日
ルール①:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が正相関の場合、前日のGSPCの終値変化率がプラスならEURUSDを買い、前日のGSPCの終値変化率がマイナスならEURUSDを売り。
ルール②:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が逆相関の場合、前日のGSPCの終値変化率がマイナスならEURUSDを買い、前日のGSPCの終値変化率がプラスならEURUSDを売り。
ルール③:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:1ユニット当たりの損益はリターン((当日終値-前日終値)/前日終値)*100)で計算。
備考③:コストは考慮していない。
備考④:パラメータとして相関係数の計算期間は5~250まで5刻みとし、計50回のバックテストを行う。
# パッケージの呼び出し
library(quantmod)
# 開始日
s_date = as.Date("1999-01-01")
# 終了日
e_date = as.Date("2013-11-22")
# 銘柄の終値
y <- data$EURUSD.Close
# 銘柄の変化率
deltay <- diff(y,lag=1)/lag(y,k=1)*100
# 指標の終値
x <- data$GSPC.Close
# 指標の変化率
deltax <- diff(x,lag=1)/lag(x,k=1)*100
# 銘柄の変化率と1期前の指標の変化率の統合
yx <- merge(deltay,lag(deltax,k=1))
# 結果を記録する行列を作成
result <- matrix(0,nrow=50,ncol=3)
colnames(result) <- c("lookback","cumret","r2")
# バックテスト
for(i in 1:50) {
lookback <- 5*i
yx.cor <- rollapply(yx,lookback,cor,by.column=FALSE)[,2]
long <- yx.cor*deltax>=0
short <- yx.cor*deltax<0
pos <- long-short
ret <- deltay*lag(pos,k=1)
cumret <- cumsum(window(ret,start=s_date,end=e_date))
r2 <- cor(cumret,1:length(cumret))^2
result[i,1] <- lookback
result[i,2] <- last(cumret)
result[i,3] <- r2
}
# 結果の表示
result
lookback cumret r2
[1,] 5 102.26583 0.9543638
[2,] 10 56.66689 0.8594362
[3,] 15 153.84356 0.9530231
[4,] 20 170.77157 0.9646406
[5,] 25 188.04444 0.9802724
[6,] 30 229.51811 0.9877318
[7,] 35 201.72340 0.9761316
[8,] 40 227.69505 0.9797506
[9,] 45 215.64618 0.9741290
[10,] 50 245.33964 0.9787332
[11,] 55 209.48703 0.9442870
[12,] 60 235.35560 0.9575665
[13,] 65 251.54023 0.9707910
[14,] 70 245.38312 0.9740653
[15,] 75 260.97697 0.9794737
[16,] 80 266.28017 0.9884018
[17,] 85 252.47117 0.9822238
[18,] 90 247.91770 0.9775954
[19,] 95 238.49841 0.9761090
[20,] 100 218.95745 0.9593411
[21,] 105 213.70442 0.9591754
[22,] 110 231.44258 0.9690586
[23,] 115 220.29887 0.9501729
[24,] 120 203.09061 0.9398425
[25,] 125 215.38670 0.9560136
[26,] 130 197.45493 0.9358449
[27,] 135 200.17642 0.9452673
[28,] 140 166.13433 0.8956786
[29,] 145 165.39502 0.8637919
[30,] 150 167.54260 0.8794509
[31,] 155 182.67092 0.8900225
[32,] 160 191.05868 0.9177265
[33,] 165 199.22017 0.9341073
[34,] 170 190.55615 0.9232082
[35,] 175 171.90100 0.8809596
[36,] 180 166.59974 0.8698248
[37,] 185 179.68429 0.9101206
[38,] 190 172.19707 0.8913092
[39,] 195 177.56958 0.9182795
[40,] 200 172.42983 0.9115372
[41,] 205 170.67052 0.9253979
[42,] 210 176.42335 0.9310441
[43,] 215 173.23045 0.9270383
[44,] 220 166.15326 0.9136593
[45,] 225 165.16879 0.9154017
[46,] 230 164.86025 0.9209879
[47,] 235 180.86837 0.9215068
[48,] 240 172.00485 0.9274462
[49,] 245 175.70532 0.9258659
[50,] 250 173.45954 0.9271483
# グラフの作成
lookback <- 80
yx.cor <- rollapply(yx,lookback,cor,by.column=FALSE)[,2]
long <- yx.cor*deltax>=0
short <- yx.cor*deltax<0
pos <- long-short
ret <- deltay*lag(pos,k=1)
cumret <- cumsum(window(ret,start=s_date,end=e_date))
matplot(cumret,type="l")