国库券基点价值

国库券基点价值 计算每100元面值的一个基点价值
根据结算日与到期日,计算每 100 元面值国库券在贴现率、货币市场收益率和债券等价收益率三种口径下的一个基点(0.01%)价值。
格式 yyyy-mm-dd
格式 yyyy-mm-dd
计算结果
点击「计算」查看输出
code 计算逻辑代码
以下为「国库券基点价值」QuantLib 代码示例。

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

# ============================================================
# 工具函数
# ============================================================
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_tbillval01(
    settle_date: str = Query(...),
    maturity_date: str = Query(...),
):
    try:
        # ---------- 日期解析与校验 ----------
        settle_qd   = _parse_date(settle_date)
        maturity_qd = _parse_date(maturity_date)

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

        # ---------- 实际天数 ----------
        days = ql.Actual360().dayCount(settle_qd, maturity_qd)
        if days <= 0:
            return {"ok": False, "msg": "到期天数异常"}

        FACE = 100.0
        BP = 0.0001   # 1 个基点 = 0.01%

        # ---------- 1) 贴现率基点价值(Actual/360) ----------
        # Price = 100 * (1 - Disc * days/360)
        # dPrice/dDisc = -100 * days/360
        val01_disc = FACE * days / 360.0 * BP

        # ---------- 2) 货币市场收益率基点价值(Actual/360) ----------
        # Price = 100 / (1 + MMY * days/360)
        # 在 MMY = 0 处的导数:dPrice/dMMY = -100 * days/360
        # Val01MMY = 100 * days/360 * BP
        val01_mmy = FACE * days / 360.0 * BP

        # ---------- 3) 债券等价收益率基点价值(Actual/365) ----------
        if days <= 182:
            # 短期:Price = 100 / (1 + BEY * days/365)
            # 在 BEY = 0 处导数:dPrice/dBEY = -100 * days/365
            val01_bey = FACE * days / 365.0 * BP
        else:
            # 长期 T-Bill BEY 价格公式:
            # Price = 100 / [(1 + BEY/2)(1 + BEY/2 * (2x - 1))], x = days/365
            # 在 BEY = 0 附近用有限差分近似
            x = days / 365.0
            def price_from_bey(bey: float) -> float:
                return FACE / ((1.0 + bey / 2.0) *
                               (1.0 + bey / 2.0 * (2.0 * x - 1.0)))
            eps = 1e-6
            d_price = (price_from_bey(eps) - price_from_bey(-eps)) / (2.0 * eps)
            val01_bey = abs(d_price) * BP

        return {
            "ok": True,
            "val01_disc": round(val01_disc,4),
            "val01_mmy":  round(val01_mmy, 4),
            "val01_bey":  round(val01_bey, 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("国库券基点价值 tbillval01 示例")
    print("=" * 60)

    # 示例 1:短期 180 天
    r1 = qjquant_calu_tbillval01(
        settle_date="2024-01-02",
        maturity_date="2024-07-01",
    )
    print("\n[示例1] 短期 180 天")
    print("  结果:", r1)

    # 示例 2:长期 364 天
    r2 = qjquant_calu_tbillval01(
        settle_date="2024-01-02",
        maturity_date="2024-12-31",
    )
    print("\n[示例2] 长期 364 天")
    print("  结果:", r2)