Fx
為什麼這個協同集成的籃子看起來好得令人難以置信?
你需要 R 中的 quantmod & tseries 來執行它:
library(quantmod) library(tseries) pairs <- c( "EUR/USD", "GBP/USD", "AUD/USD", "USD/CAD", "USD/CHF", "NZD/USD" ) name <- function(n) { gsub("/","",n,fixed=TRUE) } getFrame <- function(p) { result <- NULL as.data.frame(lapply(p, function(x) { if(!exists(name(x))) { getSymbols(x, src="oanda") } if(is.null(result)) { result <- get(name(x)) } else { result <- merge(result, get(name(x))) } })) } isStationary <- function(frame) { model <- lm(frame[,1] ~ as.matrix(frame[,-1]) + 0) spread <- frame[,1] - rowSums(coef(model) * frame[, -1]) results <- adf.test(spread, alternative="stationary", k=10) if(results$p.value < 0.05) { coefficients <- coef(model) names(coefficients) <- gsub("as.matrix.frame.......", "", names(coefficients)) plot(spread[1:100], type = "b") cat("Minimum spread: ", min(spread), "\n") cat("Maximum spread: ", max(spread), "\n") cat("P-Value: ", results$p.value, "\n") cat("Coeficients: \n") print(coefficients) } } frame <- getFrame(pairs) isStationary(frame)
我從 Oanda 獲得外匯每日數據,進行簡單的線性回歸以找到對沖比率,然後使用增強 DF 檢驗來測試點差中均值回歸的 P 值。
當我執行它時,我得到了這個:
Minimum spread: -1.894506 Maximum spread: 2.176735 P-Value: 0.03781909 Coeficients: GBP.USD AUD.USD USD.CAD USD.CHF NZD.USD 0.59862816 0.48810239 -0.12900886 0.04337268 0.02713479
EUR.USD 係數為 1。
當我繪製前 100 天的價差時,如下所示:
肯定有什麼地方是錯的。聖杯應該不是那麼容易找到的。
有人可以幫我找出問題所在嗎?
我嘗試使用上述係數作為籃子的手數對 Dukascopy 進行回測,但我遇到了失敗。在杜高斯比中,價差有不同的數量級。這是為什麼?
您的程式碼中的主要問題是這一行:
rowSums(coef(model) * frame[, -1])
我不確定它到底做了什麼,也許是一些矩陣乘法,但絕對不是你期望它做的。嘗試用手動乘法替換它
spread <- frame[,1] - (coef(model)[1]*frame[,2] + coef(model)[2]*frame[,3] + coef(model)[3]*frame[,4] + coef(model)[4]*frame[,5] + coef(model)[5]*frame[,6])
聖杯會消失
我還可以看到其他幾個錯誤:
- 您不能以 ASK 價格出售。使用 getSymbols.oanda,您總能得到 ASK
- 你最好分開測試和訓練數據集