モメンタム戦略①
保有期間1日
通貨ペア:EURUSD
期間:2002年1月1日~2013年12月6日
ルール①:前日終値がlookback+1日前の終値以上なら買い、下なら売り。
ルール②:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。
備考④:モメンタムの計算期間は5~250まで5刻みとし、計50回のバックテストを行う。
通貨ペア:EURUSD
期間:2002年1月1日~2013年12月6日
ルール①:前日終値がlookback+1日前の終値以上なら買い、下なら売り。
ルール②:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。
備考④:モメンタムの計算期間は5~250まで5刻みとし、計50回のバックテストを行う。
# パッケージの呼び出し
library(quantmod)
# 開始日
startDate <- as.Date("2002-01-01")
# 終了日
endDate <- as.Date("2013-12-06")
# 従属変数の終値
y <- data$EURUSD.Close # 日足
#y <- apply.weekly(data$EURUSD.Close, last) # 週足
#y <- apply.monthly(data$EURUSD.Close, last) # 月足
# 独立変数の終値
x <- data$EURUSD.Close # 日足
#x <- apply.weekly(data$EURUSD.Close, last) # 週足
#x <- apply.monthly(data$EURUSD.Close, last) # 月足
# 従属変数の変化率
deltaY <- diff(y) / lag(y) * 100
# 結果を記録するオブジェクト
result <- matrix(0, nrow = 50, ncol = 3)
colnames(result) <- c("lookback", "totalRet", "r2")
# バックテスト
for (i in 1:50) {
# 計算期間
lookback <- 5 * i
# ポジション
long <- x >= lag(x, k = lookback)
short <- x < lag(x, k = lookback)
pos <- long - short # 売買両方
#pos <- long # 買いのみ
#pos <- -short # 売りのみ
# リターン
ret <- deltaY * lag(pos)
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
# R2
r2 <- cor(totalRet, 1:length(totalRet)) ^ 2
# 結果の記録
result[i, 1] <- lookback
result[i, 2] <- last(totalRet)
result[i, 3] <- r2
}
# 結果
result
lookback totalRet r2
[1,] 5 4.716974 0.0067452523
[2,] 10 3.289995 0.0009150425
[3,] 15 10.997531 0.4812767597
[4,] 20 39.944245 0.8347519124
[5,] 25 57.793126 0.9146259816
[6,] 30 34.276948 0.7423916865
[7,] 35 16.405043 0.5087252516
[8,] 40 38.048337 0.7982100674
[9,] 45 24.448956 0.6013293122
[10,] 50 15.805616 0.0224138630
[11,] 55 -7.133393 0.5098428786
[12,] 60 17.416215 0.0001473856
[13,] 65 43.645728 0.7893038314
[14,] 70 47.072934 0.7515765420
[15,] 75 19.398503 0.5056153343
[16,] 80 66.648122 0.8853318560
[17,] 85 61.031026 0.8634146770
[18,] 90 54.751984 0.8130972749
[19,] 95 63.124060 0.8312792066
[20,] 100 70.033626 0.8957348796
[21,] 105 79.168940 0.9333730704
[22,] 110 58.369812 0.8873278151
[23,] 115 46.958147 0.7833375935
[24,] 120 42.045454 0.8064318817
[25,] 125 58.168121 0.9163142636
[26,] 130 57.025730 0.9170848346
[27,] 135 61.922266 0.9284940691
[28,] 140 50.549308 0.8824243635
[29,] 145 33.781193 0.6719102981
[30,] 150 51.123002 0.9099785183
[31,] 155 24.121812 0.5011152743
[32,] 160 16.922450 0.4506017852
[33,] 165 25.238211 0.5001717549
[34,] 170 35.639988 0.8167035467
[35,] 175 16.129963 0.3642284407
[36,] 180 10.053764 0.1107147088
[37,] 185 -6.296932 0.0803239384
[38,] 190 7.756712 0.0019815194
[39,] 195 21.700695 0.0546092716
[40,] 200 10.043077 0.0017186719
[41,] 205 19.339877 0.0199105325
[42,] 210 22.835223 0.2639356694
[43,] 215 43.344836 0.5663401529
[44,] 220 28.937222 0.0774341573
[45,] 225 48.893074 0.5012357832
[46,] 230 39.414163 0.2386394717
[47,] 235 23.475063 0.0021703333
[48,] 240 23.597394 0.0056438342
[49,] 245 15.562637 0.0027935973
[50,] 250 -9.616933 0.3796735669
# グラフ
lookback <- 105
long <- x >= lag(x, k = lookback)
short <- x < lag(x, k = lookback)
pos <- long - short # 売買両方
#pos <- long # 買いのみ
#pos <- -short # 売りのみ
ret <- deltaY * lag(pos)
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
matplot(totalRet, type = "l")