QuantLib Python を使用して、固定金利債券の価格を設定しました。
以前ql.ActualActual(ql.ActualActual.ISMA, schedule)
は、クーポンの支払い期間ごとにキャッシュフローが同じであることを確認していました。
割引のために、私ql.Actual360()
は日カウントの慣習として使用しました。
私のコードは次のとおりです。
import QuantLib as ql
valuationDate = ql.Date(30, 6, 2020)
ql.Settings.instance().evaluationDate = valuationDate
schedule = ql.Schedule(ql.Date(7, 5, 2016), ql.Date(15, 8, 2024), ql.Period(ql.Semiannual), ql.NullCalendar(), ql.Following, ql.Following, ql.DateGeneration.Forward, True)
fixedRateBond = ql.FixedRateBond(0, 100, schedule, [0.05], ql.ActualActual(ql.ActualActual.ISMA, schedule))
curve = ql.FlatForward(valuationDate, ql.QuoteHandle(ql.SimpleQuote(0.05)), ql.Actual360(), ql.Compounded)
handle = ql.YieldTermStructureHandle(curve)
bondEngine = ql.DiscountingBondEngine(handle)
fixedRateBond.setPricingEngine(bondEngine)
irr = fixedRateBond.bondYield(fixedRateBond.NPV(), ql.Actual360(), ql.Compounded, ql.Semiannual, valuationDate)
print('NPV:', fixedRateBond.NPV())
print('IRR:', irr)
print('Clean Price:', fixedRateBond.cleanPrice(irr, ql.Actual360(), ql.Compounded, ql.Semiannual, valuationDate))
print('Dirty Price:', fixedRateBond.dirtyPrice(irr, ql.Actual360(), ql.Compounded, ql.Semiannual, valuationDate))
print('Accrued Interest:', fixedRateBond.accruedAmount(ql.Date(30, 6, 2020)))
私が得る結果は次のとおりです。
NPV: 100.59728065053405
IRR: 0.04743504524230957
Clean Price: 100.59728133098947
Dirty Price: 101.3309769831634
Accrued Interest: 0.7336956521739156
私の知る限り、NPV はダーティ プライスと同じはずです。ただし、私が取り除くことができない小さな違いがあります。誰かが私が間違っていた場所を説明してくれたら幸いです。
そして、ダーティ プライスからクリーン プライスを差し引いて経過利子を手動で取得すると、答えは 0.7336956521739211 となり、QuantLib のaccruedAmount
関数とは少し異なります。誰かが私がどこで間違ったのか説明してもらえますか?
ありがとう。