3 votos

Función Excel YIELD equivalente en python Quantlib

Estoy luchando por conseguir un equivalente de la función YIELD de Excel utilizando Quantlib en python. Como se puede ver en la documentación de Excel sobre YIELD aquí sólo se necesitan unos pocos parámetros en comparación con este ejemplo que utiliza Quantlib http://gouthamanbalaraman.com/blog/quantlib-bond-modeling.html

ACTUALIZACIÓN:

Además, si utilizo la función bondYield, no consigo obtener los mismos valores que en Excel. Tomemos por ejemplo este bono:

enter image description here

el RENDIMIENTO anterior tiene la fórmula =YIELD(B1,B2,B3/100,B4,100,2,1)*100 . El rendimiento es 1.379848 .

Si intento configurar parámetros similares en Quantlib, como se muestra a continuación

# ql.Schedule
calendar = ql.UnitedStates()
bussinessConvention = ql.ModifiedFollowing
dateGeneration = ql.DateGeneration.Backward
monthEnd = False
cpn_freq = 2
issueDate = ql.Date(30, 9, 2014)
maturityDate = ql.Date(30, 9, 2019)
tenor = ql.Period(cpn_freq)
schedule = ql.Schedule(issueDate, maturityDate, tenor, calendar, bussinessConvention,
                       bussinessConvention, dateGeneration, monthEnd)

# ql.FixedRateBond
dayCounter = ql.ActualActual() 
settlementDays = 1
faceValue = 100
couponRate = 1.75 / 100
coupons = [couponRate]
fixedRateBond = ql.FixedRateBond(settlementDays, faceValue, schedule, coupons, dayCounter)

# ql.FixedRateBond.bondYield
compounding = ql.Compounded
cleanPrice = 100.7421875
fixedRateBond.bondYield(cleanPrice, dayCounter, compounding, cpn_freq) * 100

Esto da un rendimiento de 1.3784187000852273 que se aproxima, pero no es el mismo que el que da la función de Excel.

5voto

Brad Tutterow Puntos 5628

Su pregunta está más o menos contestada en Cómo calcular el rendimiento de los bonos en QuantLib - Python . Una vez que hayas construido el objeto bono de tipo fijo (como en el post que enlazaste) puedes llamar a

fixedRateBond.bondYield(targetPrice, day_count, compounding, frequency)

Comparando lo anterior con la interfaz de Excel en su enlace, targetPrice es pr , frequency es la frecuencia como en Excel, y day_count es basis . Los demás parámetros (vencimiento, liquidación, etc.) van en la definición del bono.

Esto le permitirá saltarse la parte del post de Goutham que trata de la definición de la curva al contado y los motores de precios. Sin embargo, no tendrá algo tan sencillo como la fórmula de Excel. Esto se debe a que la definición del bono tiene que incluir bastantes parámetros de la vida real (como por ejemplo: ¿debemos ajustar el inicio y el final de los cupones a un día laborable cuando caen en fin de semana o en festivo? Si es así, ¿cómo? ¿Qué calendario debemos utilizar para decidir qué días son festivos? ¿Queremos que el rendimiento se componga de forma continua?)

Si quieres evitar esto, puedes elegir los valores por defecto que tengan sentido para ti y envolver los cálculos en una interfaz más simple que puedas llamar.

0 votos

Gracias @luigi-ballabio, eso es útil, aunque intento configurar esto y veo diferencias en los valores para los mismos parámetros de los bonos según mi post actualizado más arriba - ¿puedes por favor echar un vistazo a mi actualización y decirme si puedes detectar algo que me ayude a igualar el resultado de excel? El resultado de Excel es el mismo que el resultado de la "convención de la calle" en Bloomberg... ¡gracias!

1 votos

Esto empieza a ser una cuestión diferente. De todos modos, las dos cosas que se me ocurren son: (1) hay tres convenciones de acto/acto diferentes; comprueba que estás usando la correcta; (2) imprime fixedRateBond.settlementDate() para comprobar que es la que espera; si no es así, puede que tenga que ajustar la fecha de evaluación o el número de días de liquidación. Si ninguna de las dos cosas ayuda, por favor envíe un mensaje a la lista de correo de quantlib. Me temo que este no es el lugar adecuado para depurar scripts...

0 votos

Gracias @luigi-ballabio, al establecer el valor de settlementDays para que settlementDate coincida con el valor de excel, parece que casi coincide con el punto.

2voto

maxfridbe Puntos 586

Te están votando a la baja por hacer una mala pregunta. Voy a explicar por qué la pregunta es mala.

Su enlace a la documentación de Excel tiene la especificación completa de lo que hace YIELD.

Si hay un periodo de cupón o menos hasta el reembolso, el RENDIMIENTO se se calcula de la siguiente manera:

(imagen aquí; mire su enlace) donde:

A = número de días desde el inicio del periodo del cupón hasta la fecha de liquidación (días acumulados).

DSR = número de días desde la fecha de liquidación hasta la fecha de reembolso.

E = número de días del periodo del cupón.

Si hay más de un periodo de cupón hasta el reembolso, el RENDIMIENTO se calculado a través de un centenar de iteraciones. La resolución utiliza el método Newton, basado en la fórmula utilizada para la función PRECIO. El rendimiento se modifica hasta que el precio estimado dado el rendimiento se aproxime al precio.

Por lo tanto: si hay un periodo de cupón, se tiene una fórmula explícita.

Si no es así, hay que aplicar la ecuación PRICE ( Documentación en Excel ) y obtener $yield$ tal que

$$PRICE(yield,\theta) = yield $$

donde $\theta$ es un vector con los demás parámetros. Ahora, usted podría hacer esto de dos maneras:

  • Implementar una rutina numérica personalizada. Excel lo hace con el método de Newton, pero podrías probar la iteración en punto fijo (después de hacer algunos cálculos y verificar que el PRECIO satisface las condiciones del teorema de la contracción del mapa.

  • Si esto le parece difícil: utilice scipy.optimize.root (que podrías haber descubierto buscando en Google "python function root". Observe que esta función resuelve la ecuación $f(x)=0$ Así que quieres alimentarlo $PRICE(yield,\theta)-yield$

Así que en resumen: todo lo que tienes que hacer es:

1) Implementar YIELD para un período de cupón o menos, como se detalla en la documentación de Excel 2) Implementar PRICE como se detalla en la documentación de Excel; y 3) Utilizar Python para la búsqueda de raíces.

Esto podría llevarte una buena media hora de codificación, pero oye, estás aprendiendo.

2 votos

O bien, podría encontrar la función correspondiente en QuantLib, que es una biblioteca para cálculos financieros. Que es lo que está pidiendo :)

0 votos

Sin embargo, tu comentario sobre hacer esto para aprender es válido.

0 votos

@user8948 gracias por tu explicación, pero mi pregunta era cómo implementar esta función en Quantlib, no en excel. Sé cómo hacer esto en excel, pero estoy teniendo algunas diferencias en el resultado de quantlib vs el resultado de excel, y esto es probablemente debido a las convenciones y los valores por defecto utilizados por YIELD en excel frente a los parámetros y valores por defecto de Quantlib

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