回购协议收支平衡贴现率
计算回购协议的真正盈亏平衡贴现率
根据回购利率、购买日国库券贴现率、购买日、回购到期日与国库券到期日,计算使回购交易现金流平衡的贴现率。
格式 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)