200日移動平均線を利用した戦略②

ゴールデンクロスとデッドクロス

通貨ペア:AUDUSD
期間:2002年1月1日~2013年12月6日
ルール①:前々日終値が前々日の200日移動平均線より下、かつ前日終値が前日の200日移動平均線以上で買い、前々日終値が前々日の200日移動平均線より上、かつ前日終値が前日の200日移動平均線以下で売り。
ルール②:ポジションはholdDay-1日後まで保有。
ルール③:ユニット数はポジション/holdDayで計算。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。

# パッケージの呼び出し
library(quantmod)
# 開始日
startDate <- as.Date("2002-01-01")
# 終了日
endDate <- as.Date("2013-12-06")
# 従属変数の終値
y <- data$USDJPY.Close
# 独立変数の終値
x <- data$USDJPY.Close
# 従属変数の変化率
deltaY <- diff(y) / lag(y) * 100
# 独立変数の200日移動平均線
ma200X <- rollapply(x, 200, mean)
# 結果を記録するオブジェクト
result <- matrix(0, nrow = 50, ncol = 3)
colnames(result) <- c("holdDay", "totalRet", "r2")
# バックテスト
for(i in 1:50) {
# 保有期間
holdDay <- i
# ポジション
long <- x >= ma200X & lag(x) < lag(ma200X)
short <- x <= ma200X & lag(x) > lag(ma200X)
pos <- 0
for(j in 0:(holdDay - 1)) {
# 売買両方
pos <- pos + lag(long, k = j) - lag(short, k = j)
# 買いのみ
#pos <- pos + lag(long, k = j)
# 売りのみ
#pos <- pos - lag(short, k = j)
}
# リターン
ret <- deltaY* lag(pos) / holdDay
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
# R2
r2 <- cor(totalRet, 1:length(totalRet)) ^ 2
# 結果の記録
result[i, 1] <- holdDay
result[i, 2] <- last(totalRet)
result[i, 3] <- r2
}
# 結果
result

holdDay totalRet r2
[1,] 1 5.45621473 0.247305266
[2,] 2 -2.74228018 0.717608210
[3,] 3 -1.33788316 0.243618620
[4,] 4 -1.72207196 0.580997924
[5,] 5 1.56680910 0.695512330
[6,] 6 0.41530158 0.008503168
[7,] 7 -0.64446804 0.296687589
[8,] 8 -2.26646046 0.757669292
[9,] 9 -2.18592081 0.834051503
[10,] 10 -0.81340048 0.594979883
[11,] 11 -1.35016552 0.640169576
[12,] 12 -0.73247497 0.692114013
[13,] 13 -0.96008404 0.708402730
[14,] 14 -1.02352638 0.732610535
[15,] 15 -1.15475667 0.772458404
[16,] 16 -0.59573378 0.763830014
[17,] 17 0.25276845 0.322455604
[18,] 18 -0.31150303 0.163238376
[19,] 19 -0.81464941 0.795989131
[20,] 20 -0.45144025 0.543338637
[21,] 21 -0.45933179 0.559608678
[22,] 22 -0.29148207 0.590542675
[23,] 23 -0.57011113 0.665345669
[24,] 24 -0.73716205 0.764486749
[25,] 25 -0.55741849 0.807465062
[26,] 26 -0.52294944 0.757495216
[27,] 27 0.09591423 0.020682548
[28,] 28 -0.46185697 0.803134583
[29,] 29 0.14526304 0.020904298
[30,] 30 0.53068151 0.614405022
[31,] 31 -0.06940074 0.497158109
[32,] 32 0.27983551 0.108951643
[33,] 33 0.09493464 0.068877863
[34,] 34 -0.21092978 0.567648315
[35,] 35 -0.27693000 0.622282961
[36,] 36 0.03117901 0.361751644
[37,] 37 0.19789419 0.030488119
[38,] 38 -0.20958160 0.645494766
[39,] 39 -0.20372867 0.663481182
[40,] 40 -0.15655981 0.655149860
[41,] 41 -0.28480232 0.730426976
[42,] 42 0.06241988 0.048049482
[43,] 43 0.17657995 0.027988707
[44,] 44 -0.10440410 0.593721553
[45,] 45 0.10695212 0.053046722
[46,] 46 0.23478939 0.292296757
[47,] 47 0.01740810 0.170168857
[48,] 48 0.05303157 0.350471521
[49,] 49 0.17563590 0.191497658
[50,] 50 0.01163562 0.471796924
# グラフ
holdDay <- 1
long <- x >= ma200X & lag(x) < lag(ma200X)
short <- x <= ma200X & lag(x) > lag(ma200X)
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) / holdDay
totalRet <- cumsum(window(ret, start = startDate, end = endDate))
matplot(totalRet,type="l")
# 使用済みオブジェクトの削除
rm(r2, result)
rm(deltaY, endDate, holdDay, i, j, long, ma200X, pos, ret, short,
startDate, totalRet, x, y)

コメントの投稿

非公開コメント

プロフィール

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

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