10

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()
4

1 に答える 1

7

クーポン レートは、USDLibor デイ カウンター (つまり、Actual/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% 未満になります。

希望の価格を得るには、レートと発生期間を一致させる必要があります。1 つの方法は、Actual360() を債券日カウンターとして渡すことです。これにより、私のマシンでは 100.002 の価格が得られます (これ以上調査していませんが、不一致は LIBOR 修正の終了日が原因である可能性があります。 USD カレンダーとクーポンの末尾が正確に一致しない場合があります)。もう 1 つの方法は、内部 30/360 日カウンターでカスタム LIBOR インデックスを作成することです。私はこれを自分で試したことはありませんが、IborIndex クラスの適切なインスタンスを作成することで実行できます。

于 2013-03-08T15:54:46.673 に答える