mcpField
F
fixed-income-mcp

fixed-income-mcp

本地服务
github.com/joselillotrax-cell金融数据26 周前更新

关于 fixed-income-mcp

fixed-income-mcp 为 AI Agent 提供固定票息债券定价与风险分析。它将解析计算与数值交叉核对及估值边界检查结合,帮助模型计算和审查债券数据,而非自行心算。

主要功能

  1. 01根据市场价格求收益率
  2. 02计算净价和全价
  3. 03计算久期、DV01 和凸性
  4. 04生成现金流计划
  5. 05比较冲击重估与近似值
  6. 06验证收益率及估值边界

适用场景

  1. 01根据报价计算到期收益率
  2. 02比较不同债券的利率风险
  3. 03测试利率冲击下的债券价格变化
  4. 04审查报价收益率是否合理

MCP 相关

向 MCP 客户端提供六种工具,用于债券定价、分析、现金流计划、情景冲击和一致性检查。结果包含验证状态和适用边界。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"joselillotrax-cell-fixed-income": {
"command": "uvx",
"args": [
"bondmath"
]
}
}
}
启动命令uvx bondmath

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypibondmath0.1.3

工具

6

收录的工具列表 · 更新于 2 周前

参数类型必填说明
ytm_pctnumber是名义年化到期收益率,以百分比表示,按票息频率复利。4.6867% 应传入 4.6867。
day_countenum否用于计提应计利息的日计数惯例。ACT/ACT ICMA 是大多数政府债券和公司债券的标准。ACT/ACT ICMA | 30/360 | ACT/365 | ACT/360
face_valuenumber是以货币单位表示的赎回金额,例如 1000。
issue_datestring是发行(起息)日期,采用 ISO 格式,例如 2024-03-15。
maturity_datestring是赎回日期,采用 ISO 格式,例如 2029-03-15。
coupon_rate_pctnumber是年票息率,以百分比表示。4% 票息应传入 4.0,而不是 0.04。零息债券传入 0。
settlement_datestring是估值日期,采用 ISO 格式。必须介于发行日和到期日之间,例如 2025-09-11。
payments_per_yearenum是每年的票息支付次数:1 表示每年一次,2 表示每半年一次,4 表示每季度一次,12 表示每月一次。大多数政府债券每半年支付一次票息。1 | 2 | 4 | 12

详细介绍

fixed-income-mcp

面向 AI Agent 的固定收益分析,并内置可捕捉模型实际会犯错误的检查。

为固定息票债券定价并衡量其利率敏感度。它与计算器的不同之处有两点:每种解析久期都会通过与不依赖惯例的数值久期进行比对来验证;每项估值都会根据正确答案必须满足的界限进行检查。

定价与分析核心(bondmath.bond、.pricing、.analytics、.checks、.daycount、.schedule)仅使用标准库。按此分发的包还会安装 MCP SDK,这是 bondmath.server 所必需的依赖——请参阅作为 MCP 服务,了解为何该依赖不可省略。


原因

有人让大模型计算一只普通债券的修正久期,模型给出了 3.0942 年。正确值是 3.1686。它用麦考利久期除以 1 加上年化收益率,而不是除以 1 加上每期收益率——对于每年付息两次的债券,这是错误的除数。

接着它做了件更有意思的事。它自己的久期加凸性近似值开始与精确定价不符,于是把差距解释为“泰勒级数的三阶项”。对于该期限的债券和 100 bp 的变动,真正的三阶项只有 0.09 bp。它用来解释差距的残差,实际上源自它自己算错的久期,却被它当作理论交了回来。

另一次会话给出了一只交易价格为面值 97.80% 的债券,其收益率为 4.01%——低于 4.09% 的当前收益率,因此超出了可能答案的范围。

完整说明见 joselillotrax-cell/bond-desk。

这个库正是对此问题的解决方案:给 Agent 一个能正确计算的工具,并让工具明确说明计算正确。

设计

二分法,而非牛顿-拉夫森法。 牛顿法收敛更快,但可能发散,也可能停在一个满足迭代条件、却没有解出定价方程的值上。这正是 4.01% 错误的由来。二分法不会出现这种情况。

除了解析久期,还提供有效久期。 对定价函数进行中心差分不涉及年化,因此数值结果不会继承惯例错误。两者不一致时,错的就是解析久期。

故意计算错误答案。 Analytics.naive_modified 会保留错误除数产生的数值。这对一个库来说并不寻常,但这样工具才能标记错误,而不是悄悄避开它。

使用

from datetime import date
from bondmath import Bond, DayCount, yield_from_price, analytics, check_consistency

bond = Bond(
    face=1000,
    coupon_rate=0.04,
    frequency=2,
    issue=date(2024, 3, 15),
    maturity=date(2029, 3, 15),
    basis=DayCount.ACT_ACT_ICMA,
)
settle = date(2025, 9, 11)

quote = yield_from_price(bond, settle, 978.00)   # 97.80% of par
print(f"{quote.dirty:.4f}")          # 997.5652
print(f"{quote.ytm:.4%}")            # 4.6867%

metrics = analytics(bond, settle, quote.ytm)
print(f"{metrics.modified:.4f}")     # 3.1686  <- correct
print(f"{metrics.naive_modified:.4f}")  # 3.0976  <- the common error
print(f"{metrics.effective:.4f}")    # 3.1694  <- numerical arbiter

print(check_consistency(bond, settle, quote, metrics))
# [PASS] below_par_ordering: trading below par at 97.8000%, so
#        coupon < current yield < YTM must hold: 4.0000% < 4.0900% < 4.6867%
# ...

情景分析可以单独展示真实的高阶残差:

from bondmath import scenario

s = scenario(bond, settle, quote.ytm, shock_bp=100)
print(f"{s.exact:.2f}")          # 966.55
print(f"{s.residual_bp:+.2f}")   # +0.09 bp, not the six the model claimed

惯例

ACT/ACT ICMA、30/360(美国债券惯例)、ACT/365 和 ACT/360。年度、半年、季度和月度付息。付息计划从到期日向前生成,因此对于非周期发行的债券,可以正确处理不规则的首个计息期。

作为 MCP 服务

提供六种工具,让 Agent 不必再在脑中做这些计算。

工具功能
yield_from_price_tool根据市场价格求到期收益率
price_from_yield_tool计算给定收益率下的净价和全价
bond_analytics_tool久期、DV01、凸性——并提供两项交叉检查
cashflow_schedule_tool剩余现金流、贴现因子、现值
scenario_shock_tool精确定价与一阶、二阶估算的对比
check_consistency_tool审核他人计算出的收益率

两个设计决定让模型能实际使用这些工具,而不只是调用它们。

单位写在参数名中。 名为 coupon_rate 的字段会让人疑惑 4% 应写作 4 还是 0.04;猜错后数值会相差一百倍,看起来却依然合理。这里所有参数名都明确标注单位:coupon_rate_pct、clean_price_pct_of_face、ytm_pct。无需猜测。

每项估值都会给出自己的判定。 结果中包含 all_checks_passed 标记和用于判定的界限列表,让模型知道该数值是否合理,而不只是知道它是多少。

安装
pip install bondmath

mcp 是必需依赖,而不是可选扩展——MCP 注册表会根据 PyPI 上的精确项目名称验证包的 identifier,像 bondmath[mcp] 这样的带扩展名称无法通过验证。普通安装必须足以运行服务。

然后进行注册。在 Claude Desktop 中,将以下内容添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "fixed-income": {
      "command": "fixed-income-mcp"
    }
  }
}

在 Claude Code 中:

claude mcp add fixed-income -- fixed-income-mcp

**如果找不到命令:**通过 pip 安装的脚本可能不在启动进程的 PATH 中。请改用绝对路径——在安装所用的环境中通过 which fixed-income-mcp 查找,并将完整路径填入 command。

**如果你使用 macOS,且服务显示“disconnected”但没有明确错误:**先检查 ~/Library/Logs/Claude/mcp-server-fixed-income.log——面板中的错误消息并非真正的错误。开发期间,这个项目遇到了两个 macOS 特有的问题:Python 3.14 会静默跳过隐藏的 .pth 文件,iCloud Drive 也可能在不发出警告的情况下将 ~/Desktop 中的文件标记为隐藏;此外,~/Desktop、~/Documents 和 ~/Downloads 都需要明确授权,启动的子进程才能读取其中的文件。安装到这些文件夹以外的位置(如 ~/dev、~/code 或任何未与云端同步的位置)即可避免这两个问题。

实际使用

以下是使用 Claude Desktop 测试时的三段对话:通过自然语言提问,而非预先填入参数,并独立对照每个工具自身的输出进行了交叉核验:

“有个同事告诉我,一只半年付息、票息为 4% 的债券……报价为 97.80%,收益率为 4.01%。这合理吗?” — 直接调用了 check_consistency_tool,而非从头重新计算;正确识别出 67.67 bp 的误差,并解释了原因,无需反复尝试:“债券折价交易,因此票息 < 当前收益率 < 到期收益率。”

“一只票息为 3.5%、2032 年到期的债券,报价为 96.4。它的收益率是多少?” — 面值、发行日期和付息频率均未提供。该架构中的必填字段 issue_date 拒绝了第一次调用尝试(MCP error -32602: invalid_type);模型说明了之后采用的假设,而不是悄悄编造信息,并分别计算了半年付息和年付息两种情形,显示付息频率假设对答案影响很小。

“哪只债券的利率风险更高:A(4%,2029 年到期,报价为 98)还是 B(2%,2035 年到期,报价为 85)?” — 连续调用了两个工具,给出了正确结论(B,7.43 年对比 2.14 年),并解释了两个起作用的因素:更长期限,以及较低票息将更多债券价值推到了最终本金偿付部分。它还主动指出,以货币金额比较 DV01,得出的比率不同于以百分比比较修正久期,因为这两只债券的交易价格不同。

审核可疑数据

check_consistency_tool 是为本项目启动时遇到的情况而设计的——核查别人已经算出的数字:

claimed_ytm_pct        4.01
correct_ytm_pct        4.686736
error_bp               -67.67
all_checks_passed      false

[FAIL] below_par_ordering: trading below par at 97.8000%, so
       coupon < current yield < YTM must hold:
       4.0000% < 4.0900% < 4.0100%

开发环境安装

pip install -e ".[dev]"
python -m pytest -q

共有 59 个测试。其中一些会固定说明文档中的数值:如果有人把除数换回去,test_naive_divisor_is_the_one_that_disagrees 就会失败。另一些则会检查 MCP 架构本身——test_every_parameter_carries_a_description 的存在,是因为此服务的早期版本没有任何参数描述,模型只能靠猜测才能发现这一点。

未涵盖的内容

嵌入式期权、浮动票息、偿债基金、摊还结构、除息惯例、信用风险和结算延迟。这是用于教学和核查的工具,不是交易系统。

许可证

MIT。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。