国库券价格
按价格口径计算短期国债价格
根据国库券结算日、到期日、赎回价值(面值)与贴现率,计算国库券价格。
格式 yyyy-mm-dd
格式 yyyy-mm-dd
计算结果
点击「计算」查看输出
code
计算逻辑代码
以下为「国库券价格」QuantLib 代码示例。
# 依赖版本:
# python==3.9
# QuantLib==1.43
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_prtbill(
settle_date: str = Query(...),
maturity_date: str = Query(...),
face: float = Query(100.0),
discount: float = Query(...),
):
try:
# ---------- 参数校验 ----------
if face <= 0:
return {"ok": False, "msg": "赎回价值必须大于 0"}
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) ----------
days = ql.Actual360().dayCount(settle_qd, maturity_qd)
if days <= 0:
return {"ok": False, "msg": "到期天数异常"}
# ---------- 价格计算 ----------
# 优先使用 QuantLib 的 TBillPriceFromDiscount(默认面值 100)
try:
price_per_100 = ql.TBillPriceFromDiscount(
settle_qd, maturity_qd, discount, 100.0
)
except Exception:
# 回退:手动公式 Price = 100 × (1 - Discount × days/360)
price_per_100 = 100.0 * (1.0 - discount * days / 360.0)
# 按自定义面值缩放
price = price_per_100 * face / 100.0
if price <= 0:
return {"ok": False, "msg": "贴现率过高导致价格非正"}
return {
"ok": True,
"price": round(price, 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("国库券价格 prtbill 示例")
print("=" * 60)
# 示例 1:面值 100,贴现率 5%,短期 180 天
r1 = qjquant_calu_prtbill(
settle_date="2002-02-10",
maturity_date="2002-08-06",
face=1000.0,
discount=0.0377,
)
print("\n[示例1] 面值 100,贴现率 5%,短期 180 天")
print(" 结果:", r1)
# 示例 2:面值 1000,贴现率 5%,长期 364 天
r2 = qjquant_calu_prtbill(
settle_date="2024-01-02",
maturity_date="2024-12-31",
face=1000.0,
discount=0.05,
)
print("\n[示例2] 面值 1000,贴现率 5%,长期 364 天")
print(" 结果:", r2)
# 示例 3:贴现率 0(边界,价格 = 面值)
r3 = qjquant_calu_prtbill(
settle_date="2024-01-02",
maturity_date="2024-07-01",
face=100.0,
discount=0.0,
)
print("\n[示例3] 贴现率 0(边界)")
print(" 结果:", r3)