在Python中使用QuantLib定价浮动债券
我正在用Python和Quantlib(v1.2)这个工具来计算一个非常简单的浮动利率债券的价格。我修改了文档里提供的示例。
我的债券到期时间是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()
1 个回答
7
优惠券的利率是用美元LIBOR的计息方式来固定的(也就是实际天数/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的结束日期是根据美元日历来确定的,可能和优惠券的结束日期不完全一致)。另一种方法是创建一个自定义的LIBOR指数,使用内部的30/360天计息方式;我自己还没尝试过,但你可以通过创建一个合适的IborIndex类的实例来实现。