Aquí es un boceto de cómo un backtest se puede hacer con la btest
la función, que es en la PMwR paquete. El paquete es
no en CRAN, pero está disponible a partir de
https://github.com/enricoschumann/PMwR. (Revelación: Yo
soy el autor del paquete.)
El principal insumo para btest
es una función que calcula
el objetivo de la cartera, ya sea como una posición real o
como pesos. En su caso, puede verse de la siguiente manera:
inv_vol <- function() {
## get prices for last 20 days
## and compute returns
R <- returns(Close(n = 20))
optimalPortfolio(Sigma = cov(R),
control = list(type = 'invvol',
constraint = 'lo'))
}
Debo advertir aquí que nunca he usado la RiskPortfolios
paquete.
Si usted realmente desea solamente de la cartera de pesos proporcional a
inverse vol, usted puede escribir la función como sigue:
inv_vol2 <- function() {
## get prices for last 20 days
## and compute returns
R <- returns(Close(n = 20))
w <- 1/apply(R, 2, sd)
w/sum(w)
}
Aquí sería el ejemplo completo. Yo el primero en preparar algunos datos. No pude conseguir los datos de precios
por su clave de pizarra AAG
de Yahoo, así que lo sustituye. Conecte los precios: se debe almacenarse como un zoológico de la serie prices
y no tienen los valores que faltan.
library("PMwR")
library("RiskPortfolios")
library("tseries")
library("zoo")
start <- as.Date("2017-1-1")
ticker <- c("SPY", "EEM", "IUSB")
temp <- list()
for (t in ticker)
temp[[t]] <- get.hist.quote(t, start = start,
quote = "AdjClose")
prices <- do.call(merge, temp)
colnames(prices) <- ticker
head(prices)
## SPY EEM IUSB
## 2017-01-03 220.0632 34.74012 48.47526
## 2017-01-04 221.3724 35.00487 48.50420
## 2017-01-05 221.1965 35.38727 48.60073
## 2017-01-06 221.9879 35.24019 48.52351
## 2017-01-09 221.2552 35.21078 48.56213
## 2017-01-10 221.2552 35.41669 48.55247
El backtest se ejecuta por el paso de los datos y la inv_vol
función a btest
.
res <- btest(list(coredata(prices)),
signal = inv_vol,
do.rebalance = "lastofmonth",
b = 20, ## burnin
convert.weights = TRUE,
initial.cash = 100,
include.data = TRUE,
timestamp = index(prices))
Acceso a los resultados de:
## summary stats
summary(as.NAVseries(res))
## ---------------------------------------------------------
## 31 Jan 2017 ==> 11 May 2018 (323 data points, 0 NAs)
## 100 108.488
## ---------------------------------------------------------
## High 111.86 (26 Jan 2018)
## Low 99.35 (09 Mar 2017)
## ---------------------------------------------------------
## Return (%) 6.6 (annualised)
## ---------------------------------------------------------
## Max. drawdown (%) 4.2
## _ peak 111.86 (26 Jan 2018)
## _ trough 107.11 (08 Feb 2018)
## _ underwater now (%) 3.0
## ---------------------------------------------------------
## Volatility (%) 3.5 (annualised)
## _ upside 3.2
## _ downside 2.1
## ---------------------------------------------------------
##
## Monthly returns ▂▁▂▃█▅▃
##
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec YTD
## 2017 0.0 0.8 1.0 1.1 0.3 1.6 0.9 -0.1 1.2 0.6 0.9 8.5
## 2018 2.1 -2.2 0.4 -0.9 0.6 -0.1
## trades
journal(res)
## instrument timestamp amount price
## 1 SPY 2017-02-28 0.158031858 231.03508
## 2 EEM 2017-02-28 0.464671930 37.25028
## 3 IUSB 2017-02-28 0.938666713 48.90283
## [....]
##
## 48 transactions
## raw equity series (zoo series)
as.zoo(as.NAVseries(res))