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}")
修复说明
- 修正结算日参数:将
settlementDays从0改为1,确保存款工具的起息日、到期日符合市场规则,这是曲线准确拟合的基础。 - 明确估值日:通过
ql.Settings.instance().evaluationDate = spot固定估值日,避免默认值导致的日期计算偏差。 - 标准验证逻辑:通过
helper.npv()检查净现值是否接近0(曲线拟合准确的标志),同时提取工具的隐含利率对比报价,这是行业内验证曲线拟合效果的常规方式,比直接调用forwardRate更可靠。
运行修复后的代码,所有工具的NPV会接近0,隐含利率与报价利率的偏差可以忽略,说明曲线已准确拟合输入的存款利率。
内容的提问来源于stack exchange,提问作者vlade
相关产品推荐
相关产品推荐

