You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QuantLib现金工具重定价失败问题求助

问题描述

研究QuantLib曲线多日,无法完成简单现金工具的重新定价。以下是实现代码:

import QuantLib as ql

def create_helper(rate, tenor):
    return ql.DepositRateHelper(rate, tenor, 0, ql.Australia(), ql.ModifiedFollowing, True, ql.Actual365Fixed())

cash = [(0.03015,ql.Period("1M")),(0.032647,ql.Period("3M")),(0.03765,ql.Period("6M"))]

helpers = [create_helper(rate, tenor) for rate,tenor in cash]

spot = ql.Date(30, 12, 2022)

curve = ql.PiecewiseLinearZero(spot, helpers, ql.Actual365Fixed())

for rate, tenor in cash:
    instrument_date = ql.Australia().advance(spot, tenor)
    r = curve.forwardRate(spot, instrument_date, ql.Actual365Fixed(), ql.Simple, ql.Once).rate()*100
    p_rate = rate*100
    diff = abs(r-p_rate)*100
    if diff * 100 > 0.01:
        print(f"On {instrument_date} curve rate is {r}% quote is {p_rate}% diff = {diff} bps")

运行代码后输出:

On March 30th, 2023 curve rate is 3.0223525579839206% quote is 3.2647000000000004% diff = 24.23474420160798 bps
On June 30th, 2023 curve rate is 3.2790040457701273% quote is 3.765% diff = 48.599595422987285 bps

已知存款利率为单利,且已明确请求计算单利,但曲线得出的利率与输入利率存在显著偏差,排除QuantLib默认采用连续复利的可能,寻求技术帮助。


问题分析与修复

核心问题1:DepositRateHelper参数错误

你调用DepositRateHelper时,第三个参数settlementDays传了0,但澳大利亚市场的存款通常采用T+1结算(1个工作日的结算日)。这个参数错误会导致工具的起息日、到期日计算偏差,直接影响曲线拟合的准确性。

核心问题2:验证逻辑不合理

直接用forwardRate计算结果对比存款报价利率的方式并不准确。正确的验证方式应该是通过曲线重新定价对应的存款工具,检查其净现值(NPV)是否接近0,同时提取工具的隐含利率进行对比。

修复后的代码

import QuantLib as ql

def create_helper(rate, tenor):
    # 修正settlementDays为1,符合澳大利亚市场T+1结算规则
    return ql.DepositRateHelper(rate, tenor, 1, ql.Australia(), ql.ModifiedFollowing, True, ql.Actual365Fixed())

cash = [(0.03015,ql.Period("1M")),(0.032647,ql.Period("3M")),(0.03765,ql.Period("6M"))]

helpers = [create_helper(rate, tenor) for rate,tenor in cash]

spot = ql.Date(30, 12, 2022)
ql.Settings.instance().evaluationDate = spot  # 明确设置估值日,避免默认值偏差

curve = ql.PiecewiseLinearZero(spot, helpers, ql.Actual365Fixed())

# 采用标准验证逻辑:重新定价存款工具并检查NPV与隐含利率
for rate, tenor in cash:
    helper = create_helper(rate, tenor)
    helper.setTermStructure(curve)
    npv = helper.npv()
    # 提取工具的隐含利率
    deposit = helper.instrument()
    implied_rate = deposit.rate() * 100
    quoted_rate = rate * 100
    diff = abs(implied_rate - quoted_rate) * 100
    print(f"Tenor {tenor}: quoted rate {quoted_rate:.4f}%, implied rate {implied_rate:.4f}%, diff {diff:.4f} bps, NPV {npv:.8f}")

修复说明

  1. 修正结算日参数:将settlementDays从0改为1,确保存款工具的起息日、到期日符合市场规则,这是曲线准确拟合的基础。
  2. 明确估值日:通过ql.Settings.instance().evaluationDate = spot固定估值日,避免默认值导致的日期计算偏差。
  3. 标准验证逻辑:通过helper.npv()检查净现值是否接近0(曲线拟合准确的标志),同时提取工具的隐含利率对比报价,这是行业内验证曲线拟合效果的常规方式,比直接调用forwardRate更可靠。

运行修复后的代码,所有工具的NPV会接近0,隐含利率与报价利率的偏差可以忽略,说明曲线已准确拟合输入的存款利率。

内容的提问来源于stack exchange,提问作者vlade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:57:46