irFixedFloatingSwapPricer
首发版本:3.00.4
语法
irFixedFloatingSwapPricer(instrument, pricingDate,
discountCurve, forwardCurve, assetPriceCurve, [setting])
详情
计算固定利率互换(IR Fixied-Floating Swap, IRS)的定价。
参数
注意:所有输入向量必须等长,输入标量将自动扩展以匹配其它向量的长度。
instrument INSTRUMENT 类型标量或向量,一个 IrFixedFloatingSwap 对象,表示需要定价的固定利率互换。
pricingDate DATE 类型标量或向量,表示定价日期。
discountCurve MKTDATA 类型标量或向量,一个 IrYieldCurve 对象,表示用于计算折现因子的即期曲线。
forwardCurve MKTDATA 类型标量或向量,一个 IrYieldCurve 对象,表示用于计算远期利率的即期曲线。
assetPriceCurve MKTDATA 类型标量或向量,一个 AssetPriceCurve 对象,用于传入利率互换浮动端参考利率的历史数据。
setting 可选参数,一个键为 STRING 类型、值为 ANY 类型的字典,用于指定计算设置。支持的键值对包括:
|
key |
value |
说明 |
|---|---|---|
|
calcCashFlow |
BOOL |
是否计算现金流。未指定或为 false 时不计算。 |
|
calcDiscountCurveDelta |
BOOL |
是否计算利率互换对贴现曲线的 DV01。未指定或为 false 时不计算。 |
|
discountCurveShift |
DOUBLE |
贴现曲线的平行扰动量,默认为 0.0001(1 bp)。 |
|
calcForwardCurveDelta |
BOOL |
是否计算利率互换对远期曲线的 DV01。未指定或为 false 时不计算。 |
|
forwardCurveShift |
DOUBLE |
远期曲线的平行扰动量,默认为 0.0001(1 bp)。 |
注意:上述配置项仅在单笔计算时生效,批量计算时均不生效。仅指定扰动量不会开启 DV01 计算,还需将对应的 calcDiscountCurveDelta 或 calcForwardCurveDelta 设为 true。
返回值
-
单笔计算(前五个参数均为标量)时,若未指定 setting 或传入空字典,返回 DOUBLE 标量,表示净现值。
-
单笔计算时,若 setting 中指定上述任意键,返回字典,始终包含 npv。即使开关值为 false,或仅指定 discountCurveShift、forwardCurveShift,也返回字典。其余字段取决于相应开关是否为 true,具体见下表。
-
批量计算(前五个参数中任意一个为向量,包括长度为 1 的向量)时,返回与输入向量等长的 DOUBLE 向量,表示各笔互换的净现值。上述配置项均不生效。
|
key |
值类型 |
说明 |
|---|---|---|
|
npv |
DOUBLE |
始终包含,表示利率互换的净现值。 |
|
fixed_cash_flow |
表 |
仅在 calcCashFlow 为 true 时包含,表示固定腿现金流。 |
|
floating_cash_flow |
表 |
仅在 calcCashFlow 为 true 时包含,表示浮动腿现金流。 |
|
discountCurveDelta |
DOUBLE |
仅在 calcDiscountCurveDelta 为 true 时包含,表示利率互换对贴现曲线的 DV01。 |
|
forwardCurveDelta |
DOUBLE |
仅在 calcForwardCurveDelta 为 true 时包含,表示利率互换对远期曲线的 DV01。 |
三个计算开关可以同时设为 true,此时字典中同时包含对应字段;已指定的开关均为 false,或仅指定扰动量时,字典中仅包含 npv。
例子
例1. 以 FR_007 为参考利率的利率互换定价。
irs = {
"productType": "Swap",
"swapType": "IrSwap",
"irSwapType": "IrFixedFloatingSwap",
"start": 2025.06.16,
"maturity": 2028.06.16,
"frequency": "Quarterly",
"fixedRate": 0.018,
"calendar": "CFET",
"fixedDayCountConvention": "Actual365",
"floatingDayCountConvention": "Actual365",
"payReceive": "Pay",
"iborIndex": "FR_007",
"spread": 0.0001,
"notionalCurrency": "CNY",
"notionalAmount": 1E8
}
pricingDate = 2025.08.18
curve = {
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"curveName": "CNY_FR_007",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"frequency": "Annual",
"dates":[2025.08.21, 2025.08.27, 2025.09.03, 2025.09.10, 2025.09.22, 2025.10.20, 2025.11.20,
2026.02.24, 2026.05.20, 2026.08.20, 2027.02.22, 2027.08.20,2028.08.21],
"values":[1.4759, 1.5331, 1.5697, 1.5239, 1.4996, 1.5144, 1.5209,
1.5539, 1.5461, 1.5316, 1.5376, 1.5435,1.5699] / 100
}
// 为了计算定价日后面的第一笔现金流用到的浮动利率,需要传入参考利率的历史数据
// 因为 FR_007 利率互换的付息频率为季度,建议传入的 FR_007 的历史定盘数据不少于 70 个交易日
fr007HistCurve = {
"mktDataType": "Curve",
"curveType": "AssetPriceCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"dates":[2025.05.09, 2025.05.12, 2025.05.13, 2025.05.14, 2025.05.15, 2025.05.16, 2025.05.19, 2025.05.20, 2025.05.21, 2025.05.22,
2025.05.23, 2025.05.26, 2025.05.27, 2025.05.28, 2025.05.29, 2025.05.30, 2025.06.03, 2025.06.04, 2025.06.05, 2025.06.06,
2025.06.09, 2025.06.10, 2025.06.11, 2025.06.12, 2025.06.13, 2025.06.16, 2025.06.17, 2025.06.18, 2025.06.19, 2025.06.20,
2025.06.23, 2025.06.24, 2025.06.25, 2025.06.26, 2025.06.27, 2025.06.30, 2025.07.01, 2025.07.02, 2025.07.03, 2025.07.04,
2025.07.07, 2025.07.08, 2025.07.09, 2025.07.10, 2025.07.11, 2025.07.14, 2025.07.15, 2025.07.16, 2025.07.17, 2025.07.18,
2025.07.21, 2025.07.22, 2025.07.23, 2025.07.24, 2025.07.25, 2025.07.28, 2025.07.29, 2025.07.30, 2025.07.31, 2025.08.01,
2025.08.04, 2025.08.05, 2025.08.06, 2025.08.07, 2025.08.08, 2025.08.11, 2025.08.12, 2025.08.13, 2025.08.14, 2025.08.15
],
"values":[1.6000, 1.5600, 1.5300, 1.5500, 1.5500, 1.6300, 1.6500, 1.6000, 1.5900, 1.5800,
1.6300, 1.7000, 1.7000, 1.7000, 1.7500, 1.7500, 1.5900, 1.5800, 1.5700, 1.5600,
1.5500, 1.5500, 1.5600, 1.5900, 1.5900, 1.5700, 1.5500, 1.5600, 1.5679, 1.6000,
1.5700, 1.8500, 1.8300, 1.8400, 1.8500, 1.9500, 1.6036, 1.5800, 1.5200, 1.5000,
1.5000, 1.5100, 1.5100, 1.5300, 1.5200, 1.5500, 1.6000, 1.5400, 1.5400, 1.5000,
1.5000, 1.4800, 1.5000, 1.6000, 1.7500, 1.6400, 1.6200, 1.6300, 1.6000, 1.5000,
1.4800, 1.4700, 1.4800, 1.4900, 1.4600, 1.4600, 1.4600, 1.4800, 1.4800, 1.4900
]\100
}
instrument = parseInstrument(irs)
curve = parseMktData(curve)
discountCurve = curve
forwardCurve = curve
assetPriceCurve = parseMktData(fr007HistCurve)
// 仅计算 npv
npv = irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, forwardCurve, assetPriceCurve)
print(npv)
// 计算包括 npv、现金流
setting = {
"calcCashFlow": true
}
irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, forwardCurve, assetPriceCurve, setting)
// 同时计算多个利率互换的定价
irFixedFloatingSwapPricer([instrument, instrument], pricingDate, discountCurve, forwardCurve, assetPriceCurve, setting)
irFixedFloatingSwapPricer(instrument, [pricingDate, pricingDate], discountCurve, forwardCurve, assetPriceCurve, setting)
irFixedFloatingSwapPricer(instrument, pricingDate, [discountCurve, discountCurve], forwardCurve, assetPriceCurve, setting)
irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, [forwardCurve, forwardCurve], assetPriceCurve, setting)
irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, forwardCurve, [assetPriceCurve, assetPriceCurve], setting)
例2. 以 SHIBOR_3M 为参考利率的利率互换定价。
irs = {
"productType": "Swap",
"swapType": "IrSwap",
"irSwapType": "IrFixedFloatingSwap",
"start": 2025.06.16,
"maturity": 2028.06.16,
"frequency": "Quarterly",
"fixedRate": 0.018,
"calendar": "CFET",
"fixedDayCountConvention": "Actual365",
"floatingDayCountConvention": "Actual360",
"payReceive": "Receive",
"iborIndex": "SHIBOR_3M",
"spread": 0.0001,
"notionalCurrency": "CNY",
"notionalAmount": 1E8
}
pricingDate = 2025.08.18
curve1 = {
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"curveName": "CNY_FR_007",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"frequency": "Annual",
"dates":[2025.08.21, 2025.08.27, 2025.09.03, 2025.09.10, 2025.09.22, 2025.10.20, 2025.11.20,
2026.02.24, 2026.05.20, 2026.08.20, 2027.02.22, 2027.08.20,2028.08.21],
"values":[1.4759, 1.5331, 1.5697, 1.5239, 1.4996, 1.5144, 1.5209,
1.5539, 1.5461, 1.5316, 1.5376, 1.5435,1.5699] / 100
}
curve2 = {
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"curveName": "CNY_SHIBOR_3M",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"frequency": "Annual",
"dates":[2025.08.21, 2025.08.27, 2025.09.03, 2025.09.10, 2025.09.22, 2025.10.20, 2025.11.20,
2026.02.24, 2026.05.20, 2026.08.20, 2027.02.22, 2027.08.20,2028.08.21],
"values":[1.5113, 1.5402, 1.5660, 1.5574, 1.5556, 1.5655, 1.5703,
1.5934, 1.6040, 1.6020, 1.5928, 1.5842, 1.6068] / 100
}
// 为了计算定价日后面的第一笔现金流用到的浮动利率,需要传入参考利率的历史数据
// 因为 SHIBOR_3M 利率互换的付息频率为季度,建议传入的 SHIBOR_3M 的历史定盘数据不少于 70 个交易日
shibor3mHistCurve = {
"mktDataType": "Curve",
"curveType": "AssetPriceCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"dates":[2025.05.09, 2025.05.12, 2025.05.13, 2025.05.14, 2025.05.15, 2025.05.16, 2025.05.19, 2025.05.20, 2025.05.21, 2025.05.22,
2025.05.23, 2025.05.26, 2025.05.27, 2025.05.28, 2025.05.29, 2025.05.30, 2025.06.03, 2025.06.04, 2025.06.05, 2025.06.06,
2025.06.09, 2025.06.10, 2025.06.11, 2025.06.12, 2025.06.13, 2025.06.16, 2025.06.17, 2025.06.18, 2025.06.19, 2025.06.20,
2025.06.23, 2025.06.24, 2025.06.25, 2025.06.26, 2025.06.27, 2025.06.30, 2025.07.01, 2025.07.02, 2025.07.03, 2025.07.04,
2025.07.07, 2025.07.08, 2025.07.09, 2025.07.10, 2025.07.11, 2025.07.14, 2025.07.15, 2025.07.16, 2025.07.17, 2025.07.18,
2025.07.21, 2025.07.22, 2025.07.23, 2025.07.24, 2025.07.25, 2025.07.28, 2025.07.29, 2025.07.30, 2025.07.31, 2025.08.01,
2025.08.04, 2025.08.05, 2025.08.06, 2025.08.07, 2025.08.08, 2025.08.11, 2025.08.12, 2025.08.13, 2025.08.14, 2025.08.15
],
"values":[1.6960, 1.6720, 1.6620, 1.6530, 1.6450, 1.6470, 1.6450, 1.6420, 1.6400, 1.6400,
1.6420, 1.6430, 1.6440, 1.6470, 1.6520, 1.6520, 1.6520, 1.6520, 1.6520, 1.6510,
1.6490, 1.6450, 1.6420, 1.6390, 1.6380, 1.6360, 1.6340, 1.6300, 1.6300, 1.6290,
1.6290, 1.6290, 1.6300, 1.6300, 1.6300, 1.6300, 1.6280, 1.6195, 1.6060, 1.5970,
1.5790, 1.5700, 1.5620, 1.5590, 1.5570, 1.5610, 1.5590, 1.5590, 1.5570, 1.5550,
1.5530, 1.5490, 1.5510, 1.5530, 1.5590, 1.5600, 1.5600, 1.5640, 1.5660, 1.5630,
1.5590, 1.5580, 1.5590, 1.5600, 1.5544, 1.5490, 1.5480, 1.5480, 1.5490, 1.5470
]\100
}
instrument = parseInstrument(irs)
discountCurve = parseMktData(curve1) //CNY_FR_007
forwardCurve = parseMktData(curve2) //CNY_SHIBOR_3M
assetPriceCurve = parseMktData(shibor3mHistCurve)
// 仅计算 npv
npv = irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, forwardCurve, assetPriceCurve)
print(npv)
// 计算包括 npv、现金流
setting = {
"calcCashFlow": true
}
results = irFixedFloatingSwapPricer(instrument, pricingDate, discountCurve, forwardCurve, assetPriceCurve, setting)
print(results)
例 3. 计算一笔 FR_007 利率互换对贴现曲线和远期曲线的 DV01,平行扰动量均设为 0.0001(1 bp)。
// 利率互换合约
swapSpec = {
"productType": "Swap",
"swapType": "IrSwap",
"irSwapType": "IrFixedFloatingSwap",
"start": 2025.06.16,
"maturity": 2028.06.16,
"frequency": "Quarterly",
"fixedRate": 0.018,
"calendar": "CFET",
"fixedDayCountConvention": "Actual365",
"floatingDayCountConvention": "Actual365",
"payReceive": "Pay",
"iborIndex": "FR_007",
"spread": 0.0001,
"notionalCurrency": "CNY",
"notionalAmount": 1E8
}
// 贴现曲线和远期曲线均采用 1.5% 的平坦曲线
pricingDate = 2025.08.18
yieldCurveSpec = {
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"referenceDate": pricingDate,
"currency": "CNY",
"curveName": "CNY_FR_007",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"frequency": "Annual",
"dates": [2025.08.21, 2028.06.16],
"values": [0.015, 0.015]
}
// 各日的历史定盘利率均设为 2%
fixingDates = 2025.05.09..2025.08.15
fixingCurveSpec = {
"mktDataType": "Curve",
"curveType": "AssetPriceCurve",
"referenceDate": pricingDate,
"curveName": "PRICE_FR_007",
"dates": fixingDates,
"values": take(0.02, size(fixingDates))
}
instrument = parseInstrument(obj=swapSpec)
yieldCurve = parseMktData(dict=yieldCurveSpec)
fixingCurve = parseMktData(dict=fixingCurveSpec)
// 开启两项 DV01 计算,平行扰动量均为 1 bp
riskSetting = {
"calcDiscountCurveDelta": true,
"discountCurveShift": 0.0001,
"calcForwardCurveDelta": true,
"forwardCurveShift": 0.0001
}
riskResult = irFixedFloatingSwapPricer(
instrument=instrument,
pricingDate=pricingDate,
discountCurve=yieldCurve,
forwardCurve=yieldCurve,
assetPriceCurve=fixingCurve,
setting=riskSetting
)
riskResult
/* output:
forwardCurveDelta->27570.401579080615
discountCurveDelta->120.97029701061547
npv->-747687.6561087454
*/
返回字典中的 discountCurveDelta 和 forwardCurveDelta 分别表示利率互换对贴现曲线和远期曲线的 DV01,npv 表示净现值。
相关函数:parseInstrument,parseMktData、createPricingEngine、irVanillaSwapRateCalculator
