2 votos

Cómo normalizar los pesos cuando éstos no suman 100%.

Estoy trabajando en un trabajo para una empresa. Quieren que calcule el rendimiento de una cartera de valores a lo largo del tiempo, dados los rendimientos de los valores a lo largo del tiempo y la ponderación inicial de los valores. Puedo hacerlo para el caso normal de que no haya posiciones cortas, es decir, sin ponderaciones negativas. Sin embargo, para los casos de 20% largo neto y 0% largo neto, obtengo respuestas diferentes de sus casos de prueba después del primer período, es decir, después de que las ponderaciones diverjan de sus valores iniciales. Creo que esto se debe a que no estoy normalizando las ponderaciones correctamente. Para el caso largo del 100%, simplemente divido cada peso por la suma de todos los pesos para asegurarme de que suman 100%. ¿Cuál es el procedimiento equivalente para los demás casos?

Aquí están los rendimientos de la seguridad:

SAMPLE_RETURN_ARRAY = [
    [0.02, 0.01, 0.08, 0.04, -0.05],  # MSFT
    [-0.02, 0.03, 0.06, 0.01, 0.05],  # AAPL
    [0.01, -0.04, -0.03, -0.05, -0.03],  # GOOG
    [0.04, 0.02, 0.01, -0.02, -0.01],  # TSLA
    [-0.01, -0.01, -0.06, -0.03, 0.02],  # JPM
]

Y aquí están los pesos iniciales:

SAMPLE_WEIGHTS = [0.2, 0.3, 0.1, 0.05, 0.35]

estos son los resultados para el caso 100% largo:

correct_result = [-0.0025, 0.00440602, 0.01166979, -0.00329201, 0.00761087]
r1 = np.all(np.isclose(correct_result, result, atol=1e-5, rtol=0))

Efectivamente, consigo que sus resultados sean correctos con 5 decimales.

Estos son los resultados para un 20% de posiciones largas y un 0% de posiciones largas (es decir, neutralidad de mercado):

20%:     correct_result = [0.0005, 0.00924038, 0.05129543, 0.01710086, -0.00349387]
0%:      correct_result = [0.0015, -0.01729905, -0.05853928, -0.02974261, -0.00176708]

En el caso del 20%, las ponderaciones son [0.2, 0.3, 0.1, -0.05, -0.35] y en el caso del 0% las ponderaciones son [-0.2, -0.3, 0.1, 0.05, 0.35] .

¿Puede alguien ayudarme a entender cómo se calculan los 0,00924038 y -0,01729905 (los rendimientos de la cartera del segundo período)? No necesito el código (aunque puede proporcionármelo), sólo las matemáticas que hay detrás de los números. He probado un montón de cosas y obtengo números cercanos, pero nunca exactos o con 5 decimales.

Hágame saber si puedo proporcionarle más información.

Muchas gracias de antemano.

2voto

BigCanOfTuna Puntos 210

Siempre que no esté totalmente invertido, tendrá que hacer suposiciones. Un ejemplo sencillo: Tienes 100 USD e inviertes el 20%. Si calcula la rentabilidad con un nocional de sólo 20 USD (el nocional real invertido), o con el total de 100 USD? En la práctica En la práctica, estas suposiciones rara vez se hacen explícitas, pero tampoco son polémicas. Como insistimos en que hemos invertido el 20%, normalmente calculamos los rendimientos sobre el nocional completo.

En su ejemplo, las suposiciones parecen ser: nunca reequilibra; y no debe hacer ningún reajuste, sino asumir un nocional inicial de 1 (es decir, 100%).

Una forma de calcular la rentabilidad en este caso es la siguiente:

  1. Cree series de precios artificiales de sus rendimientos empezando por 1 en el momento 0, y recopilarlas en una matriz $P$ cada acción en una columna.

  2. Calcular los valores de la cartera $v = Pw + (1 - \Sigma(w))$ El efectivo restante (si lo hay) se incluye en el valor de la cartera.

  3. Calcular los rendimientos simples de $v$ .

Como comprobación, hago estos cálculos en R, y los comparo con los resultados de la función returns del paquete PMwR (que yo mantengo):

library("PMwR")

SAMPLE_RETURN_ARRAY <- cbind(
    MSFT = c( 0.02,  0.01 , 0.08,  0.04, -0.05),
    AAPL = c(-0.02,  0.03,  0.06,  0.01,  0.05),
    GOOG = c( 0.01, -0.04, -0.03, -0.05, -0.03),
    TSLA = c( 0.04,  0.02,  0.01, -0.02, -0.01),
    JPM  = c(-0.01, -0.01, -0.06, -0.03,  0.02)
)

En primer lugar, cree series de precios artificiales:

P <- apply(rbind(0, SAMPLE_RETURN_ARRAY) + 1, 2, cumprod)
##          MSFT     AAPL      GOOG     TSLA       JPM
## [1,] 1.000000 1.000000 1.0000000 1.000000 1.0000000
## [2,] 1.020000 0.980000 1.0100000 1.040000 0.9900000
## [3,] 1.030200 1.009400 0.9696000 1.060800 0.9801000
## [4,] 1.112616 1.069964 0.9405120 1.071408 0.9212940
## [5,] 1.157121 1.080664 0.8934864 1.049980 0.8936552
## [6,] 1.099265 1.134697 0.8666818 1.039480 0.9115283

Ahora los cálculos:

## invest net 100%
w <- c(0.2, 0.3, 0.1, 0.05, 0.35)
## compute manually
v <- P %*% w + (1 - sum(w))
v[-1]/v[-length(v)] - 1 
## check with PMwR::returns
c(returns(P, weights = w, rebalance.when = 1))
## [1] -0.002500000  0.004406015  0.011669786 -0.003292007  0.007610873
## [1] -0.002500000  0.004406015  0.011669786 -0.003292007  0.007610873

## invest net 20%
w20 <- c(0.2, 0.3, 0.1, -0.05, -0.35)
## compute manually
v <- P %*% w20 + (1 - sum(w20))
v[-1]/v[-length(v)] - 1 
## check with PMwR::returns
c(returns(P, weights = w20, rebalance.when = 1))
## [1]  0.000500000  0.009240380  0.051295426  0.017100863 -0.003493869
## [1]  0.000500000  0.009240380  0.051295426  0.017100863 -0.003493869

Por último, inversión neta cero:

## invest net 0%
w0 <- c(-0.2, -0.3, 0.1, 0.05, 0.35)
## compute manually
v <- P %*% w0 + (1 - sum(w0))
v[-1]/v[-length(v)] - 1 
## check with PMwR::returns
c(returns(P, weights = w0, rebalance.when = 1))
## [1]  0.00150000 -0.01729905 -0.05853928 -0.02974261 -0.00176708
## [1]  0.00150000 -0.01729905 -0.05853928 -0.02974261 -0.00176708

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