国库券基点价值
计算每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)