Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python为quantlib中的浮动债券定价_Python_Quantlib_Quantlib Swig - Fatal编程技术网

使用Python为quantlib中的浮动债券定价

使用Python为quantlib中的浮动债券定价,python,quantlib,quantlib-swig,Python,Quantlib,Quantlib Swig,我试图使用Quantlib(v1.2)SWIG包装器在python中为一个非常基本的浮动利率债券定价。我修改了文档中包含的示例 我的债券期限为4年。伦敦银行同业拆借利率设定为10%,债券利差为0。我的问题是,如果我以10%的贴现率贴现,为什么债券的PV不是100?我得到的值是99.54 谢谢 from QuantLib import * frequency_enum, settle_date = 4, Date(5, 1, 2010) maturity_date = Date(5, 1, 20

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

我的债券期限为4年。伦敦银行同业拆借利率设定为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类实例来实现这一点。

非常感谢。我创建了一个自定义索引,得到了100.0的精确结果!自定义索引为:
index=IborIndex('USD Libor',期限(3个月),结算日,USDCurrency(),NullCalendar(),未调整,False,Thirty360(),索引期限结构)