Python 在QuantLib中处理CMS Pricer时出错

Python 在QuantLib中处理CMS Pricer时出错,python,quantlib,Python,Quantlib,我一直在试图用QuantLib为CmsRateBond定价。 下面是我运行print(ql.as_息票(bond.cashflows()[-2]).rate()时发生的错误 如果我没有弄错的话,我可以通过包含一个pricer(ql.cmscoponpricer?)来解决这个问题。不幸的是,我在web/python食谱中没有找到任何关于CMS债券的有用信息。 我将代码复制到下面(从csv文件导入向量即期汇率、远期): 将QuantLib作为ql导入 发布日期=ql.date(2013年4月4日)

我一直在试图用QuantLib为CmsRateBond定价。 下面是我运行
print(ql.as_息票(bond.cashflows()[-2]).rate()时发生的错误

如果我没有弄错的话,我可以通过包含一个pricer(ql.cmscoponpricer?)来解决这个问题。不幸的是,我在web/python食谱中没有找到任何关于CMS债券的有用信息。 我将代码复制到下面(从csv文件导入向量即期汇率、远期):

将QuantLib作为ql导入
发布日期=ql.date(2013年4月4日)
到期日=ql.date(2025年4月4日)
浮动息票日数=ql.实际值360()
浮动息票期=ql.period(“1Y”)
quotedMargin=0.0195
面金额=100.0
上次浮动利率=-0.000149
结算日=2天
#估价日期
计算日期=ql.date(14、12、2020)
ql.Settings.instance().evaluationDate=计算日期
#贴现曲线
贴现曲线=ql.zeroccurve(
现场约会,
即期汇率,
ql.ActualActual(),
)
贴现曲线句柄=ql.YieldTermStructureHandle(贴现曲线)
#预测曲线
预测曲线=ql.ForwardCurve(日期、远期、浮动息票日数)
#索引
索引=ql.EuriborSwapIsdaFixA(
ql.Period(“10Y”),ql.YieldTermStructureHandle(预测曲线)
)
#时间表
时间表=ql.时间表(
发行日期:,
到期日,
秋林期(“1年”),
index.fixingCalendar(),
ql.ModifiedFollowing,
ql.ModifiedFollowing,
ql.DateGeneration.Backward,
假,,
)
#CMS债券
bond=ql.CmsRateBond(
结算日,
面值,
日程
指数
index.dayCounter(),
ql.未经调整,
fixingDays=索引。fixingDays(),
负债率=[1],
价差=[quotedMargin],
上限=[],
楼层=[0],
)
#加上最后的固定利率
固定日期=[
映射中cf的cf.fixingDate()(ql.as_浮动利率_息票,债券.现金流()[:-1])
]
缺少固定日期=列表(筛选器(lambda x:x<计算日期,固定日期))[-1]
index.addFixing(缺少固定日期、上次浮动利率)
打印(ql.as_优惠券(bond.cashflows()[-2]).rate())#运行时错误:未设置价格
我使用的是通过pip安装的QuantLib 1.19

我想核实一下优惠券。你能帮我一下并提供测试代码所需的代码吗?
谢谢。

首先,您必须设置cms价格。您可以查看SWIG测试()

下面是一个简单的例子:

volQuote = ql.QuoteHandle(ql.SimpleQuote(0.2))
swaptionVol = ql.ConstantSwaptionVolatility(0, ql.TARGET(), ql.ModifiedFollowing, volQuote, ql.Actual365Fixed())
swvol_handle = ql.SwaptionVolatilityStructureHandle(swaptionVol)

mean_reversion = ql.QuoteHandle(ql.SimpleQuote(0.01))
cms_pricer = ql.LinearTsrPricer(swvol_handle, mean_reversion)
然后,您可以将该价格分配给债券息票:

ql.setCouponPricer(bond.cashflows(), cms_pricer)

谢谢大卫的澄清。我成功地分配了一个pricer,但是遇到了以下问题:RuntimeError:forward+displacement(-0.00161908+0)必须为正。是否可以在ql.ConstantSwaptionVolatility中添加位移?如果是这样的话,你能调整你的答案以考虑位移吗?或者你建议一种不同的方法?多亏了advanceI,我通过在ConstantSwaptionVolatility公式中添加volatityType(ShiftedLognormal)和正移位,解决了负利率问题。非常感谢。
volQuote = ql.QuoteHandle(ql.SimpleQuote(0.2))
swaptionVol = ql.ConstantSwaptionVolatility(0, ql.TARGET(), ql.ModifiedFollowing, volQuote, ql.Actual365Fixed())
swvol_handle = ql.SwaptionVolatilityStructureHandle(swaptionVol)

mean_reversion = ql.QuoteHandle(ql.SimpleQuote(0.01))
cms_pricer = ql.LinearTsrPricer(swvol_handle, mean_reversion)
ql.setCouponPricer(bond.cashflows(), cms_pricer)