国债贴现收益率

国债贴现收益率 贴现率 → 债券等价收益率(BEY)
根据国库券贴现率、结算日与到期日,计算其债券等价收益率(Bond Equivalent Yield)。
格式 yyyy-mm-dd
格式 yyyy-mm-dd
计算结果
点击「计算」查看输出
code 计算逻辑代码
以下为「国债贴现收益率」QuantLib 代码示例。

# 依赖版本:
# python==3.9
# QuantLib==1.43
import traceback
from datetime import datetime
import QuantLib as ql
from fastapi import Query


# ============================================================
# 工具函数(原 util 模块内联,便于独立运行)
# ============================================================
def _parse_date(s: str) -> ql.Date:
    d = datetime.strptime(s.strip(), "%Y-%m-%d")
    return ql.Date(d.day, d.month, d.year)

# ============================================================
# 核心计算函数
# ============================================================
def qjquant_calu_beytbill(
    settle_date: str = Query(...),
    maturity_date: str = Query(...),
    discount: float = Query(...),
):
    try:
        # ---------- 参数校验 ----------
        if discount < 0 or discount >= 1:
            return {"ok": False, "msg": "贴现率应在 [0, 1) 范围内"}

        settle_qd   = _parse_date(settle_date)
        maturity_qd = _parse_date(maturity_date)

        if settle_qd >= maturity_qd:
            return {"ok": False, "msg": "结算日必须早于到期日"}

        # ---------- 实际天数(Actual/360 与 Actual/365 的天数部分相同) ----------
        days = ql.Actual360().dayCount(settle_qd, maturity_qd)
        if days <= 0:
            return {"ok": False, "msg": "到期天数异常"}

        FACE = 100.0

        # ---------- 由贴现率求价格 ----------
        price = FACE * (1.0 - discount * days / 360.0)
        if price <= 0:
            return {"ok": False, "msg": "贴现率过高导致价格非正"}

        # ---------- 由价格求 BEY(Actual/365) ----------
        if days <= 182:
            # 短期:BEY = (100/Price - 1) × 365/days
            be_yield = (FACE / price - 1.0) * 365.0 / days
        else:
            # 长期 T-Bill BEY 二次公式(与 tbillyield 一致)
            x = days / 365.0
            r = FACE / price - 1.0
            discriminant = 1.0 + 2.0 * x * r
            if discriminant < 0:
                return {"ok": False, "msg": "长期国库券 BEY 判别式异常"}
            be_yield = (-1.0 + (discriminant ** 0.5)) / x

        return {
            "ok": True,
            "be_yield": round(be_yield, 4),
        }

    except ValueError as ve:
        traceback.print_exc()
        return {"ok": False, "msg": f"参数错误: {ve}"}
    except Exception as e:
        traceback.print_exc()
        return {"ok": False, "msg": f"未知错误: {e}"}


# ============================================================
# 可复制运行的示例
# ============================================================
if __name__ == "__main__":
    print("=" * 60)
    print("国债贴现收益率 beytbill 示例")
    print("=" * 60)

    # 示例 1:短期 180 天,贴现率 5%
    r1 = qjquant_calu_beytbill(
        settle_date="2000-02-11",
        maturity_date="2000-08-07",
        discount=0.0577,
    )
    print("\n[示例1] 短期 180 天,贴现率 5%")
    print("  结果:", r1)

    # 示例 2:长期 364 天,贴现率 5%
    r2 = qjquant_calu_beytbill(
        settle_date="2024-01-02",
        maturity_date="2024-12-31",
        discount=0.05,
    )
    print("\n[示例2] 长期 364 天,贴现率 5%")
    print("  结果:", r2)

    # 示例 3:贴现率 0(边界,BEY 为 0)
    r3 = qjquant_calu_beytbill(
        settle_date="2024-01-02",
        maturity_date="2024-07-01",
        discount=0.0,
    )
    print("\n[示例3] 贴现率 0(边界)")
    print("  结果:", r3)