【问题标题】:Quantlib bootstrapping error, convergence not reached after 99 iterationsQuantlib 引导错误,99 次迭代后未达到收敛
【发布时间】:2023-03-13 06:49:02
【问题描述】:

尝试使用以下来自彭博社的数据构建澳元的即期收益率曲线,RBACOR 指数澳大利亚储备银行银行间隔夜现金利率 0.03 ADBB1M 1m 银行票据 0.005 ADBB2M 2m 银行票据 0.015 ADBB3M 3m 银行票据 0.015 数据为从上周五 2021 年 8 月 13 日开始,但是下面的代码返回错误 RuntimeError:99 次迭代后未达到收敛;最后改进 4.45714e-05,要求精度 1e-12。我可以将精度降低到 1e-04 来完成这项工作,但想检查这里出了什么问题?看起来 100 万美元的银行票据利率低得惊人,而隔夜现金利率却太高了。欢迎/赞赏任何帮助/cmets。

dateStr = '2021-07-30'
pricingDate = ql.DateParser.parseFormatted(dateStr, '%Y-%m-%d')

depoHelpers = []
depoHelpers.append(ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.03/100)),
                                        ql.Period(1, ql.Days),
                                        2,
                                        ql.Australia(),
                                        ql.ModifiedFollowing,
                                        False,
                                        ql.Actual365Fixed()))


depoHelpers.append(ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.0051/100)),
                                        ql.Period('1M'),
                                        2,
                                        ql.Australia(),
                                        ql.ModifiedFollowing,
                                        False,
                                        ql.Actual365Fixed()))

depoHelpers.append(ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.015/100)),
                                        ql.Period('2M'),
                                        2,
                                        ql.Australia(),
                                        ql.ModifiedFollowing,
                                        False,
                                        ql.Actual365Fixed()))

depoHelpers.append(ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.015/100)),
                                        ql.Period('3M'),
                                        2,
                                        ql.Australia(),
                                        ql.ModifiedFollowing,
                                        False,
                                        ql.Actual365Fixed()))

yieldcurve = ql.PiecewiseLogCubicDiscount(pricingDate,
                                      depoHelpers,
                                      ql.Actual360())

yieldcurve.enableExtrapolation()
yieldcurve.dates()

【问题讨论】:

  • 你确实有一条非常扭曲的曲线,混合了现货 OIS 和票据收益率:从 3 个基点开始,下降到 0.5 个基点,回到 1.5 个基点,然后持平。我原以为任何方法都难以在如此压缩的时期内适应这么多的转折点。 1m -> 6m OIS 利率持平于 3bp。您使用票据收益率的任何原因? (参见德国同样的情况:EONIA(即现货 OIS)在 -48bp,但 1m Bubil 在 -70bp 左右。)。您是否正在尝试构建债券或掉期收益率曲线?
  • 我正在尝试为澳元建立贴现曲线
  • 如果您尝试构建澳元 OIS 贴现曲线,您可能会更好地使用 1m 到 6m 的 OIS 费率,例如 ADSOA Curncy(对于 1m)到 ADSOF Curncy(对于 6m)。也就是说,我不是澳元短线专家,因此其他人可能对此有所不同。如果您愿意使用 ICAP 定价,您可以指定 IAUS 来源(例如“ADSOA IAUS 货币”)。
  • 好的,谢谢。会看看。
  • 实际上,我刚刚尝试使用 ADSOA、ADSOB、ADSOC 作为 1m、2m、3m,截至 8 月 13 日,它们的值相同为 0.028。然后加上截至 8 月 13 日值为 0.03 的 RBACOR 指数,我仍然有收敛错误。

标签: bootstrapping quantlib


【解决方案1】:

对于大多数插值,移动节点仅对最近的间隔有影响。相反,在三次(或对数三次)插值中,移动节点会对整条曲线产生影响。

这意味着,随着引导过程在日期上循环,添加新节点可能会导致早期工具不再准确重新定价。为避免这种情况,在使用三次插值时,会重复引导循环,直到节点收敛到重新定价所有工具的最终曲线。

在你的情况下,没有达到收敛。可能是您的节点数量较少且曲线过于受限,或者也可能与仅使用存款有关,而存款实际上并未使用插值。

使用具有不同插值的曲线,例如 ql.PiecewiseLogLinearDiscount,将避免额外的收敛循环和您遇到的错误。

【讨论】:

  • 谢谢,使用对数线性工作,虽然我想知道哪个更好,将收敛精度降低到 1e-05 或只使用对数线性插值方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2020-10-20
  • 2018-11-16
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多