簡體   English   中英

FixedRateBond class 對價格債券給出錯誤

[英]FixedRateBond class is giving error to price bond

我想為固定利率債券定價如下 -

import QuantLib as ql
import pandas as pd
import math

todaysDate = ql.Date(31, 8, 2019)
ql.Settings.instance().evaluationDate = todaysDate

## define available Spot rates

spotDates = [ql.Date(1,10,2019), ql.Date(1,11,2019), ql.Date(1,12,2019)]  
spotRates = [0.066682, 0.067199, 0.067502]  ### Compounded continuously

dayCount = ql.Actual365Fixed()
calendar = ql.UnitedStates()
interpolation = ql.Linear()
compounding = ql.Compounded
compoundingFrequency = ql.Continuous

spotCurve = ql.YieldTermStructureHandle(ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, interpolation, compounding, compoundingFrequency))

## Define Fixed rate bond with only one coupon payment at maturity

issueDate = todaysDate
maturityDate = ql.Date(1,11,2019)
businessConvention = ql.Following
monthEnd = False

dates = [maturityDate]
rolling_convention = ql.Following
schedule = ql.Schedule(dates, calendar, businessConvention)


dayCount = ql.Actual365Fixed()
couponRate = .05

settlementDays = 0
faceValue = 100
fixedRateBond = ql.FixedRateBond(settlementDays, faceValue, schedule, couponRate, dayCount, businessConvention, issueDate)

bondEngine = ql.DiscountingBondEngine(spotCurve)
fixedRateBond.setPricingEngine(bondEngine)

fixedRateBond.NPV()
print(fixedRateBond.NPV())

上述實施失敗; 我無法理解的原因。 在線生成fixedRateBond ,我得到以下錯誤 -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/QuantLib/QuantLib.py", line 15250, in __init__
    _QuantLib.FixedRateBond_swiginit(self, _QuantLib.new_FixedRateBond(*args))
TypeError: Wrong number or type of arguments for overloaded function 'new_FixedRateBond'.
  Possible C/C++ prototypes are:
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date,Calendar const &,Period const &,Calendar const &,BusinessDayConvention,bool)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date,Calendar const &,Period const &,Calendar const &,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date,Calendar const &,Period const &,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date,Calendar const &,Period const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real,Date)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,Real)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &,Calendar const &,Period const &,Calendar const &,BusinessDayConvention,bool)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &,Calendar const &,Period const &,Calendar const &,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &,Calendar const &,Period const &,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &,Calendar const &,Period const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real,Date const &)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention,Real)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Real,Schedule const &,std::vector< InterestRate,std::allocator< InterestRate > > const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool,Calendar const &,Period const &,Calendar const &,BusinessDayConvention const,bool)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool,Calendar const &,Period const &,Calendar const &,BusinessDayConvention const)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool,Calendar const &,Period const &,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool,Calendar const &,Period const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool,Calendar const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule,bool)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &,DateGeneration::Rule)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &,Date const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real,Date const &)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention,Real)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &,BusinessDayConvention)
    FixedRateBond::FixedRateBond(Integer,Calendar const &,Real,Date const &,Date const &,Period const &,std::vector< Rate,std::allocator< Rate > > const &,DayCounter const &

我期待價格應該是-

print(105*math.exp(-0.067199*dayCount.yearFraction(issueDate,maturityDate)))

任何指向正確方法的指針都將受到高度贊賞。

David Duarte 回復后的修改

現在,我為債券定價的新代碼集如下所示 -

import QuantLib as ql
import pandas as pd
import math

todaysDate = ql.Date(31, 8, 2019)
ql.Settings.instance().evaluationDate = todaysDate

spotDates = [ql.Date(1,10,2019), ql.Date(1,11,2019), ql.Date(1,12,2019)]  
spotRates = [0.066682, 0.067199, 0.067502]  ### Compounded continuously

dayCount = ql.Actual365Fixed()
calendar = ql.UnitedStates()
interpolation = ql.Linear()
compounding = ql.Compounded
compoundingFrequency = ql.Continuous

spotCurve = ql.YieldTermStructureHandle(ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, interpolation, compounding, compoundingFrequency))

issueDate = todaysDate
maturityDate = ql.Date(1,11,2019)
businessConvention = ql.Following
monthEnd = False

dates = [maturityDate]
rolling_convention = ql.Following
schedule = ql.Schedule(dates, calendar, businessConvention)
# pd.DataFrame({'date': list(schedule)})

dayCount = ql.Actual365Fixed()
couponRate = .05

settlementDays = 0
faceValue = 100
fixedRateBond = ql.FixedRateBond(settlementDays, calendar, faceValue, issueDate, maturityDate, ql.Period(ql.Once), [couponRate],dayCount)

bondEngine = ql.DiscountingBondEngine(spotCurve)
fixedRateBond.setPricingEngine(bondEngine)

fixedRateBond.NPV()

有了這個,我得到錯誤 -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/QuantLib/QuantLib.py", line 8767, in NPV
    return _QuantLib.Instrument_NPV(self)
RuntimeError: negative time (-0.0767123) given

知道為什么我會收到此錯誤嗎?

進一步修改以糾正負值錯誤:

基本上我添加了一個rate of 0來對應today's spot rate來定義spotCurve

import QuantLib as ql
import pandas as pd
import math

todaysDate = ql.Date(31, 8, 2019)
ql.Settings.instance().evaluationDate = todaysDate

spotDates = [todaysDate, ql.Date(1,10,2019), ql.Date(1,11,2019), ql.Date(1,12,2019)]  
spotRates = [0, 0.066682, 0.067199, 0.067502]  ### Compounded continuously

dayCount = ql.Actual365Fixed()
calendar = ql.UnitedStates()
interpolation = ql.Linear()
compounding = ql.Compounded
compoundingFrequency = ql.Continuous

spotCurve = ql.YieldTermStructureHandle(ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, interpolation, compounding, compoundingFrequency))

issueDate = todaysDate
maturityDate = ql.Date(1,11,2019)
businessConvention = ql.Following
monthEnd = False

dates = [maturityDate]
rolling_convention = ql.Following
schedule = ql.Schedule(dates, calendar, businessConvention)
# pd.DataFrame({'date': list(schedule)})

dayCount = ql.Actual365Fixed()
couponRate = .05

settlementDays = 0
faceValue = 100
fixedRateBond = ql.FixedRateBond(settlementDays, calendar, faceValue, issueDate, maturityDate, ql.Period(ql.Once), [couponRate],dayCount)

bondEngine = ql.DiscountingBondEngine(spotCurve)
fixedRateBond.setPricingEngine(bondEngine)

fixedRateBond.NPV()

但是我得到的值是99.68276963841888 我應該得到一個103.808278875的值,它來自這個計算 - 105*math.exp(-0.067199*dayCount.yearFraction(issueDate,maturityDate))

試試這個構造函數:

fixedRateBond = ql.FixedRateBond(settlementDays, calendar, faceValue, issueDate, maturityDate, ql.Period(ql.Once), [couponRate],dayCount)

更新:另外,如果您想要 5 的完整優惠券,您需要將發行日期提前一年調整,否則優惠券將是該天數的應計系數的 5% 倍。

檢查現金流量以了解我的意思:

for cf in fixedRateBond.cashflows():
    print(cf.date().ISO(), cf.amount())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM