Estoy programando una aplicación web para realizar un seguimiento del rendimiento de mi fondo de cobertura. Me gustaría encontrar mi ROI general de todos los tiempos.
Si tuviera un saldo inicial y mi saldo actual, encontrar el ROI es fácil. Por ejemplo ((saldo actual / saldo inicial) * 100) para obtener el porcentaje.
Donde tengo dificultad es en el hecho de que cada semana hay débitos/créditos a la cuenta.
Entonces, ¿cómo puedo calcular con precisión un ROI de por vida cuando cada semana agrego o elimino fondos?
Aquí hay un informe semanal de ejemplo.
9/9/2013-9/13/2013 :
beginning balance = 25000 :
Profit/Loss in % = 16.45 :
Gross Profit/Loss = 4,112.72 :
Debit/Credit = -2000 :
New Balance 27,114
Imagine que las próximas 9 semanas se ven similares con porcentajes fluctuantes de ganancias/pérdidas (retorno de la inversión semanal)
¿Alguno de ustedes, genios, puede proporcionarme una fórmula para descubrir cómo determinar exactamente qué tan bien le ha ido al administrador del fondo de cobertura hasta el día de hoy, independientemente de cuántas semanas haya estado involucrado? Estoy asumiendo algún tipo de capitalización semanal.
EDITAR: Así que encontré una fórmula que creo que es útil y conecté 4 semanas de datos
25000((1+i)^4) - 4000((1+i)^3) - 300((1+i)^2) - 1500((1+i)) = 32318.63
¿Cómo podría resolver para 'i'?
retorno de la inversión (%) = (Beneficio neto / Inversión) × 100
^ Una fórmula mucho más clara para basar sus cálculos. Ahora solo tiene que calcular su ganancia neta para cada semana, sumar todo eso, hacer lo mismo con la inversión y tendrá su respuesta.
Tiene un flujo desigual de pagos que ocurren en intervalos de tiempo variables. Y conoces la fórmula del ROI. Lo que está tratando de determinar es qué tasa de interés para todo el período refleja mejor el valor acumulado del fondo, y ha deducido correctamente la fórmula para calcular cada...
Time Amount Effect
4 25000 25000((1+i)^4) #contribution due to first deposit
3 4000 4000((1+i)^3) #contribution due to second deposit
2 -300 -300((1+i)^2) #contribution due to third (withdrawal)
1 1500 1500((1+i)^1) #contribution due to fourth deposit
Necesita una solución iterativa. Debe comenzar con una suposición de su tasa de interés, i, y luego iterar sobre su vector de depósito, recalculando el fondo con la tasa supuesta. Deberá ajustar su tasa de interés estimada a medida que itera, y la cantidad por la que ajuste su tasa estimada afectará la rapidez con la que converge en una solución.
La cantidad que cambie su tasa estimada determinará qué tan rápido converge en una solución (de hecho, si converge en una solución). El siguiente algoritmo general lo ayudará a comenzar. Necesita jugar con el cálculo de ajuste en la función de estimación. La complicación es que el cálculo del ROI no es lineal, por lo que necesitará algo que se ajuste de forma no lineal y en un orden similar al valor del cálculo. Mi función de tasa de conjetura de muestra es lineal, por lo que debe refinar la función.
Pruebe una solución iterativa. Elija un valor para i e itere
intialize_fund
{
value = 32318.63
//initialize your deposit/withdrawal vector/array
deposits[]
deposits[0] = +25000
deposits[1] = +4000
deposits[2] = -300
deposits[3] = +1500
duration = 5 //number of periods
}
calcval( deposits[], rate, duration )
{
accum = 0.0
for period=0; period<duration; ++period)
{
accum = accum * (1+rate)
if( exists deposits[period] ) accum += deposits[period]
}
return accum
}
#you will need to tinker with this until you get a function that
#converges
#converges quickly
guessrate( actual, calculated, rate )
{
adjustby = abs(actual - calculated) / actual
if(calculated > actual) rate = rate * (1.0 - adjustby)
else rate = rate * (1.0 + adjustby)
return rate
}
guessRoi
{
guess = 0.01 #initial guess
tryVal = calcval( guess, changes, duration )
while( abs(actual - tryVal) > .01 )
{
rate = guessrate( actual, tryVal, rate )
tryVal = calcval( deposits, rate, duration )
}
#guess has calculated rate, i
#tryRoi should have converged to actual accumulation
}
¿Qué diablos es un vector de depósito?
Pero sí, debe comenzar con 2 (DOS) conjeturas para i: una que sabe que es demasiado alta y otra que sabe que es demasiado baja. Luego intente con el punto medio para ver si es demasiado alto o demasiado bajo. Si es demasiado alto, su nuevo rango es la mitad inferior; de lo contrario, la mitad superior. Ahora repite, con esta nueva gama más pequeña, una y otra vez.
La función no es lineal, pero es fluida y se comporta bien, por lo que no necesita preocuparse por la convergencia, simplemente siga reduciendo a la mitad el intervalo en cada iteración hasta que esté tan cerca como desee.
JTP - Pide disculpas a Mónica
usuario1888959
JTP - Pide disculpas a Mónica
chris degnen
usuario1888959
chris degnen
25000/(1 + x)^0 - 4000/(1 + x)^0.25 - 300/(1 + x)^0.5 - 1500/(1 + x)^0.75 = 32318.63/(1 + x)^1
dando 60.34%. Para semanalmente eso es (1 + 0.6034)^(1/4) - 1 = 12.53%, que es lo mismo que resolver25000/(1 + x)^0 - 4000/(1 + x)^1 - 300/(1 + x)^2 - 1500/(1 + x)^3 = 32318.63/(1 + x)^4
. Espero que ayude.usuario1888959
usuario1888959