浮息债利差
spreadforlife 利差指标
根据浮息债价格、报价利差、结算日与到期日,计算 spreadforlife 利差指标。可选参数:每年付款频率 Reset(默认 1)与计息天数规则 Basis(默认 0,实际/实际)。
格式 yyyy-mm-dd
格式 yyyy-mm-dd
计算结果
点击「计算」查看输出
code
计算逻辑代码
以下为「ISDA国际通用」浮息债利差(spreadforlife)的 Python 代码示例(基于 QuantLib)。
# 依赖版本:
# python==3.9
# QuantLib==1.43
import traceback
from datetime import datetime
import QuantLib as ql
def qjquant_calu_floatmargin(
price: float,
spread: float,
settle: str,
maturity: str,
reset: int = 1,
basis: int = 0,
):
try:
# ---------- 参数校验 ----------
if price <= 0:
return {"ok": False, "msg": "债券价格必须大于 0"}
if spread < 0:
return {"ok": False, "msg": "报价利差不能为负"}
if not settle or not maturity:
return {"ok": False, "msg": "结算日与到期日不能为空"}
# ---------- 日期解析 ----------
try:
d1 = datetime.strptime(settle, "%Y-%m-%d").date()
d2 = datetime.strptime(maturity, "%Y-%m-%d").date()
except ValueError:
return {"ok": False, "msg": "日期格式必须为 YYYY-MM-DD"}
if d2 <= d1:
return {"ok": False, "msg": "到期日必须晚于结算日"}
# ---------- 按 Basis 计算年数 ----------
ql_settle = ql.Date(d1.day, d1.month, d1.year)
ql_maturity = ql.Date(d2.day, d2.month, d2.year)
day_counter_map = {
0: ql.ActualActual(ql.ActualActual.Bond),
1: ql.Thirty360(ql.Thirty360.BondBasis),
2: ql.Actual360(),
3: ql.Actual365Fixed(),
4: ql.Thirty360(ql.Thirty360.USA),
5: ql.Thirty360(ql.Thirty360.ISDA),
6: ql.Thirty360(ql.Thirty360.European),
7: ql.Actual365Fixed(),
8: ql.ActualActual(ql.ActualActual.ISMA),
9: ql.Actual360(),
10: ql.Actual365Fixed(),
11: ql.Thirty360(ql.Thirty360.European),
12: ql.Actual365Fixed(),
13: ql.Actual365Fixed(),
}
dc = day_counter_map.get(basis, ql.ActualActual(ql.ActualActual.Bond))
year_frac = dc.yearFraction(ql_settle, ql_maturity)
if year_frac <= 0:
return {"ok": False, "msg": "结算日至到期日的年数必须大于 0"}
# ---------- spreadforlife 公式 ----------
margin = ((100.0 - price) / year_frac * 100.0 + spread) * 100.0 / price
return {
"ok": True,
"margin": round(margin, 4),
}
except Exception as e:
traceback.print_exc()
return {"ok": False, "msg": f"未知错误: {e}"}
# ============================================================
# 示例:复制本文件后直接运行
# ============================================================
if __name__ == "__main__":
print("=" * 60)
print("示例 1:浮息债利差(年度,实际/实际)")
print("=" * 60)
r1 = qjquant_calu_floatmargin(
price=99.99,
spread=50,
settle="2024-03-15",
maturity="2029-03-15",
reset=1,
basis=0,
)
print(r1)
print()
print("=" * 60)
print("示例 2:浮息债利差(季度,30/360 USA)")
print("=" * 60)
r2 = qjquant_calu_floatmargin(
price=98.50,
spread=75,
settle="2024-03-15",
maturity="2029-06-20",
reset=4,
basis=4,
)
print(r2)
print()
print("=" * 60)
print("示例 3:浮息债利差(半年度,实际/365)")
print("=" * 60)
r3 = qjquant_calu_floatmargin(
price=101.25,
spread=30,
settle="2024-06-01",
maturity="2027-06-01",
reset=2,
basis=3,
)
print(r3)
print()
print("=" * 60)
print("示例 4:浮息债利差(短期限,实际/360)")
print("=" * 60)
r4 = qjquant_calu_floatmargin(
price=99.80,
spread=120,
settle="2024-03-15",
maturity="2025-03-15",
reset=1,
basis=2,
)
print(r4)