回购协议收支平衡贴现率

回购协议收支平衡贴现率 计算回购协议的真正盈亏平衡贴现率
根据回购利率、购买日国库券贴现率、购买日、回购到期日与国库券到期日,计算使回购交易现金流平衡的贴现率。
格式 yyyy-mm-dd
格式 yyyy-mm-dd
格式 yyyy-mm-dd
计算结果
点击「计算」查看输出
code 计算逻辑代码
以下为「回购协议收支平衡贴现率」QuantLib 代码示例。

# 依赖版本:
# python==3.9
# QuantLib==1.43
"""
qjquant_calu_tbillrepo.py
回购协议收支平衡贴现率(T-Bill Repo)

依赖:
    pip install fastapi quantlib-python

运行示例(复制即可):
    python qjquant_calu_tbillrepo.py
"""
import traceback
from datetime import datetime
import QuantLib as ql
from fastapi import Query


# ============================================================
# 工具函数
# ============================================================
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_tbillrepo(
    repo_rate: float = Query(...),
    initial_discount: float = Query(...),
    purchase_date: str = Query(...),
    sale_date: str = Query(...),
    maturity_date: str = Query(...),
):
    try:
        # ---------- 日期解析与校验 ----------
        purchase_qd = _parse_date(purchase_date)
        sale_qd     = _parse_date(sale_date)
        maturity_qd = _parse_date(maturity_date)

        if purchase_qd >= sale_qd:
            return {"ok": False, "msg": "购买日必须早于回购到期日"}
        if sale_qd >= maturity_qd:
            return {"ok": False, "msg": "回购到期日必须早于国库券到期日"}

        # ---------- 参数校验 ----------
        if repo_rate < 0:
            return {"ok": False, "msg": "回购利率不能为负"}
        if initial_discount < 0 or initial_discount >= 1:
            return {"ok": False, "msg": "初始贴现率应在 [0, 1) 范围内"}

        # ---------- 天数(Actual/360) ----------
        day_count = ql.Actual360()
        days_purchase_to_maturity = day_count.dayCount(purchase_qd, maturity_qd)
        days_purchase_to_sale    = day_count.dayCount(purchase_qd, sale_qd)
        days_sale_to_maturity    = day_count.dayCount(sale_qd, maturity_qd)

        if days_purchase_to_maturity <= 0 or days_purchase_to_sale <= 0 or days_sale_to_maturity <= 0:
            return {"ok": False, "msg": "日期区间天数异常"}

        FACE = 100.0

        # ---------- 购买日价格 ----------
        # P0 = 100 × (1 - InitialDiscount × days_purchase_to_maturity / 360)
        price_purchase = FACE * (1.0 - initial_discount * days_purchase_to_maturity / 360.0)

        if price_purchase <= 0:
            return {"ok": False, "msg": "初始贴现率过高导致购买日价格非正"}

        # ---------- 回购利息 ----------
        # I = RepoRate × P0 × days_purchase_to_sale / 360
        repo_interest = repo_rate * price_purchase * days_purchase_to_sale / 360.0

        # ---------- 回购到期日目标价格 ----------
        # P1 = P0 + I
        price_sale_target = price_purchase + repo_interest

        # ---------- 反推平衡贴现率 ----------
        # P1 = 100 × (1 - TBEDiscount × days_sale_to_maturity / 360)
        # => TBEDiscount = (1 - P1/100) × 360 / days_sale_to_maturity
        tbe_discount = (1.0 - price_sale_target / FACE) * 360.0 / days_sale_to_maturity

        if tbe_discount < 0:
            tbe_discount = 0.0

        return {
            "ok": True,
            "tbe_discount": round(tbe_discount, 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("回购协议收支平衡贴现率 tbillrepo 示例")
    print("=" * 60)

    # 示例 1:正常回购场景
    r1 = qjquant_calu_tbillrepo(
        repo_rate=0.0475,
        initial_discount=0.0475,
        purchase_date="2002-01-03",
        sale_date="2002-02-03",
        maturity_date="2002-04-03",
    )
    print("\n[示例1] 正常回购场景")
    print("  结果:", r1)