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。instrument、calcDate 和 discountCurve 均为标量,会扩展以匹配 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]
