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

QuantLib引导南非IRS平价收益率报错:参数数量或类型错误

问题排查与修正

核心错误点分析

  1. Helpers列表嵌套问题
    你的helpers当前是嵌套结构(包含单个DepositHelper、FRA列表、Swap列表),但PiecewiseFlatForward要求传入一维的RateHelper对象列表。用extend()替代append()添加FRA和Swap的helper列表,才能将元素逐个并入helpers。

  2. FRARateHelper参数错误
    FRARateHelper的第二个参数是起始期限(月数),第三个参数是FRA的期限长度(月数),而非结束期限。你当前传的是start和end,需改为start和end - start(比如3x6的FRA,start=3,length=3)。

  3. 利率值缩放错误
    你的fra_mid和curve["Rates"]已经是小数形式(比如0.079代表7.9%),但代码中做了mid/100,导致利率被错误缩小100倍,直接破坏曲线引导逻辑,需移除/100操作。

  4. 冗余的spot日期计算
    ql.SouthAfrica().advance(today, 0, ql.Days)等价于today,可直接用today作为spot日期。


修正后的完整代码

import QuantLib as ql
import pandas as pd

calendar = ql.SouthAfrica()
day_count = ql.Actual365Fixed()
settlementDays = 0
today = ql.Date(28, 2, 2023)
spot = today  # 简化日期计算

# 初始化JIBAR指数
index = ql.Jibar(ql.Period(3, ql.Months))

# 存款与Swap利率数据
term = list(range(10))
rates = [0.0795, 0.0808, 0.0828, 0.0851, 0.0873, 0.08925, 0.09085, 0.0921, 0.0941, 0.09535]
curve = pd.DataFrame(list(zip(term, rates)), columns=["Term", "Rates"])

# 存款Helper
deposit_helper = ql.DepositRateHelper(
    ql.QuoteHandle(ql.SimpleQuote(curve["Rates"][0])),
    ql.Period(3, ql.Months),
    settlementDays,
    calendar,
    ql.Unadjusted,
    False,
    day_count
)

# FRA数据与Helper(修正期限参数)
fra_start = [3, 6, 9, 12]
fra_end = [6, 9, 12, 15]
fra_mid = [0.079, 0.08005, 0.0802, 0.07985]
fra_curve = pd.DataFrame(list(zip(fra_start, fra_end, fra_mid)), columns=["Start", "End", "Rates"])

fra_helpers = [
    ql.FraRateHelper(
        ql.QuoteHandle(ql.SimpleQuote(mid)),
        start,
        end - start,  # 改为期限长度
        settlementDays,
        calendar,
        ql.ModifiedFollowing,
        False,
        day_count
    ) for mid, start, end in zip(fra_curve["Rates"], fra_curve["Start"], fra_curve["End"])
]

# Swap Helper(修正利率缩放)
swap_helpers = [
    ql.SwapRateHelper(
        ql.QuoteHandle(ql.SimpleQuote(mid)),
        ql.Period(start, ql.Years),
        calendar,
        ql.Quarterly,
        ql.ModifiedFollowing,
        day_count,
        index
    ) for mid, start in zip(curve["Rates"][1:], curve["Term"][1:])
]

# 构建一维Helper列表
helpers = []
helpers.append(deposit_helper)
helpers.extend(fra_helpers)
helpers.extend(swap_helpers)

# 生成收益率曲线
curve_yield = ql.PiecewiseFlatForward(spot, helpers, day_count)

# 验证示例:输出1年期远期利率
print("1年期远期利率:", curve_yield.forwardRate(spot, spot + ql.Period(1, ql.Years), day_count, ql.Simple).rate())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:35:07