QuantLib引导南非IRS平价收益率报错:参数数量或类型错误
问题排查与修正
核心错误点分析
Helpers列表嵌套问题
你的helpers当前是嵌套结构(包含单个DepositHelper、FRA列表、Swap列表),但PiecewiseFlatForward要求传入一维的RateHelper对象列表。用extend()替代append()添加FRA和Swap的helper列表,才能将元素逐个并入helpers。FRARateHelper参数错误
FRARateHelper的第二个参数是起始期限(月数),第三个参数是FRA的期限长度(月数),而非结束期限。你当前传的是start和end,需改为start和end - start(比如3x6的FRA,start=3,length=3)。利率值缩放错误
你的fra_mid和curve["Rates"]已经是小数形式(比如0.079代表7.9%),但代码中做了mid/100,导致利率被错误缩小100倍,直接破坏曲线引导逻辑,需移除/100操作。冗余的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
相关产品推荐
相关产品推荐

