Necesitas quantmod y tseries en R para ejecutar esto:
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)
Obtengo los datos diarios de FX de Oanda, hago una regresión lineal simple para encontrar los ratios de cobertura, y luego uso la prueba de DF aumentada para probar el valor P de reversión media en el spread.
Cuando lo ejecuto me sale esto:
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
El coeficiente EUR.USD es 1.
Cuando trazo la extensión, los primeros 100 días se ven así:
Seguramente algo debe estar mal. El santo grial no debería ser tan fácil de encontrar.
¿Puede alguien ayudarme a encontrar lo que está mal?
He intentado hacer backtesting en Dukascopy con los coeficientes anteriores como tamaños de lote de una cesta, pero me encuentro con pérdidas. Y el spread tiene un orden de magnitud diferente en dukascopy. ¿Por qué es eso?