4 votos

Cómo calcular el rendimiento de los bonos en QuantLib - Python

Quiero calcular el rendimiento de los bonos con el precio de mercado y los cupones. Intento replicar C++ de ( https://mhittesdorf.wordpress.com/2013/03/03/introducing-quantlib-internal-rate-of-return/ ) en Python pero sin éxito. ¿Cómo usar el solucionador de "bisección" en quantlib-python?

solver = ql.Bisection()
solver_max = 0.5
solver_min = 0.1
solver_maxEvaluations = 1000 
solution = solver.solve(?, solver_maxEvaluations, solver_min, solver_max)

No ImplementadoError: Número o tipo de argumentos incorrectos para la función sobrecargada "Bisection_solve".
Los posibles prototipos de C/C++ son:
Bisección::resolver(PyObjecto *,Real,Real,Real)
Bisección::resolver(PyObjecto *,Real,Real,Real,Real)

¿Cuál es el "Objeto Peyote" en este caso?

0 votos

Hola Kirill Dolmatov, ¡bienvenido a Quant.SE! Sin mirar el QuantLib por qué de hacer las cosas probablemente tiene sentido. Por qué no tratas de arreglar eso. Tal y como está la pregunta es: ¿hay otras formas? Que es bastante vaga y se puede responder con: Sí

0 votos

Tal vez sea más bien una cuestión de programación, pero creo que la API de QuantLib es el tema que nos ocupa.

0 votos

PYobject es sólo una envoltura para quantlib en Python.

8voto

Brad Tutterow Puntos 5628

En la llamada a Bisection.solve El signo de interrogación debe ser la función de Python cuyo cero quieres encontrar. En tu caso, debe ser algo que reproduzca la lógica de IRRSolver::operator() en el código de Mick Hittesdorf, es decir, algo así (que no he probado):

cashflows = fixedRateBond.cashflows()
npv = fixedRateBond.NPV()
def price_error_given_yield(rate):
    interestRate = InterestRate(rate, ActualActual(ActualActual.Bond),
                                Compounded, Annual)
    return CashFlows.npv(cashflows, interestRate, False) - npv

irr = solver.solve(price_error_given_yield, accuracy, guess, min, max)

La idea es que usted escriba una función que tome un rendimiento y le diga cuánto difiere el precio correspondiente del precio objetivo; el solucionador toma la función y devuelve su cero, es decir, el valor del rendimiento de entrada para el que el resultado (es decir, la diferencia con el precio objetivo) es cero.

Dicho esto, el enfoque de Mick es útil para fines educativos, pero duplica la funcionalidad que ya está disponible en el objeto bond. Todo lo que necesitas es llamar a

fixedRateBond.bondYield(targetPrice, ActualActual(ActualActual.Bond),
                        Compounded, Annual)

Sin embargo, hay que tener en cuenta que el targetPrice arriba debe ser el precio limpio, así que en su caso lo que se devuelve por fixedRateBond.cleanPrice() en lugar de fixedRateBond.NPV() .

0 votos

¿Tienes un ejemplo de cómo definir fixedRateBond para acceder a bondYield y cleanPrice ¿métodos? Cuando intento hacer esto yo mismo, da un error null price engine porque requiere establecer un motor, que también requiere definición... sin embargo, estoy más interesado en replicar la función YIELD de Excel aquí support.office.com/es-us/article/ que no requiere definir dicho motor ni la estructura de plazos de rendimiento...

1 votos

Es necesario utilizar la sobrecarga de bondYield que toma el precio limpio como entrada (es decir, bond.bondYield(price, day_count, compounding, frequency) ). Si utiliza la otra sobrecarga ( bond.bondYield(day_count, compounding, frequency) ) el bono intenta calcular el precio y, por tanto, necesita un motor.

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