2013-03-07 119 views
5

我试图在使用Quantlib(v1.2)SWIG包装器的python中定价非常基本的浮动利率债券。我修改了文档中包含的示例。使用Python为quantlib中的浮动债券定价使用Python

我的债券有4年的到期日。 libor设置为10%,债券的价差为0.我的问题是,如果我以10%的利率贴现,为什么不是债券100的PV?我得到99.54的值。

谢谢!

from QuantLib import * 

frequency_enum, settle_date = 4, Date(5, 1, 2010) 
maturity_date = Date(5, 1, 2014) 
face_amount = 100.0 
settlement_days = 0 
fixing_days = 0 

calendar = NullCalendar() 
settle_date = calendar.adjust(settle_date) 
todays_date = calendar.advance(settle_date, -fixing_days, Days) 
Settings.instance().evaluationDate = todays_date 

rate = 10.0/100.0 

flat_forward = FlatForward(settle_date, 
          rate, 
          Thirty360(), 
          Compounded, 
          frequency_enum) 

discounting_term_structure = RelinkableYieldTermStructureHandle(flat_forward) 
index_term_structure = RelinkableYieldTermStructureHandle(flat_forward) 

index = USDLibor(Period(3, Months), index_term_structure) 

schedule = Schedule(settle_date, 
        maturity_date, Period(frequency_enum), 
        NullCalendar(), 
        Unadjusted, Unadjusted, 
        DateGeneration.Forward, False) 

floating_bond = FloatingRateBond(settlement_days, 
           face_amount, 
           schedule, 
           index, 
           Thirty360(), 
           Unadjusted, 
           fixing_days, 
           [], # Gearings 
           [0], # Spreads 
           [],  # Caps 
           [],  # Floors 
           False, # Fixing in arrears 
           face_amount, 
           settle_date) 

bond_engine = DiscountingBondEngine(discounting_term_structure) 
floating_bond.setPricingEngine(bond_engine) 

# coupon pricers 
pricer = BlackIborCouponPricer() 

volatility = 0.0 
vol = ConstantOptionletVolatility(settlement_days, 
            calendar, 
            Unadjusted, 
            volatility, 
            Thirty360()) 

pricer.setCapletVolatility(OptionletVolatilityStructureHandle(vol)) 
setCouponPricer(floating_bond.cashflows(), pricer) 

print floating_bond.NPV(), floating_bond.cleanPrice(), floating_bond.dirtyPrice() 

回答

4

不你提供的付款天数计数器(30/360),匹配率使用USDLibor日计数器固定的优惠券(即实际/ 360)。您可以通过检查优惠券看出来:

cfs = floating_bond.cashflows() 
coupons = [ as_coupon(c) for c in cfs[:-1] ] # the last one is the redemption 
print [ (c.rate(), c.accrualPeriod()) for c in coupons ] 

,让你T = 0.25为所有的优惠券,但低于10%的利率。

要得到您想要的价格,您必须符合利率和应计期。一种方法是通过Actual360()作为债券日计数器,在我的机器上给出100.002的价格(我还没有进一步调查,但这种差异可能是由于LIBOR修复的结束日期,美元日历并且可能不完全匹配优惠券的末尾)。另一种方法是创建一个内部30/360天计数器的定制LIBOR指数;我自己并没有尝试过,但可以通过创建IborIndex类的适当实例来完成。

+2

非常感谢。我创建了一个自定义索引,我得到了100.0的确切结果!自定义索引是:'index = IborIndex('USD Libor',Period(3,Months),settlement_days,USDCurrency(),NullCalendar(),Unadjusted,False,Thirty360(),index_term_structure)' – ducky 2013-03-08 20:52:56