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

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的调用方式有误,应该是类方法调用而非属性访问。

具体修复步骤

  1. 取当前行单个值:利用itertuples()返回的data对象,获取循环迭代到的当前行数据,比如n = data.days而非df['days']
  2. 修正日期获取:将start = ql.Date().todaysDate改为start = ql.Date.todaysDate()(调用类方法)
  3. 类型转换合规:将读取的数值转换为QuantLib要求的类型(如整数、浮点数)
  4. 存储计算结果:添加列表存储每只债券的久期,最终存入原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:18:29