python - 使用 Python 在 quantlib 中为 float 债券定价

标签 python quantlib quantlib-swig

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

我的债券期限为 4 年。 libor 设置为 10%,债券利差为 0。我的问题是,如果我以 10% 的利率贴现,为什么债券的现值不是 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 类的适当实例来实现。

关于python - 使用 Python 在 quantlib 中为 float 债券定价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273797/

相关文章:

r - 无法让 RQuantLib 在 osx 10.9.4 下与brew安装的 quantlib 一起使用

python - 使用 QuantLib 计算 FloatingRateBond 的现金流量

c# - 从 C# 调用 QuantLib 方法的最佳方式是什么

python - Airflow GKEPodOperator xcom_push 返回 None

python - 更新 Dash 中多个绘图的绘图

python - 后台Twisted服务器的模式,该服务器填充了传入消息队列并清空了传出消息队列?

c++ - 从多线程使用 QuantLib 的正确方法是什么?

c# - Swig c++/c# 不断获取 "Type Initialized Exception"

python - Python 中的 QuantLib cpibond 债券示例

python - 如何在每次插入和删除值时更改 Python tkinter Entry 小部件中的光标位置