2 votos

Bootstrapping de los tipos al contado a partir de los tipos swap con QuantLib

Estoy haciendo un bootstrap de la curva shibor y de la curva fr007 utilizando los tipos swap en China. He creado mi propio índice como el siguiente:

Shibor3M=IborIndex("Shibor3M",Period(3,Months),0,CNYCurrency(),
                    China(China.IB),Following,False,Actual360(),
                    discounting_curve)

y utilizando para el bootstrapping las tasas al contado. Y el código es:

today=Date(17,6,2019)
Settings.instance().evaluationDate = today
discounting_curve=RelinkableYieldTermStructureHandle()
forecasting_curve=RelinkableYieldTermStructureHandle()
quotes = [SimpleQuote(2.80763/100)]
#Shibor index
Shibor3M=IborIndex("Shibor-3M",Period(3,Months),0,
                   CNYCurrency(),China(China.IB), 
                   Following,False,Actual360(),
                   forecasting_curve)
depo_helper = [DepositRateHelper(
                   QuoteHandle(quotes[0]),Period(3,Months),0,China(China.IB),
                   Following,False,Actual360())]

swap_helpers = [ SwapRateHelper(QuoteHandle(SimpleQuote(rate/100.0)), Period(*tenor), China(China.IB),Quarterly,Following,Actual365Fixed(),Shibor3M())
        for tenor, rate in [((6,Months),2.985),((9,Months),3.0163),((1,Years),3.0475),((2,Years), 3.1638),
        ((3,Years), 3.2788),
        ((4,Years), 3.3813),
        ((5,Years), 3.4688),
        ((7,Years), 3.6175),((10,Years),3.765)] ]
rate_helpers=depo_helper+swap_helpers
curve1=PiecewiseCubicZero(today,rate_helpers,Actual360)
spots = []
tenors = []
for d in curve1.dates():
    yrs=Actual360.yearFraction(today,d)
    compounding=Simple
    freq=Quarterly
    zero_rate=curve1.zeroRate(yrs,compounding,freq)
    tenors.append(yrs)
eq_rate=zero_rate.equivalentRate(Actual360,compounding,freq,today,d).rate()
spots.append(100*eq_rate)
datatable={'Dates':curve1.dates(),'Tenors':tenors,'spots':spots}
df=pd.DataFrame.from_dict((datatable))

Pero no puedo obtener el resultado. ¿Puede alguien ayudarme? Gracias.

1voto

Chris Mc Puntos 31

Hay algunos errores en su código:

  1. Has creado un objeto índice y has apuntado a él con una variable, por lo que debes utilizarlo como Shibor3M y no Shibor3M() es decir, una vez creado el índice no se puede llamar
  2. Cada vez que se utiliza la clase daycounter Actual360 hay que llamarla, es decir Actual360()

Prueba esto:

today=Date(17,6,2019)
Settings.instance().evaluationDate = today
discounting_curve=RelinkableYieldTermStructureHandle()
forecasting_curve=RelinkableYieldTermStructureHandle()
quotes = [SimpleQuote(2.80763/100)]
#Shibor index
Shibor3M=IborIndex("Shibor-3M",Period(3,Months),0,
                   CNYCurrency(),China(China.IB), 
                   Following,False,Actual360(),
                   forecasting_curve)
depo_helper = [DepositRateHelper(
                   QuoteHandle(quotes[0]),Period(3,Months),0,China(China.IB),
                   Following,False,Actual360())]

swap_helpers = [ SwapRateHelper(QuoteHandle(SimpleQuote(rate/100.0)), Period(*tenor), China(China.IB),Quarterly,Following,Actual365Fixed(),Shibor3M)
        for tenor, rate in [((6,Months),2.985),((9,Months),3.0163),((1,Years),3.0475),((2,Years), 3.1638),
        ((3,Years), 3.2788),
        ((4,Years), 3.3813),
        ((5,Years), 3.4688),
        ((7,Years), 3.6175),((10,Years),3.765)] ]
rate_helpers=depo_helper+swap_helpers
curve1=PiecewiseCubicZero(today,rate_helpers,Actual360())
spots = []
tenors = []
for d in curve1.dates():
    yrs=Actual360().yearFraction(today,d)
    compounding=Simple
    freq=Quarterly
    zero_rate=curve1.zeroRate(yrs,compounding,freq)
    tenors.append(yrs)
    eq_rate=zero_rate.equivalentRate(Actual360(),compounding,freq,today,d).rate()
    spots.append(100*eq_rate)
datatable={'Dates':curve1.dates(),'Tenors':tenors,'spots':spots}
df=pd.DataFrame.from_dict((datatable))

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