モメンタム戦略③
遺伝的アルゴリズム
通貨ペア:EURUSD
期間:2002年1月1日~2013年12月6日
ルール①:前日終値がlookback+1日前の終値以上なら買い、下なら売り。
ルール②:ユニット数はポジション/holddayで計算。
ルール③:ポジションはholdday-1日後の終値で決済。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。
備考④:利益を最大化するモメンタムの計算期間及びポジションの保有期間を1~250までの範囲で遺伝的アルゴリズムによって求める。
通貨ペア:EURUSD
期間:2002年1月1日~2013年12月6日
ルール①:前日終値がlookback+1日前の終値以上なら買い、下なら売り。
ルール②:ユニット数はポジション/holddayで計算。
ルール③:ポジションはholdday-1日後の終値で決済。
備考①:約定価格は前日終値。
備考②:損益の単位は%。
備考③:コストは考慮していない。
備考④:利益を最大化するモメンタムの計算期間及びポジションの保有期間を1~250までの範囲で遺伝的アルゴリズムによって求める。
# パッケージの呼び出し
library(GA)
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
# 遺伝的アルゴリズムで使う関数
f <- function(x1, x2) {
# 計算期間
lookback <- x1
# 保有期間
holdday <- x2
# ポジション
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))
return(last(totalRet))
}
# 遺伝的アルゴリズム
GA <- ga(type = "real-valued", fitness = function(x) + f(x[1], x[2]), min = c(1, 1),
max = c(250, 250))
# 要約
summary(GA)
+-----------------------------------+
| Genetic Algorithm |
+-----------------------------------+
GA settings:
Type = real-valued
Population size = 50
Number of generations = 100
Elitism =
Crossover probability = 0.8
Mutation probability = 0.1
Search domain
x1 x2
Min 1 1
Max 250 250
GA results:
Iterations = 100
Fitness function value = 58.93862
Solution =
x1 x2
[1,] 85.27676 18.49863
# リターン
lookback <- 85
holdday <- 18
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))
last(totalRet)
EURUSD.Close
2013-12-06 60.57133
# R2
cor(totalRet, 1:length(totalRet)) ^ 2
[,1]
EURUSD.Close 0.9200318
# グラフ
matplot(totalRet, type = "l")