Implementación de las funciones Precio y Rendimiento de las hojas de cálculo Excel
Tiempo total: 0 días con 1:54:14 hrs
Recientemente, se me asigno la tarea de implementar las funciones Yield y Price de Excel, y en esta publicación mostrare el código necesario para implementarlas en Visual Studio 2010 utilizando C#. Mi intención no es simplemente copiar las ecuaciones de la documentación de Microsoft y del MIT, si no mostrar los inconvenientes encontrados y las diferencias en resultados con Excel.
Función precio
La ecuación de Precio que utiliza Excel, es la siguiente (Consulta la documentación de Microsoft)
Los parámetros de entrada son:
Variable | En la ecuación |
Fecha de liquidación | settlement |
Fecha de vencimiento | Maturity |
Tasa | Rate |
Rendimiento | Yield |
Valor de rescate | Redemption |
Frecuencia | Frequency |
Base | Base |
Y a partir de las fechas de liquidación y vencimiento, se obtienen las variables:
En la ecuación | Microsoft | Excel en ingles | Excel en español |
DIC | E | COUPDAYS | CUPON.DIAS |
NCP | N | COUPNUM | CUPON.NUM |
DCS | A | COUPDAYBS | CUPON.DIAS.L1 |
DSC | DSC | COUPDAYSNC | CUPON.DIAS.L2 |
La ecuación es sencilla, las funciones CUPON las encontramos en PHPExcel, únicamente las modificamos para poderlas utilizar en C#.
Función rendimiento
La función rendimiento consiste en obtener el rendimiento a partir del precio y de los demás datos de entrada. Para esta función se necesitan conocimientos de cálculo, debido a que si N es menor o igual a 1, se utiliza la siguiente función:
Si no, se utiliza el método de newton hasta un máximo de 100 iteraciones (Puedes consultar la documentación de Excel), para este método establecemos nuestro valor de tolerancia, pero lo más lógico es que queremos la mejor aproximación al valor real debido a que en bancos (por ejemplo) se utiliza la función para realizar compras millonarias.
El método de Newton?
La siguiente es la ecuación del método de Newton, y la función es la que utilizamos para calcular el precio.
Si derivamos la función de precio, el resultado que obtenemos es el siguiente:
Ahora podemos decir que tenemos todo resuelto, tanto para la función precio como para la de rendimiento pero al concluir con la implementación observamos que Excel no muestra los mismos resultados que las mismas explicaciones y ecuaciones de su documentación.
Conclusión
A simple vista, lo primero que te viene a la mente es “Me equivoque en algo” pero después, te das cuenta que Microsoft utiliza una función distinta a la nuestra (y a la de su documentación) porque si comparas los resultados con las hojas de cálculo en línea de Google, te das cuenta que son los mismos que obtienes en la implementación de este código.
Que significa esto?
Significa que no importa quién sea el que implementa las explicaciones y ecuaciones de Microsoft, los resultados que se obtendrán siempre tendrán una diferencia de centésimas, haciendo que el objetivo de obtener los mismos resultados de Excel sean completamente (matemáticamente) imposibles.
Solución
Quiero encontrar la solución a esto y la mostrare en una futura publicación (Utilizando integrales tal vez, porque mi campo no son las finanzas y necesitaría estudiar la demostración de la función Precio), pero lógicamente por el error de “No obtener los mismos resultados que Excel”, la empresa que me solicito este código no me pago el trabajo realizado (Considero esto, una gran informalidad y una gran falta de ética debido a que la empresa solicito implementar las ecuaciones de Microsoft). Encontrar los mismos valores de Google significa únicamente que las ecuaciones y códigos son correctos. Lo primero que pienso es que Microsoft utilizo una ecuación distinta a la que muestra, esto porque he comparado las variables N, E, A y DSC de las ecuaciones de precio de la documentación con los resultados de mi código, las cuales son las mismas pero obtengo el mismo error centesimal.
Código fuente
El resultado de esta publicación es el código fuente, puedes descargar aquí las cuatro clases C# que utilizo para implementar lo explicado:
Descargar: http://www.elconspirador.com/wp-content/uploads/2014/11/Excel.zip
Utilización:
Precio Price = new Precio(); Rendimiento Yield = new Rendimiento(); //DateTime(Año, mes, dia) DateTime liquidacion = new DateTime(2014, 8, 8); DateTime vencimiento = new DateTime(2014, 8, 18); double tasa = 0.12; double rendimiento = 0.10; int frecuencia = 1; int basis = 2; double precio = Price.PRICE(liquidacion, vencimiento, tasa, rendimiento, 100, frecuencia, basis); double yield = Yield.YIELD(liquidacion, vencimiento, tasa, precio, 100, frecuencia, basis);
Referencias
[http://www.mit.edu/~mbarker/formula1/f1help/05-n-s33.htm]
[http://office.microsoft.com/en-us/excel-help/price-HP005209219.aspx]
[http://www.randombitsofcode.com/implementing-the-excel-yield-function-in-c-net/]
[http://office.microsoft.com/en-sg/excel-help/yield-HP005209345.aspx]
[http://officeimg.vo.msecnd.net/en-sg/files/231/514/ZA006051269.gif]
[http://www.mit.edu/~mbarker/formula1/f1help/images/05-n-27a.gif]
[http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton]
[http://upload.wikimedia.org/math/4/1/c/41cb7e4f10c06202b86e92c9e1125a81.png]
[http://www.derivative-calculator.net/]
[http://www.randombitsofcode.com/wp-content/uploads/2014/05/PriceFirstDerivative1-1024×307.png]