2 votos

QuantLib-Python: ¿Cómo establecer fechas de referencia fijas cuando se realiza el bootstrapping de la estructura temporal?

Tomo prestado un ejemplo de la sección 7 del "Quantlib Python Cookbook" para plantear mi pregunta. Para que el punto sea lo más claro posible simplifico un poco el código. El objetivo es quitar la curva EONIA de las comillas OIS.

La inicialización no es para cuestionar:

%%capture
%pylab inline --no-import-all
import math
import numpy
import utils
import matplotlib.pyplot as plt

from QuantLib import *
today = Date(11, December, 2012)
Settings.instance().evaluationDate = today

Una lista de OISRateHelper s de la que se desprenderá la estructura de plazos. El "2" indica al objeto ayudante que las comillas corresponden a contratos que comienzan dentro de +2 días.

helpers = [ OISRateHelper(2, Period(*tenor),      
         QuoteHandle(SimpleQuote(rate/100)), eonia)
         for rate, tenor in [(0.002, (15,Months)), (0.008, (18,Months)),
                             (0.021, (21,Months)), (0.036, (2,Years)),
                             (0.127, (3,Years)), (0.274, (4,Years)),
                             (0.456, (5,Years)), (0.647, (6,Years)),
                             (0.827, (7,Years)), (0.996, (8,Years)),
                             (1.147, (9,Years)), (1.280, (10,Years)),
                             (1.404, (11,Years)), (1.516, (12,Years)),
                             (1.764, (15,Years)), (1.939, (20,Years)),
                             (2.003, (25,Years)), (2.038, (30,Years))] ]

A continuación, el bootstrapping se realiza mediante

eonia_curve = PiecewiseLogCubicDiscount(0, TARGET(), helpers, Actual365Fixed() ) 

El "0" inicial indica al algoritmo de bootstrapping que la fecha de referencia de la estructura temporal debe estar en la fecha previamente definida evaluationDate .

No quiero que mi objeto de estructura temporal cambie su fecha de referencia más adelante cuando cambie la fecha de evaluación. Así que he intentado llamar a

eonia_curve = PiecewiseLogCubicDiscount(today, TARGET(), helpers, Actual365Fixed() ) 

lo que me pareció muy natural. Pero resultó: NotImplementedError: Número o tipo de argumentos incorrectos para la función sobrecargada 'new_PiecewiseLogCubicDiscount'.

Pregunta: ¿Cómo podría corregir la línea de código anterior para arrancar con una fecha de referencia fija?

Nota al margen: En la sección 5 del libro mencionado, el autor discutió la diferencia de las fechas de referencia fijas y no fijas. Sin embargo, el código que utilizó no me ayudó realmente, porque la fecha no se especificó explícitamente, sino que se tomó de una estructura de plazo anterior despojada.

# curve1 is an allready stripped term structure object
dates, rates = zip(*curve1.nodes())

# first date is taken as reference date
curve2 = ForwardCurve(dates, rates, Actual360())

Sin embargo, no quiero llamar al algoritmo de arranque dos veces: una con la fecha de evaluación como fecha de referencia y una segunda vez con today como fecha de referencia.

Muchas gracias, Bernd

1voto

tralston Puntos 76

Para construir un PiecewiseLogCubicDiscount con una fecha de referencia fija, utilice el siguiente constructor:

PiecewiseLogCubicDiscount(reference_date, helpers, day_counter, ...)

Tomando su ejemplo:

eonia_curve = PiecewiseLogCubicDiscount(Date(15, December, 2012), helpers, Actual365Fixed())
eonia_curve.referenceDate()
# result: Date(15,12,2012)

Cómo puede llegar a este resultado usted mismo:

Si utilizas un constructor que no existe, o que no está SWIGed, entonces obtendrás el mensaje NotImplementedError que suele listar las implementaciones disponibles, y en tu caso, puedes ver en esta lista la que estás buscando. Por ejemplo:

PiecewiseLogCubicDiscount()
#NotImplementedError: Wrong number or type of arguments for overloaded function 'new_PiecewiseLogCubicDiscount'.
# Possible C/C++ prototypes are:
# ...
# PiecewiseLogCubicDiscountPtr::PiecewiseLogCubicDiscountPtr(Date const &,std::vector< boost::shared_ptr< RateHelper >,std::allocator< boost::shared_ptr< RateHelper > > > const &,DayCounter const &)

También podría comprobar lo que está disponible o no en los archivos de la interfaz de SWIG:

  1. Consulte curva de rendimiento de la pieza.i en el proyecto QuantLib-SWIG. En concreto, las líneas 46 y 110.

     46: %define export_piecewise_curve(Name,Base,Interpolator)
    110: export_piecewise_curve(PiecewiseLogCubicDiscount,Discount,MonotonicLogCubic);

    Esto demuestra que PiecewiseLogCubicDiscount es un PiecewiseYieldCurve con Base = Discount y Interpolator = MonotonicLogCubic .

  2. Echa un vistazo a los constructores SWIGed. En las líneas 56 a 69, puedes encontrar el que estás buscando. Toma los siguientes argumentos:

    • Fecha de referencia: const Date& referenceDate
    • Valorar a los ayudantes : const std::vector<boost::shared_ptr<RateHelper> >& instruments
    • Contador de días : const DayCounter& dayCounter
    • Argumentos opcionales saltos, jumpDates, precisión e interpolador.

1 votos

Estimado byouness, gracias por su extensa respuesta. Ha dejado muy clara la cuestión. Debo admitir que también es muy razonable que la función de extracción no quiera recibir un objeto calendario. Si no necesita añadir días de liquidación adicionales, tampoco necesita conocer el calendario.

0voto

Daniel Goldberg Puntos 131

Pruebe ql.Date(dd,mm,yyyy) en lugar de Date(dd,mm,yyyy). Debería solucionar tu problema. Yo uso el anterior "hoy" y no hay problema.

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