4 votos

Backtest con el desplazamiento de la volatilidad en R

Así que yo soy muy nuevo en R. quiero backtest una estrategia para 3 acciones de ESPIONAJE, EEM, AGG.

Con la biblioteca(RiskPortfolios), puedo calcular

optimalPortfolio(Sigma = Sigma, 
                 control = list(type = 'invvol',constraint = 'lo')) 

lo que me da la inversa de la volatilidad para todo el período de tiempo que los precios de las acciones están disponibles.

Lo que si quiero calcular inv vol pesos basados en la volatilidad de los últimos 20 días de negociación?

También quiero reequilibrar la cartera mensual con los nuevos pesos que se basa en la volatilidad de los últimos 20 días de negociación en lugar de mantener la misma ponderación para todo el tiempo. He escuchado que puedo hacer con el paquete (PerformanceAnalytics), pero no sé cómo.

2voto

BigCanOfTuna Puntos 210

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 RiskPortfoliospaquete. 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))

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X