簡體   English   中英

使用Python在quantlib中定價浮動債券

[英]Pricing a Floating Bond in quantlib using Python

我試圖使用Quantlib(v1.2)SWIG包裝器在python中為一個非常基本的浮動利率債券定價。 我修改了文檔中包含的示例。

我的債券有4年的到期期限。 libor設定為10%,債券的差價為0.我的問題是,如果我以10%的比率打折,為什么債券的PV不是100? 我的值為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()

優惠券價格使用USDLibor日計數器(即實際/ 360)固定,該計數器與您提供的付款日計數器(30/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類的適當實例來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM