bondZSpreadCalculator

首发版本:3.00.6.1

语法

bondZSpreadCalculator(instrument, calcDate, dirtyPrice, discountCurve, [spreadCurve])

详情

根据债券的市场全价和贴现曲线,计算债券的零波动利差(Z-Spread)。Z-Spread 是加在各期贴现利率上的常数利差,使未来现金流的现值之和等于市场全价。

若指定 spreadCurve,则在贴现曲线和信用利差曲线的基础上求解额外的常数利差。若未指定,则信用利差按 0 处理。

贴现曲线的 compounding 字段指定计息方式,可取 "Simple"(单利)、"Compounded"(离散复利)或 "Continuous"(连续复利)。

参数

注意: 所有输入向量必须等长。输入标量会自动扩展到与向量相同的长度;长度为 1 的向量仍按向量处理,不会作为标量扩展。

instrument INSTRUMENT 类型标量或向量,表示债券产品,可通过 parseInstrument 创建。固定利率债的 bondType 设置为 "FixedRateBond";产品字段详见 bondPricer 的债券产品字段说明。

calcDate DATE 类型标量或向量,表示计算日。必须与对应贴现曲线的 referenceDate 一致。

dirtyPrice 整型或浮点型标量或向量,表示债券的市场全价,包含应计利息。值必须大于 0 且不为 NULL。输入金额应与债券 nominal 字段指定的名义金额口径一致;例如 nominal 为 100 时,输入每 100 面值对应的全价。

discountCurve MKTDATA 类型标量或向量,表示贴现曲线,curveType 必须为 "IrYieldCurve"。可通过 parseMktData 将曲线字典解析为 MKTDATA 对象。曲线字段详见该函数的利率收益率曲线说明。

spreadCurve 可选参数,MKTDATA 类型标量或向量,表示已有信用利差曲线,curveType 必须为 "IrYieldCurve"。未指定或设为 NULL 时,信用利差按 0 处理。指定该参数后,返回值表示在已有信用利差基础上求得的额外利差。

返回值

所有输入均为标量时,返回 DOUBLE 类型标量;存在向量输入时,返回与输入向量等长的 DOUBLE 向量。

结果以小数形式表示,例如 0.01 表示 1%,即 100 bp。

例子

例1. 计算单只固定利率债的 Z-Spread。债券面值为 100,年票面利率为 3%,每年付息一次,期限为 5 年。计算日为起息日,市场全价为 100,贴现曲线为 2% 的平坦曲线,采用按年离散复利。

valuationDate = 2025.01.01
couponBondSpec = {
    "productType": "Cash",
    "assetType": "Bond",
    "bondType": "FixedRateBond",
    "nominal": 100.0,
    "start": 2025.01.01,
    "maturity": 2030.01.01,
    "issuePrice": 100.0,
    "coupon": 0.03,
    "frequency": "Annual",
    "dayCountConvention": "ActualActualISDA"
}
couponBond = parseInstrument(obj=couponBondSpec)

discountSpec = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": valuationDate,
    "currency": "CNY",
    "dayCountConvention": "ActualActualISDA",
    "compounding": "Compounded",
    "frequency": "Annual",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "dates": [2026.01.01, 2030.01.01],
    "values": [0.02, 0.02]
}
discountCurve = parseMktData(dict=discountSpec)

bondSpread = bondZSpreadCalculator(
    instrument=couponBond,
    calcDate=valuationDate,
    dirtyPrice=100.0,
    discountCurve=discountCurve
)
round(bondSpread, 8)
// output: 0.01

计算得到的 Z-Spread 为 0.01,即 100 bp。

例2. 沿用例1的债券、计算日和贴现曲线,另外指定 0.5% 的平坦信用利差曲线。

creditSpec = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": valuationDate,
    "currency": "CNY",
    "dayCountConvention": "ActualActualISDA",
    "compounding": "Compounded",
    "frequency": "Annual",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "dates": [2026.01.01, 2030.01.01],
    "values": [0.005, 0.005]
}
creditCurve = parseMktData(dict=creditSpec)

additionalSpread = bondZSpreadCalculator(
    instrument=couponBond,
    calcDate=valuationDate,
    dirtyPrice=100.0,
    discountCurve=discountCurve,
    spreadCurve=creditCurve
)
round(additionalSpread, 8)
// output: 0.005

返回的额外利差为 0.005,即 50 bp。

例3. 沿用例1的债券、计算日和贴现曲线,批量计算全价分别为 98、100 和 102 时的 Z-Spread。instrumentcalcDatediscountCurve 均为标量,会扩展以匹配 dirtyPrice 向量。

marketPrices = [98.0, 100.0, 102.0]
spreadValues = bondZSpreadCalculator(
    instrument=couponBond,
    calcDate=valuationDate,
    dirtyPrice=marketPrices,
    discountCurve=discountCurve
)
round(spreadValues, 8)
// output: [0.01442238,0.01,0.00568655]

相关函数: bondPricerparseInstrumentparseMktData