モメンタム戦略②

保有期間複数日

通貨ペア:EURUSD
期間:2002年1月1日~2013年12月6日
ルール①:前日終値がlookback+1日前の終値以上なら買い、下なら売り。
ルール②:ユニット数はポジション/holddayで計算。
ルール③:ポジションはholdday-1日後の終値で決済。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。
備考④:モメンタムの計算期間及び保有期間はともに5~250まで5刻みとし、50*50=2500で計2500回のバックテストを行う。

# パッケージの呼び出し
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 = 2500, ncol = 4)
colnames(result) <- c("lookback", "holdday", "totalRet", "r2")
for (i1 in 1:50) {
# 計算期間
lookback <- i1 * 5
for (i2 in 1:50) {
# 保有期間
holdday <- i2 * 5
# ポジション
long <- x >= lag(x, k = lookback)
short <- x < lag(x, k = lookback)
pos <- 0
for (i3 in 0:(holdday - 1)) {
pos <- pos + lag(long, k = i3) - lag(short, k = i3) # 売買両方
#pos <- pos + lag(long, k = i3) # 買いのみ
#pos <- pos - lag(short, k = i3) # 売りのみ
}
# リターン
ret <- deltaY * lag(pos, k = 1) / holdday
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
# R2
r2 <- cor(totalRet, 1:length(totalRet)) ^ 2
# 結果の記録
result[(i1 - 1) * 50 + i2, 1] <- lookback
result[(i1 - 1) * 50 + i2, 2] <- holdday
result[(i1 - 1) * 50 + i2, 3] <- last(totalRet)
result[(i1 - 1) * 50 + i2, 4] <- r2
}
}
# 総利益の上位を表示
head(result[sort.list(result[, 3], decreasing = TRUE), ])

lookback holdday totalRet r2
[1,] 100 5 69.66328 0.9044286
[2,] 70 5 68.33184 0.8917856
[3,] 85 5 67.71440 0.8867645
[4,] 100 10 67.00510 0.9099343
[5,] 105 5 64.48499 0.9142768
[6,] 95 5 64.44060 0.9001229
# R2の上位を表示
head(result[sort.list(result[, 4], decreasing = TRUE), ])

lookback holdday totalRet r2
[1,] 130 5 60.85729 0.9343353
[2,] 70 45 56.18045 0.9266143
[3,] 70 40 57.94022 0.9264437
[4,] 125 5 58.91039 0.9254062
[5,] 85 20 60.00396 0.9217187
[6,] 70 35 59.71913 0.9216513
# グラフ
lookback <- 100
holdday <- 5
long <- x >= lag(x, k = lookback)
short <- x < lag(x, k = lookback)
pos <- 0
for (i in 0:(holdday - 1)) {
pos <- pos + lag(long, k = i) - lag(short, k = i) # 売買両方
#pos <- pos + lag(long, k = i) # 買いのみ
#pos <- pos - lag(short, k = i) # 売りのみ
}
ret <- deltaY * lag(pos, k = 1) / holdday
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
matplot(totalRet, type = "l")

コメントの投稿

非公開コメント

プロフィール

Author:fxst24
自分用のノートとして作っていますが、同学の方々の参考になれば幸いです。
記事はことわりなく修正、削除、非公開にすることがあります。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
QRコード
QR