Visitas: 1  
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)

05-n-27a

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:

ZA006051269

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.

41cb7e4f10c06202b86e92c9e1125a81

Si derivamos la función de precio, el resultado que obtenemos es el siguiente:

PriceFirstDerivative1-1024x307

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]