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