浮息债利差

浮息债利差 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)