平均回帰戦略③

ヘッジ比率

通貨ペア1:AUDUSD
通貨ペア2:USDCAD
期間:2003年1月1日~2013年12月6日
ルール①:ポートフォリオの前日終値が前日の移動平均線より下ならポートフォリオを買い、上ならポートフォリオを売る。
ルール②:ユニット数はポートフォリオの前日の「-(終値-平均)/標準偏差」で計算(プラスなら買い、マイナスなら売りとなる)。
ルール③:ポジションは当日終値で決済。
備考①:ポートフォリオの市場価格はAUDUSD-1/USDCAD*ヘッジ比率(USDCADを逆数にしているのはUSDで統一するため)で計算。
備考②:ヘッジ比率はAUDUSDを従属変数、USDCADの逆数を独立変数として回帰分析(切片なし)して求めた傾き。
備考③:約定価格は前日終値。
備考④:ユニット数はいくらでも細分化できると仮定している。
備考⑤:ポートフォリオを買うときはAUDUSDをポートフォリオと同じユニット数で買い、USDCADの逆数をポートフォリオのユニット数*ヘッジ比率で売る。
備考⑥:ポートフォリオを売るときはAUDUSDをポートフォリオと同じユニット数で売り、USDCADの逆数をポートフォリオのユニット数*ヘッジ比率で買う。
備考⑦:損益の単位は%。
備考⑧:コストは考慮していない。
備考⑨:回帰分析の計算期間は5~250まで5刻みとし、平均、標準偏差の計算期間も同じく5~250まで5刻みとし、50*50=2500で計2500回のバックテストを行う。

# パッケージの呼び出し
library(quantmod)
# 開始日
startDate <- as.Date("2003-01-01")
# 終了日
endDate <- as.Date("2013-12-06")
# 従属変数の終値
y <- data$AUDUSD.Close
# 独立変数の終値
x <- 1 / data$USDCAD.Close
# 従属変数の変化率
deltaY <- diff(y) / lag(y) * 100
# 独立変数の変化率
deltaX <- diff(x) / lag(x) * 100
# データの結合
yx <- merge(y, x)
# ヘッジ比率を求める関数
f <- function(yx) {
colnames(yx) <- c("y", "x")
yx.lm <- lm(y~x-1, data = yx)
return(yx.lm$coefficients)
}
# 結果を格納するオブジェクト
result <- matrix(0, nrow = 2500, ncol = 4)
colnames(result) <- c("lookback1", "lookback2", "totalRet", "r2")
# バックテスト
for (i in 1:50) {
# 計算期間1
lookback1 <- 5 * i
# ヘッジ比率
hedgeRatio <- rollapplyr(yx, lookback1, FUN = f, by.column = FALSE)
# ポートフォリオの市場価格
port <- y - x * hedgeRatio
for(j in 1:50) {
# 計算期間2
lookback2 <- 5 * j
# 平均
avg <- rollapply(port, lookback2, mean)
# 標準偏差
std <- rollapply(port, lookback2, sd)
# ユニット数
unit <- -(port - avg) / std
# 損益
retY <- deltaY * lag(unit)
retX <- -deltaX * lag(unit) * hedgeRatio
ret <- retY + retX
# 累積損益
totalRet <- cumsum(window(ret, start=startDate, end=endDate))
# R2
r2 <- cor(totalRet, 1:length(totalRet))^2
# 結果の記録
result[50 * (i - 1) + j, 1] <- lookback1
result[50 * (i - 1) + j, 2] <- lookback2
result[50 * (i - 1) + j, 3] <- last(totalRet)
result[50 * (i - 1) + j, 4] <- r2
}
}
# 総利益に基づく結果の表示
head(result[sort.list(result[, 3], decreasing = TRUE),])

lookback1 lookback2 totalRet r2
[1,] 5 250 101.15539 0.8653393
[2,] 5 245 100.93609 0.8649649
[3,] 5 240 100.22456 0.8639008
[4,] 5 235 99.83614 0.8645921
[5,] 5 230 98.93859 0.8634991
[6,] 5 225 98.63364 0.8639317
# R2に基づく結果の表示
head(result[sort.list(result[, 4], decreasing = TRUE),])

lookback1 lookback2 totalRet r2
[1,] 70 5 82.01238 0.9211245
[2,] 75 5 77.41418 0.9131398
[3,] 65 5 79.86110 0.9116928
[4,] 115 5 70.48171 0.9109223
[5,] 95 5 71.70215 0.9094381
[6,] 85 5 75.27183 0.9082865
# グラフ
lookback1 <- 5
hedgeRatio <- rollapplyr(yx, lookback1, FUN = f, by.column = FALSE)
port <- y - x * hedgeRatio
lookback2 <- 250
avg <- rollapply(port, lookback2, mean)
std <- rollapply(port, lookback2, sd)
unit <- -(port - avg) / std
retY <- deltaY * lag(unit)
retX <- -deltaX * lag(unit) * hedgeRatio
ret <- retY + retX
totalRet <- cumsum(window(ret, start=startDate, end=endDate))
matplot(totalRet, type="l")

コメントの投稿

非公開コメント

プロフィール

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

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