国库券贴现率转收益率
贴现率 → 货币市场收益率 / 债券等价收益率
根据国库券贴现率、结算日与到期日,计算对应的货币市场收益率(MMYield)和债券等价收益率(BEYield)。
格式 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_tbilldisc2yield(
discount: float = Query(...),
settle_date: str = Query(...),
maturity_date: str = 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": "贴现率过高导致价格非正"}
# ---------- MMYield(货币市场收益率,Actual/360) ----------
mm_yield = (FACE / price - 1.0) * 360.0 / days
# ---------- BEYield(债券等价收益率,Actual/365) ----------
if days <= 182:
# 短期:BEY = MMY × 365/360,等价于 (100/Price - 1) × 365/days
be_yield = mm_yield * 365.0 / 360.0
else:
# 长期 T-Bill BEY 二次公式(MATLAB 口径)
x = days / 365.0
# 解方程得到 BEY:P = 100 / [(1 + BEY/2)(1 + BEY/2 × (2x-1))]
# 转换为 BEY = (-2x + 2√(x² - (2x-1)(1 - 100/P))) / (2x-1)
inner = x * x - (2.0 * x - 1.0) * (1.0 - FACE / price)
if inner < 0:
return {"ok": False, "msg": "长期国库券 BEY 判别式异常"}
be_yield = (-2.0 * x + 2.0 * (inner ** 0.5)) / (2.0 * x - 1.0)
return {
"ok": True,
"be_yield": round(be_yield, 4),
"mm_yield": round(mm_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("国库券贴现率转收益率 tbilldisc2yield 示例")
print("=" * 60)
# 示例 1:短期(<=182 天),贴现率 5%
r1 = qjquant_calu_tbilldisc2yield(
discount=0.05,
settle_date="2024-01-02",
maturity_date="2024-07-01",
)
print("\n[示例1] 短期 180 天,贴现率 5%")
print(" 结果:", r1)
# 示例 2:长期(>182 天),贴现率 5%
r2 = qjquant_calu_tbilldisc2yield(
discount=0.05,
settle_date="2024-01-02",
maturity_date="2024-12-31",
)
print("\n[示例2] 长期 364 天,贴现率 5%")
print(" 结果:", r2)
# 示例 3:贴现率 0(边界,收益率均为 0)
r3 = qjquant_calu_tbilldisc2yield(
discount=0.0,
settle_date="2024-01-02",
maturity_date="2024-07-01",
)
print("\n[示例3] 贴现率 0(边界)")
print(" 结果:", r3)