3 votos

¿Cómo calcular el flujo de caja especial con Excel o Python con precisión?

Es sencillo calcular el irr del siguiente flujo de caja:

cash flow     date
-150000     2023-03-30
575         2023-04-30
594.17      2023-05-30
575         2023-06-30
594.17      2023-07-30
594.17      2023-08-30
575         2023-09-30
594.17      2023-10-30
575         2023-11-30
594.17      2023-12-30
575         2024-01-30
594.17      2024-02-30
150575      2024-03-30

Con python:

#install numpy_financial first
#pip install numpy_financial
import numpy_financial as npf
cash =[-150000,575,594.17,575,594.17,594.17,575,594.17,575,594.17,575,594.17,150575]
npf.irr(cash)
0.003897273466228812
(1+npf.irr(cash))**12-1
0.047782876205111346

Por tanto, el irr al mes para el flujo de caja es del 0,39%, el irr al mes para el flujo de caja es del 4,78%.

Con excel irr(a1:a13) puede obtener el mismo resultado por irr al mes.

Ahora vamos a hacer que el flujo de caja sea más especial:

cash flow     date  
-150000    2023-03-30
421.67     2023-04-20
575        2023-05-20
594.17     2023-06-20
575        2023-07-20
594.17     2023-08-20
594.17     2023-09-20
575        2023-10-20
594.17     2023-11-20
575        2023-12-20
594.17     2024-01-20
594.17     2024-02-20
555.83     2024-03-20
150191.67  2024-03-30

¿Cómo se puede calcular el irr con precisión con python o excel entonces?

1voto

Grzenio Puntos 16802

En Excel puede utilizar la función XIRR para calcular la TIR con fechas de inversión irregulares. No veo una función numpy, pero hay separadas xirr y pyxirr que parece estar relativamente extendido.

0voto

Acccumulation Puntos 6429

Tu problema parece ser que los periodos de tiempo son irregulares. Sería de gran ayuda para la lectura de la pregunta hacerlo explícito.

Además de utilizar los paquetes que menciona D Stanley, las opciones son crear una matriz con periodos de tiempo regulares (por ejemplo, crear una matriz con flujos de caja para cada día, con ceros rellenados para cada día sin flujo de caja), o escribir una función que calcule el VAN a partir de la TIR, y luego utilizar cualquier meta-función de búsqueda de objetivos para encontrar la(s) TIR(s) que dan un VAN de cero.

Nótese que he incluido un posible plural sobre la TIR. Puede que ya lo sepas, pero creo que debería incluirse como advertencia en los debates sobre cálculos de TIR: La ecuación de la TIR dada una lista de N flujos de caja es un polinomio de orden N, por lo que habrá N raíces (aunque teóricamente es posible que algunas de ellas sean raíces múltiples). Normalmente, todas menos una serán complejas, pero es posible que un flujo de caja sea coherente con más de un valor real de la TIR.

0voto

gimix Puntos 111

Para calcular la irr a partir de los datos que he proporcionado aquí.Por favor, instale la biblioteca de python con pip install pyxirr guarda los datos que contienen el flujo de caja y la fecha en cash.csv .

from datetime import date
from pyxirr import xirr
import pandas as pd
df = pd.read_csv('cash.csv',header=None,sep='\s+')
df.columns = ['amount','date']
df['date'] = df['date'].astype('datetime64[ns]')
irr = xirr(df['date'],df['amount'])

El irr se anula por defecto.

0voto

Sergey Osypchuk Puntos 2225

He aquí una solución de codificación mínima escrita en Mathematica utilizando sólo funciones básicas tan fácilmente transcribibles al lenguaje de su elección sin necesidad de bibliotecas financieras o de solver.

values = {-150000, 421.67, 575, 594.17, 575,
   594.17, 594.17, 575, 594.17, 575, 594.17,
   594.17, 555.83, 150191.67};

dates = {{2023,3,30}, {2023,4,20}, {2023,5,20},
   {2023,6,20}, {2023,7,20}, {2023,8,20}, {2023,9,20},
   {2023,10,20}, {2023,11,20}, {2023,12,20},
   {2024,1,20}, {2024,2,20}, {2024,3,20}, {2024,3,30}};

start = First[dates];
days = Function[date, First[DateDifference[start, date]]] /@ dates;
tdays = Last[days];
fractions = days/tdays;
Clear[r]
len = Length[dates];
terms = List[];
For[i = 1, i <= len, i++,
  AppendTo[terms, values[[i]]/(1 + r)^fractions[[i]]]];

dfractions = (tdays + days)/tdays;
dterms = List[];
For[i = 1, i <= len, i++,
  AppendTo[dterms, -values[[i]]*fractions[[i]]/(1 + r)^dfractions[[i]]]];

tolerance = 0.001;
r = 1234;
return = 0.01;(* initial guess *)
While[Abs[r - return] > tolerance,
  r = return;
  y = Total[terms];
  yprime = Total[dterms];
  return = r - y/yprime]
annualised = (return + 1)^(365/tdays) - 1

0.047788337

Comprobar en Excel

enter image description here

El bucle while se basa en esto Newton-Raphson y se repite 3 veces en este ejemplo.

Si se utilizara un solucionador, sólo el código hasta el terms sería necesario:-

...
Clear[r]
terms = MapThread[#1/(1 + r)^#2 &, {values, fractions}];
return = Last[r /. NSolve[Total[terms] == 0, r, Reals]];
annualised = (return + 1)^(365/tdays) - 1

0.047788337

Para la transcripción, a continuación se muestran las líneas principales con sus salidas.

enter image description here

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