1 votos

Valor futuro: las funciones de Excel, Matlab y Numpy Financial no funcionan cuando el número de períodos es grande

La función Valor Futuro y su comportamiento esperado

La función de Excel FV(rate, nper, pmt, pv) calcula el valor futuro de una inversión basándose en pagos periódicos y constantes y en un tipo de interés constante.

El valor futuro debería ser = -pv si pmt =-pv * tipo ; piense que es como si pagara sólo los intereses de un préstamo: el valor presente es 100, el tipo es 10%, paga 10 cada período, el valor futuro es -100 independientemente del número de períodos, es decir, ha pagado sólo los intereses pero no ha amortizado ni un céntimo.

Por ejemplo

FV(0.1,10,-10,100) = -100

FV(0.1,20,-10,100) = -100

FV(0.1,300,-10,100) = -100

El error en Excel

SIN EMBARGO, si nper (número de períodos) es superior a 300, los resultados no tienen sentido .

nper = 320 --> FV =-100.25
nper = 350 --> FV = -104
nper = 390 --> FV = 256
nper = 400 --> FV = 0

El mismo error en numpy_financial de Python

He observado un comportamiento similar en el sistema de Python numpy financiero (ver este paquete informe de errores ):

conda install -c conda-forge numpy-financial
npf.fv(0.1,200,-10,100) --> -100.0
npf.fv(0.1,300,-10,100) --> -100.03125
npf.fv(0.1,380,-10,100) --> -128.0
npf.fv(0.1,400,-10,100) --> 0

El mismo error en Matlab

No tengo instalado Matlab, pero, desde la página web de la documentación de Matlab Financial Toolbox, se puede prueba de funcionamiento la función fvfix para calcular el valor futuro; esa función también se comporta de forma extraña cuando el número de períodos > 300:

fvfix(0.1,400,-10,100) = 3584

Ni idea de los paquetes de R

He intentado instalar el paquete FinCal de R pero no he conseguido que funcione - aparentemente tengo que compilarlo y no sé cómo.

Mis preguntas

  • ¿Por qué ocurre esto?
  • ¿Es un error conocido?
  • ¿Sucede esto con la mayoría de las bibliotecas financieras? Por ejemplo, ¿en R, Matlab, etc.?
  • ¿Cuál es la solución recomendada? ¿Hay funciones / bibliotecas más fiables en Excel y Python?
  • ¿Hay alguna documentación al respecto? No he podido encontrar nada, aparte del informe de errores de Python enlazado, pero seguramente no puedo ser el primero que se encuentra con esto. Además, en la mayoría de estos paquetes las funciones financieras tienden a depender unas de otras, por lo que un error en el cálculo del valor futuro puede afectar también a las otras funciones financieras

Lo que he entendido hasta ahora

Estas fórmulas calculan (1 + rate ) ^ nper Supongo que el problema surge porque, cuando nper es grande, el resultado puede exceder la precisión máxima permitida por el software. Por ejemplo, 1,1^400 = 3,6e16 Excel sólo puede almacenar 15 dígitos significativos.

1 votos

En Python puedes usar mpmath en lugar de numpy, que maneja números de tamaño arbitrario

5voto

BC. Puntos 9229

No se trata de un error, sino de cómo funcionan los ordenadores. Sin embargo, habría sido mejor preguntar en un foro no financiero. Se llama (Entero) Desbordamiento . Si te gusta leer chats de humor, puedes echar un vistazo aquí .

Puede encontrar una explicación en la mayoría de los documentación . Numpy es curioso, ya que Python no tiene este problema.

enter image description here

Supongo que es justo decir que los autores no esperaban que nadie utilizara períodos tan largos en las finanzas. Al fin y al cabo, a la larga todos estamos muertos.

0 votos

El problema surge con los periodos > 300. Nótese que "períodos" no significa necesariamente años. Por ejemplo, 360 años son 30 años, y se me ocurren muchas aplicaciones realistas y no descabelladas en el mundo real con un horizonte de 30 años. Como mínimo, los autores de todos estos paquetes deberían haberlo documentado, sobre todo porque el usuario medio no tendrá ni idea de lo que significa el desbordamiento de enteros.

1 votos

El enlace humorístico que incluí trata exactamente de la documentación y de dónde y cómo explicarla. He añadido la documentación de numpy que explica el tema. Puede ser cualquier periodo, cierto sin embargo, si es mensual, no tendrás tasas del 10% sin embargo. Así que el problema es una combinación de alto interés y largos períodos. Que en realidad significa años.

4voto

Corey Goldberg Puntos 15625

Los programas informáticos están evaluando la siguiente expresión:

$FV(i,N,PMT,PV)=-PMT[\frac{(1+i)^N-1}{i}]-PV(1+i)^N$

el caso de prueba que está ejecutando es el caso especial en el que elige $PMT=-i\cdot PV$

Si evaluamos la fórmula simbólicamente (en lugar de numéricamente) obtenemos una cancelación afortunada:

$FV(i,N,-i \cdot PV,PV)= PV(1+i)^N-PV(1+i)^N-PV=-PV$

el término problemático $(1+i)^N$ con grandes $N$ desaparece por completo.

Pero, como ocurre a veces, la evaluación numérica no sigue las reglas de la matemática ordinaria y algo sale mal. La cancelación no se produce del todo.

(Hay que reconocer que esto no añade mucho a lo que ya se ha dicho).

0 votos

De acuerdo, pero quizás querías editar otra respuesta, la de AKdemy ;)

0 votos

Efectivamente, mis disculpas por el spam de su respuesta.

3voto

Peter Puntos 216

Como ha publicado @noob2, lo único que hacen estas bibliotecas es aplicar esta fórmula:

$FV(i,N,PMT,PV)=-PMT[\frac{(1+i)^N-1}{i}]-PV(1+i)^N$

Sin embargo, la misma fórmula puede reescribirse como

$-PMT \frac{c}{i} + \frac{PMT}{i} - PV \cdot c$ , donde $c=(1+i)^N$ , que puede reordenarse como:

$-c \left( \frac{PMT}{i}+PV \right) + \frac{PMT}{i}$

Una posible solución es utilizar una función formulada como la anterior: en mis ejemplos específicos de pagar sólo los intereses de un préstamo, los elementos del paréntesis se convierten en cero, y la fórmula devuelve el resultado correcto incluso si $c$ se desborda.

Lo que no tengo muy claro es si esto también hace que la función sea "menos imprecisa" cuando el paréntesis no es cero porque $c$ se calcula sólo una vez, o si es un punto discutible porque se desborda de todos modos.

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