先行指標を使った戦略③
相関係数+フィルター+遺伝的アルゴリズム
通貨ペア:EURUSD
先行指標:GSPC
期間:1999年1月1日~2013年11月22日
ルール①:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が正相関、かつ相関係数の絶対値が閾値以上の場合、前日のGSPCの終値変化率がプラスならEURUSDを買い、前日のGSPCの終値変化率がマイナスならEURUSDを売り。
ルール②:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が逆相関、かつ相関係数の絶対値が閾値以上の場合、前日のGSPCの終値変化率がマイナスならEURUSDを買い、前日のGSPCの終値変化率がプラスならEURUSDを売り。
ルール③:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:1ユニット当たりの損益はリターン((当日終値-前日終値)/前日終値*100)で計算。
備考③:コストは考慮していない。
備考④:パラメータは相関係数の計算期間は5~250まで、閾値は0.01から0.2までの範囲で利益が最大化するよう遺伝的アルゴリズムによって求める。
通貨ペア:EURUSD
先行指標:GSPC
期間:1999年1月1日~2013年11月22日
ルール①:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が正相関、かつ相関係数の絶対値が閾値以上の場合、前日のGSPCの終値変化率がプラスならEURUSDを買い、前日のGSPCの終値変化率がマイナスならEURUSDを売り。
ルール②:前日のEURUSDの終値変化率と前々日のGSPCの終値変化率が逆相関、かつ相関係数の絶対値が閾値以上の場合、前日のGSPCの終値変化率がマイナスならEURUSDを買い、前日のGSPCの終値変化率がプラスならEURUSDを売り。
ルール③:ポジションは当日終値で決済。
備考①:約定価格は前日終値。
備考②:1ユニット当たりの損益はリターン((当日終値-前日終値)/前日終値*100)で計算。
備考③:コストは考慮していない。
備考④:パラメータは相関係数の計算期間は5~250まで、閾値は0.01から0.2までの範囲で利益が最大化するよう遺伝的アルゴリズムによって求める。
# パッケージの呼び出し
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))
# 遺伝的アルゴリズムで使う自作関数
f <- function(x1,x2) {
lookback <- x1
threshold <- x2
yx.cor <- rollapply(yx,lookback,cor,by.column=FALSE)[,2]
long <- yx.cor*deltax>=0 & abs(yx.cor)>=threshold
short <- yx.cor*deltax<0 & abs(yx.cor)>=threshold
pos <- long-short
ret <- deltay*lag(pos,k=1)
cumret <- cumsum(window(ret,start=s_date,end=e_date))
return(last(cumret))
}
# バックテスト
GA <- ga(type ="real-valued",fitness=function(x)+f(x[1],x[2]),
min=c(5,0.0),max=c(250,0.2))
Iter = 1 | Mean = 146.6563 | Best = 259.1155
Iter = 2 | Mean = 168.016 | Best = 259.1155
Iter = 3 | Mean = 195.6192 | Best = 264.998
Iter = 4 | Mean = 216.007 | Best = 271.3378
Iter = 5 | Mean = 223.801 | Best = 271.3378
Iter = 6 | Mean = 241.587 | Best = 271.3378
Iter = 7 | Mean = 249.3384 | Best = 271.3378
Iter = 8 | Mean = 247.7227 | Best = 272.1559
Iter = 9 | Mean = 250.4987 | Best = 272.3831
Iter = 10 | Mean = 256.166 | Best = 272.3831
Iter = 11 | Mean = 253.6678 | Best = 272.3831
Iter = 12 | Mean = 258.6355 | Best = 273.2416
Iter = 13 | Mean = 258.2082 | Best = 273.2416
Iter = 14 | Mean = 260.705 | Best = 273.2416
Iter = 15 | Mean = 255.0373 | Best = 273.2416
Iter = 16 | Mean = 257.5628 | Best = 273.2416
Iter = 17 | Mean = 257.7786 | Best = 273.2416
Iter = 18 | Mean = 263.7931 | Best = 273.2416
Iter = 19 | Mean = 265.2671 | Best = 273.2416
Iter = 20 | Mean = 255.4367 | Best = 273.2416
Iter = 21 | Mean = 257.5102 | Best = 273.2416
Iter = 22 | Mean = 258.1173 | Best = 273.2416
Iter = 23 | Mean = 259.2781 | Best = 273.6869
Iter = 24 | Mean = 256.7204 | Best = 273.6869
Iter = 25 | Mean = 264.9666 | Best = 274.1815
Iter = 26 | Mean = 259.7903 | Best = 274.1815
Iter = 27 | Mean = 265.3461 | Best = 274.1815
Iter = 28 | Mean = 261.6481 | Best = 274.1815
Iter = 29 | Mean = 261.6431 | Best = 274.1815
Iter = 30 | Mean = 264.6828 | Best = 274.1815
Iter = 31 | Mean = 258.754 | Best = 274.1815
Iter = 32 | Mean = 264.3194 | Best = 274.1815
Iter = 33 | Mean = 261.8727 | Best = 274.1815
Iter = 34 | Mean = 262.4208 | Best = 274.1815
Iter = 35 | Mean = 265.2953 | Best = 274.1815
Iter = 36 | Mean = 263.8059 | Best = 274.1815
Iter = 37 | Mean = 263.6464 | Best = 274.1815
Iter = 38 | Mean = 260.9621 | Best = 274.1815
Iter = 39 | Mean = 262.1917 | Best = 274.1815
Iter = 40 | Mean = 258.5768 | Best = 274.1815
Iter = 41 | Mean = 262.9583 | Best = 274.1815
Iter = 42 | Mean = 255.8573 | Best = 274.1815
Iter = 43 | Mean = 260.9619 | Best = 274.1815
Iter = 44 | Mean = 262.9156 | Best = 274.1815
Iter = 45 | Mean = 256.9527 | Best = 274.1815
Iter = 46 | Mean = 253.7139 | Best = 274.1815
Iter = 47 | Mean = 260.1888 | Best = 274.1815
Iter = 48 | Mean = 261.758 | Best = 274.1815
Iter = 49 | Mean = 258.0077 | Best = 274.1815
Iter = 50 | Mean = 263.4117 | Best = 274.1815
Iter = 51 | Mean = 265.597 | Best = 274.1815
Iter = 52 | Mean = 256.5491 | Best = 274.1815
Iter = 53 | Mean = 259.8916 | Best = 274.1815
Iter = 54 | Mean = 252.4181 | Best = 274.1815
Iter = 55 | Mean = 252.4218 | Best = 274.1815
Iter = 56 | Mean = 260.9751 | Best = 274.1815
Iter = 57 | Mean = 255.785 | Best = 274.1815
Iter = 58 | Mean = 252.5622 | Best = 274.1815
Iter = 59 | Mean = 256.9913 | Best = 274.1815
Iter = 60 | Mean = 260.0445 | Best = 274.1815
Iter = 61 | Mean = 258.7376 | Best = 274.1815
Iter = 62 | Mean = 255.3566 | Best = 274.1815
Iter = 63 | Mean = 254.9792 | Best = 274.1815
Iter = 64 | Mean = 262.0711 | Best = 274.1815
Iter = 65 | Mean = 260.1262 | Best = 274.1815
Iter = 66 | Mean = 261.4373 | Best = 274.1815
Iter = 67 | Mean = 268.5293 | Best = 274.1815
Iter = 68 | Mean = 262.3043 | Best = 274.1815
Iter = 69 | Mean = 261.9883 | Best = 274.1815
Iter = 70 | Mean = 261.1924 | Best = 274.1815
Iter = 71 | Mean = 264.9793 | Best = 274.1815
Iter = 72 | Mean = 255.9116 | Best = 274.1815
Iter = 73 | Mean = 258.5023 | Best = 274.1815
Iter = 74 | Mean = 261.7324 | Best = 274.1815
Iter = 75 | Mean = 260.329 | Best = 274.1815
Iter = 76 | Mean = 256.2109 | Best = 274.1815
Iter = 77 | Mean = 261.0074 | Best = 274.1815
Iter = 78 | Mean = 261.7329 | Best = 274.1815
Iter = 79 | Mean = 261.0937 | Best = 274.1815
Iter = 80 | Mean = 255.4976 | Best = 274.1815
Iter = 81 | Mean = 261.1592 | Best = 274.1815
Iter = 82 | Mean = 262.0096 | Best = 274.1815
Iter = 83 | Mean = 260.004 | Best = 274.1815
Iter = 84 | Mean = 262.847 | Best = 274.1815
Iter = 85 | Mean = 246.7679 | Best = 274.1815
Iter = 86 | Mean = 245.1673 | Best = 274.1815
Iter = 87 | Mean = 254.4104 | Best = 274.1815
Iter = 88 | Mean = 249.936 | Best = 274.1815
Iter = 89 | Mean = 255.3878 | Best = 274.1815
Iter = 90 | Mean = 253.2762 | Best = 274.1815
Iter = 91 | Mean = 258.4034 | Best = 274.1815
Iter = 92 | Mean = 261.8229 | Best = 274.1815
Iter = 93 | Mean = 261.0771 | Best = 274.1815
Iter = 94 | Mean = 258.3329 | Best = 274.1815
Iter = 95 | Mean = 259.0737 | Best = 274.1815
Iter = 96 | Mean = 262.5346 | Best = 274.1815
Iter = 97 | Mean = 256.1565 | Best = 274.1815
Iter = 98 | Mean = 261.4221 | Best = 274.1815
Iter = 99 | Mean = 260.4866 | Best = 274.1815
Iter = 100 | Mean = 262.0111 | Best = 274.1815
# バックテスト結果の表示
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 5 0.0
Max 250 0.2
GA results:
Iterations = 100
Fitness function value = 274.1815
Solutions =
x1 x2
[1,] 82.51341 0.009576723
[2,] 82.63716 0.009584337
[3,] 82.49047 0.009593308
lookback <- 82
threshold <- 0.01
yx.cor <- rollapply(yx,lookback,cor,by.column=FALSE)[,2]
long <- yx.cor*deltax>=0 & abs(yx.cor)>=threshold
short <- yx.cor*deltax<0 & abs(yx.cor)>=threshold
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
last(cumret)
EURUSD.Close
2013-11-22 272.107
r2
[,1]
EURUSD.Close 0.9875333
matplot(cumret,type="l")