11 votos

Calcular el volumen de negocio de la cartera

Estoy intentando calcular el volumen de negocio de una estrategia de cartera.

Primero genero algunos datos aleatorios y les asigno fechas:

data <- replicate(6,rnorm(1000))
data <- as.data.frame(data)    
dates<-seq(as.Date("1932/09/01"), as.Date("2015/12/01"), by = "1 month",tzone="GMT")-1
    rownames(data)<-dates

Lo convierto en formato xts:

library(xts)
data<-as.xts(data,dateFormat="Date")

A continuación, utilizo la función Return.portfolio() para calcular las ponderaciones rebalanceadas asumiendo una estrategia de igual ponderación:

library(PerformanceAnalytics)
results <- Return.portfolio(data,rebalance_on="months",geometric=F,verbose=T)

Para calcular el volumen de negocios, supongo que necesito los pesos del principio del período y el peso del final del período.

Los extraigo de los resultados:

bop <- results$BOP.Weight #beginning of period weights

eop <- results$EOP.Weight #end of period weights

A continuación, para calcular el volumen de negocios, restaré bop de eop y tomar el valor absoluto:

f<-abs(bop-eop)

Por último, para calcular el volumen de negocio utilizo la siguiente fórmula:

 sum(f)*(1/(nrow(data)-1))

Sin embargo, cuando pruebo esto con datos reales (en los que sé cuál debería ser el volumen de negocio) obtengo cifras enormes e irreales con este método.

¿Qué estoy haciendo mal?

Mi definición de rotación proviene de: Demiguel et al Constraining Portfolio Norms http://faculty.london.edu/avmiguel/DeMiguelGarlappiNogalesUppalMS.pdf página 806

La definición es:

enter image description here

0 votos

Creo que su pregunta no es clara. Muchas notaciones deben ser definidas antes de ser utilizadas; no hay que asumir que todo el mundo las conoce. Para el código, es necesario al menos proporcionar algunos comentarios.

0 votos

por favor, vea mis ediciones. Ahora el problema es reproducible.

0 votos

¿Cuál es su definición de "volumen de negocio"? Su cálculo de dos líneas no se parece a ninguna definición que yo conozca.

5voto

wyatt Puntos 126

En primer lugar, estás utilizando datos erróneos. min(data) me da -3,67 (es aleatorio, recuerda), lo que supondría un -367%, ya que la posición quebró y eliminó otras dos (podría ser posible en una cartera apalancada). Sin embargo, en aras de una respuesta reproducible vamos a utilizar el conjunto de datos edhec, muy pocos cambios a su código original se debe hacer.

library(PerformanceAnalytics)
data(edhec)
results <- Return.portfolio(edhec,rebalance_on="months",verbose=T)

bop <- results$BOP.Weight #beginning of period weights

eop <- results$EOP.Weight #end of period weights

Aquí hay un potencial de error en el caso de pesos no iguales, ya que está restando los pesos del principio del período de los pesos del final del período, cuando deberían ser los pesos del período siguiente. Por ejemplo, el mercado ha desplazado las ponderaciones y hay que reajustarlas.

f<-abs(bop-eop)

YourTurnover=sum(f)*(1/(nrow(edhec)-1)) # 0.01242465
SanityCheck=sum(abs(eop-1/ncol(edhec)))/(nrow(edhec)-1) #0.01242465

Tenga en cuenta que la definición anterior de volumen de negocio es la suma de todos los cambios de peso en % dividida por el número de períodos de negociación. Además, los autores NO cuentan la asignación inicial en su volumen de negocio (por ejemplo, el cambio del 100% de efectivo a inversiones).

Una rotación media del 1,24% que parece estar en consonancia con una estrategia de igual peso.

Mi sospecha si no está ejecutando una estrategia de igualdad de peso es la línea de bop-eop. Como debería ser pesos EoP - próximos pesos BoP.

0 votos

El problema era dividir el conjunto de datos por 100. Lo descubrí comparando mis datos con los de edhec. Pero para otras carteras tuve que cambiar mi fórmula basándome en lo que dijiste. ¡Así que gracias por tu ayuda!

1voto

lanrat Puntos 367

Intentaba calcular el volumen de negocio cuando se tienen los pesos mensuales iniciales. No es tan fácil de averiguar la lógica en el paquete utilizado en la respuesta anterior.

Aquí muestro cómo calcular el volumen de negocios de DeMiguel y Nogales (Portfolio Selection with Robust Estimation, Operations Research 57(3), pp. 560-577, 2009).

# 10 last periods and some assets from edhec
edhecselect = c("Emerging Markets","Long/Short Equity","Short Selling","Funds of Funds")
datar = edhec[(nrow(edhec)-9):nrow(edhec),edhecselect]
#nrow(datar)

set.seed(1234) # weights at beginning of the month
ws = data.frame(replicate(ncol(datar),rnorm(nrow(datar),sd=.1))) #weigths according to a rule, here random
ws = ws/rowSums(ws)  #sum(ws)=1 rowSums(ws) 
colnames(ws)=colnames(datar)
rownames(ws) = index(datar) # you know are bop weights for "hand" calculation

library(xts)
datar<-as.xts(datar,dateFormat="Date")
ws<-as.xts(ws,dateFormat="Date")

Calcular a mano

#Create a function
pturnoverDN  = function(weight,rets,port_ret){ 
  weight[is.na(weight)] <- 0  # NAs = 0
  weighteop = weight*(1+rets)/(1+port_ret)
  dweight = abs(weight-lag(weighteop,1))
  out = (rowSums( dweight) )
  return(out)
}

PortRet =apply(datar*ws,1,sum) # compute returns

mean(turnovDN <- pturnoverDN(coredata(ws),datar,PortRet),na.rm=T)
#[1] 6.952423

Utilizando el Return.portfolio función

# for Return.portfolio you need dates of previous month
wsrp= ws
rownames(wsrp)<-index(edhec)[(nrow(edhec)-10):(nrow(edhec)-1)]

wsrp<-as.xts(wsrp,dateFormat="Date")

library(PerformanceAnalytics)
results <- Return.portfolio(datar,weights =wsrp,geometric=F,verbose=T)

results$returns # are the same of hand calculation

bop <- results$BOP.Weight #beginning of period weights

eop <- results$EOP.Weight #end of period weights

f<-abs(bop-eop) 
(YourTurnover=sum(f)*(1/(nrow(datar)-1))) # 1.140454 Wrong?

toDN<-rowSums(abs(bop-lag(eop,1))) # to get the correct value

mean(toDN[-1]) # 6.952423

#Using the pturnoverDN function

mean(pturnoverDN(bop,datar,as.numeric(results$returns)),na.rm=T) # 6.952423

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