Python计算JGB久期遇TypeError: new_Period参数错误求助
问题描述
我是一名金融分析师,同时是Python初学者。我需要逐行处理矩阵数据,计算433只日本国债(JGB)的久期,但运行代码时出现TypeError报错,无法解决,恳请提供解决建议。
运行代码
url = "https://github.com/nagamamo/JGB/blob/main/JGB2year.csv?raw=true" df = pd.read_csv(url) for data in df.itertuples(): n = df['days'] c = df['c'] r = df['r'] N = df['N'] start = ql.Date().todaysDate maturity = start + ql.Period(n, ql.Days) bond = ql.FixedRateBond(2, ql.TARGET(), N, start, maturity, ql.Period('1Y'), [c], ql.ActualActual()) rate = ql.InterestRate(r, ql.ActualActual(), ql.Compounded, ql.Annual) mod_duration = ql.BondFunctions.duration(bond, rate, ql.Duration.Modified)
报错信息
TypeError Traceback (most recent call last) <ipython-input-28-827e8eb02636> in <module>() 5 N = df['N'] 6 start = ql.Date().todaysDate ----> 7 maturity = start + ql.Period(n, ql.Days) TypeError: Wrong number or type of arguments for overloaded function 'new_Period'. Possible C/C++ prototypes are: Period::Period() Period::Period(Integer,TimeUnit) Period::Period(Frequency) Period::Period(std::string const &)
解决建议
核心问题
报错根源是循环内变量取值错误:你用df['days']、df['c']等获取的是整个DataFrame列(Series对象),但QuantLib的Period构造函数需要单个整数,FixedRateBond等方法也需要单个数值参数,而非批量的Series。另外,ql.Date().todaysDate的调用方式有误,应该是类方法调用而非属性访问。
具体修复步骤
- 取当前行单个值:利用
itertuples()返回的data对象,获取循环迭代到的当前行数据,比如n = data.days而非df['days'] - 修正日期获取:将
start = ql.Date().todaysDate改为start = ql.Date.todaysDate()(调用类方法) - 类型转换合规:将读取的数值转换为QuantLib要求的类型(如整数、浮点数)
- 存储计算结果:添加列表存储每只债券的久期,最终存入原DataFrame方便后续分析
修复后的完整代码
import pandas as pd import QuantLib as ql url = "https://github.com/nagamamo/JGB/blob/main/JGB2year.csv?raw=true" df = pd.read_csv(url) modified_durations = [] # 存储每只债券的修正久期 for data in df.itertuples(): # 获取当前行的单个数值,转换为对应类型 days_to_maturity = int(data.days) coupon_rate = float(data.c) yield_rate = float(data.r) notional = float(data.N) # 初始化起始日期和到期日期 valuation_date = ql.Date.todaysDate() maturity_date = valuation_date + ql.Period(days_to_maturity, ql.Days) # 构造固定利率债券对象 bond = ql.FixedRateBond( settlement_days=2, calendar=ql.TARGET(), face_amount=notional, issue_date=valuation_date, maturity_date=maturity_date, coupon_frequency=ql.Period('1Y'), coupons=[coupon_rate], day_counter=ql.ActualActual() ) # 构造利率对象并计算修正久期 interest_rate = ql.InterestRate( yield_rate, day_counter=ql.ActualActual(), compounding=ql.Compounded, frequency=ql.Annual ) mod_duration = ql.BondFunctions.duration(bond, interest_rate, ql.Duration.Modified) modified_durations.append(mod_duration) # 将计算结果合并到原数据中 df['modified_duration'] = modified_durations
内容的提问来源于stack exchange,提问作者NagaJPN
相关产品推荐
相关产品推荐

