2013-03-07 118 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