Soy programador y necesito una fórmula para calcular el ROI general [duplicar]

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'?

¿Tiene un fondo de cobertura que aceptó solo $ 25K y permite depósitos/retiros semanales?
Lol, no, SERA un fondo de cobertura en aproximadamente 2 meses, ahora mismo es solo mi hermano que ha estado operando durante aproximadamente 10 años y me envía cheques a pedido;)
Veo tu edición. ¿El enlace a una pregunta similar no ayudó?
Le sugiero que use rendimientos ponderados en función del dinero o capitalizados continuamente (logarítmicos), en realidad lo mismo, como se explica aquí para calcular los rendimientos periódicos, en su caso, aparentemente semanales. (Eso requiere un algoritmo de resolución de raíz). Luego, acumule los rendimientos semanales para obtener un rendimiento anual de la manera que se demuestra aquí . Agregaría una respuesta más completa, pero la pregunta se marcó como duplicada y ahora no se pueden publicar las respuestas.
Gracias Chris. De hecho, he programado un algoritmo de resolución de raíz para esto :) Para mi ejemplo anterior, obtengo .098 cuando resuelvo i. Supongo que este (9,8%) es el promedio semanal. Entonces, para obtener el ROI general, ¿debería multiplicar ese número por el número de iteraciones (semanas)? ¿O me estoy perdiendo una gran pieza del rompecabezas?
Hola. Calcularía el rendimiento del peso del dinero por IRR para las 4 semanas completas resolviendo 25000/(1 + x)^0 - 4000/(1 + x)^0.25 - 300/(1 + x)^0.5 - 1500/(1 + x)^0.75 = 32318.63/(1 + x)^1dando 60.34%. Para semanalmente eso es (1 + 0.6034)^(1/4) - 1 = 12.53%, que es lo mismo que resolver 25000/(1 + x)^0 - 4000/(1 + x)^1 - 300/(1 + x)^2 - 1500/(1 + x)^3 = 32318.63/(1 + x)^4. Espero que ayude.
Lo siento, con mis métodos, de hecho, obtuve .12529, que es 12.53%. Así que mi fórmula funciona en ese sentido para poder obtener los resultados semanales. ¿Existe una forma rápida de retroceder y obtener los resultados generales, en este caso para un total de 4 semanas, si ya sé que el 12,53 % es mi ROI promedio semanal? Su fórmula anterior es excelente, y entiendo cómo, solo necesito ponerla en un programa de computadora, por lo que cualquier atajo sería increíble. Muchas gracias por tu ayuda. Llevo 3 días trabajando en esto y he aprendido mucho, pero todavía no he llegado a donde quiero estar ;)
No importa, acabo de tomar (1.1253^(# of iterations = '4') - 1) * 100 y eso equivalió a 60.34% que, como mencionaste, es el ROI para las 4 semanas completas. Si no me equivoco, quiero agradecerles mucho por ayudarme a llegar hasta aquí. Seguro que me has ahorrado unos días más de tirones de pelo. La próxima vez que estés en Columbus, Ohio, ¡déjame invitarte a una cerveza!

Respuestas (3)

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.

Esa fórmula funciona si no estoy constantemente agregando/retirando fondos semanalmente. ¿A menos que me esté perdiendo algo?

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.

La función de búsqueda de carbón de Excel hará esto por usted...