irEuropeanSwaptionPricer

首发版本:3.00.6

语法

irEuropeanSwaptionPricer(instrument, pricingDate, discountCurve, forwardCurve, volSurf, [setting], [model], [method])

详情

对欧式利率互换期权定价。

参数

instrument INSTRUMENT 类型标量或向量,指定需要定价的欧式利率互换期权。字段要求参考产品字段说明

pricingDate DATE 类型标量或向量,指定定价日期。

discountCurve MKTDATA 标量或向量,指定用于计算折现因子的即期曲线(IrYieldCurve)。

forwardCurve MKTDATA 标量或向量,指定用于计算远期利率的即期曲线(IrYieldCurve)。

volSurf MKTDATA 标量或向量,指定波动率立方体(IrSwaptionVolatilityCube)。

setting 可选参数,字典(Dictionary<STRING, BOOL>),用于指定是否计算希腊字母(Greeks)所代表的期权价格敏感性指标。

描述
calcDelta 布尔值,默认为 false 是否计算 Delta,即期权价格相对于标的资产价格的敏感性。
calcGamma 布尔值,默认为 false 是否计算 Gamma,即期权 Delta 相对于标的资产价格的敏感性。
calcVega 布尔值,默认为 false 是否计算 Vega,即期权价格相对于标的资产波动率的敏感性。
calcTheta 布尔值,默认为 false 是否计算 Theta,即期权价格相对于时间变化的敏感性。
calcRho 布尔值,默认为 false 是否计算 Rho,即期权价格相对于无风险利率的敏感性。

model 可选参数,STRING 类型标量,指定定价模型。可选值:“Black76” 和 “Bachelier”(默认值)。

method 可选参数,STRING 类型标量,指定定价方法。默认且唯一支持的值为“Analytic”,表示采用解析法。

返回值

  • 若不指定 setting 参数,返回 DOUBLE 类型标量,表示期权的净现值(NPV),即期权的理论价格。
  • 指定 setting 参数时,返回一个字典(Dictionary<STRING, DOUBLE>),包含期权的净现值(NPV)以及希腊字母(Greeks)所代表的期权价格敏感性指标。有关敏感性指标的说明请参考 setting 参数说明。

例子

本示例构造欧式利率互换期权、贴现曲线、远期曲线和 Swaption 波动率立方体,并使用 irEuropeanSwaptionPricer 基于 Bachelier 模型完成定价,同时计算价格及 Delta、Gamma、Vega、Theta、Rho 等风险指标。

// =====================================================
// 一、基础定价参数设置
// =====================================================

// 定价日
pricingDate = 2021.03.18

// 名义本金
notional = 50000000.0

// 固定利率
fixedRate = 0.0365

// =====================================================
// 二、构造标的利率互换 underlying swap
// =====================================================

underlyingSwapDict = {

    // 产品大类:Swap
    "productType": "Swap",

    // Swap 类型:利率互换
    "swapType": "IrSwap",

    // 具体利率互换类型:固定利率兑浮动利率
    "irSwapType": "IrFixedFloatingSwap",

    // 标的互换的产品标识
    "instrumentId": "CNY_LPR_1Y",

    // 名义本金
    "notionalAmount": notional,

    // 名义本金币种
    "notionalCurrency": "CNY",

    // 标的互换起息日
    "start": 2021.06.18,

    // 标的互换到期日
    "maturity": 2024.06.18,

    // 现金流支付频率
    "frequency": "Annual",

    // 固定端利率
    "fixedRate": fixedRate,

    // 浮动端利差
    "spread": 0.0000,

    // 固定端日计数规则
    "fixedDayCountConvention": "Actual365",

    // 浮动端日计数规则
    "floatingDayCountConvention": "Actual360",

    // 交易日历
    "calendar": "CFET",

    // Pay 表示该标的 swap 是支付固定利率、收取浮动利率
    "payReceive": "Pay",

    "iborIndex": "LPR_1Y",

    "discountCurve": "CNY",

    "forwardCurve": "LPR_1Y"
}

// =====================================================
// 三、构造欧式 Swaption 产品
// =====================================================

swaptionDict = {

    // 产品大类:Option
    "productType": "Option",

    // 期权类型:欧式期权
    "optionType": "EuropeanOption",

    // 标的资产类型:欧式利率互换期权
    "assetType": "IrEuropeanSwaption",

    // 产品标识
    "instrumentId": "SWPT_LPR1Y_3M3Y_PAY",

    // Swaption 名义本金
    "notionalAmount": notional,

    // Swaption 名义本金币种
    "notionalCurrency": "CNY",

    // swaption 的行权日
    "start": 2021.06.16,

    // 标的互换的最终到期日
    "maturity": 2024.06.18,

    // 执行利率
    "strike": fixedRate,

    // payoffType = Call
    "payoffType": "Call",

    // 标的互换
    "underlying": underlyingSwapDict,

    // swaption 自身使用的日计数规则
    "dayCountConvention": "Actual365"
}

// -----------------------------------------------------
// 将产品字典解析为 DDB 系统可识别的金融产品对象
// -----------------------------------------------------
swaption = parseInstrument(swaptionDict)

// =====================================================
// 四、构造收益率曲线节点日期
// =====================================================

curveDates = pricingDate + [1, 92, 183, 365, 730, 1095, 1460, 1825]

// =====================================================
// 五、构造贴现曲线 discount curve
// =====================================================

discountCurveInfo = {

    // 市场数据类型:Curve
    "mktDataType": "Curve",

    // 曲线类型:利率收益率曲线
    "curveType": "IrYieldCurve",

    // 曲线参考日
    "referenceDate": pricingDate,

    // 币种:人民币
    "currency": "CNY",

    // 曲线日计数规则
    "dayCountConvention": "Actual365",

    // 复利方式:连续复利
    "compounding": "Continuous",

    // 插值方法:线性插值
    "interpMethod": "Linear",

    // 外推方法:平推
    "extrapMethod": "Flat",

    // 复利频率
    "frequency": "NoFrequency",

    // 曲线期限节点日期
    "dates": curveDates,

    // 曲线各期限节点上的连续复利零息利率
    "values": take(0.029, size(curveDates))
}


// -----------------------------------------------------
// 将贴现曲线字典解析为 DDB 系统可识别的市场数据对象
// -----------------------------------------------------
discountCurve = parseMktData(discountCurveInfo)


// =====================================================
// 六、构造远期曲线 forward curve
// =====================================================

forwardCurveInfo = {

    // 市场数据类型:Curve
    "mktDataType": "Curve",

    // 曲线类型:利率收益率曲线
    "curveType": "IrYieldCurve",

    // 曲线参考日
    "referenceDate": pricingDate,

    // 币种:人民币
    "currency": "CNY",

    // 曲线日计数规则
    "dayCountConvention": "Actual365",

    // 复利方式:连续复利
    "compounding": "Continuous",

    // 插值方法:线性插值
    "interpMethod": "Linear",

    // 外推方法:平推
    "extrapMethod": "Flat",

    // 复利频率
    "frequency": "NoFrequency",

    // 曲线期限节点日期
    "dates": curveDates,

    // 曲线各期限节点上的连续复利零息利率
    "values": take(0.037, size(curveDates))
}

// -----------------------------------------------------
// 将远期曲线字典解析为 DDB 系统可识别的市场数据对象
// -----------------------------------------------------
forwardCurve = parseMktData(forwardCurveInfo)

// =====================================================
// 七、构造 Swaption 波动率立方体
// =====================================================

flatLpr1ySwaptionCube = {

    // 波动率立方体名称
    "cubeName": "CNY_LPR_1Y_SWAPTION",

    // 市场数据类型
    "mktDataType": "Cube",

    // Cube 类型
    "cubeType": "IrSwaptionVolatilityCube",

    // 参考日
    "referenceDate": pricingDate,

    // 币种
    "currency": "CNY",

    // 对应的浮动利率指数
    "iborIndex": "LPR_1Y",

    // ATM 期权到期期限
    "atmTerms": [0.25, 1.0, 2.0],

    // ATM 标的互换期限
    "atmTenors": [1.0, 3.0, 5.0],

    // ATM 波动率矩阵
    // 行对应 atmTerms,列对应 atmTenors
    "atmVols": matrix(
        [0.0055096937, 0.0058291888, 0.0060394000],
        [0.0060092120, 0.0063268352, 0.0065345735],
        [0.0063079263, 0.0066216700, 0.0068254044]
    ),

    // OTM 期权到期期限
    "otmTerms": [0.25, 1.0, 2.0],

    // OTM 标的互换期限
    "otmTenors": [1.0, 3.0, 5.0],

    // SABR 参数立方体
    "paramCube": {

        // alpha 控制基础波动率水平。
        "alpha": matrix(
            [0.0055, 0.0058, 0.0060],
            [0.0060, 0.0063, 0.0065],
            [0.0063, 0.0066, 0.0068]
        ),

        // beta 控制 SABR 模型形态。
        "beta": matrix(
            [0.0, 0.0, 0.0],
            [0.0, 0.0, 0.0],
            [0.0, 0.0, 0.0]
        ),

        // rho 表示 forward rate 与 volatility 随机扰动之间的相关性。
        "rho": matrix(
            [-0.20, -0.15, -0.10],
            [-0.20, -0.15, -0.10],
            [-0.15, -0.10, -0.05]
        ),

        // nu 表示 volatility of volatility
        "nu": matrix(
            [0.30, 0.25, 0.20],
            [0.28, 0.23, 0.18],
            [0.25, 0.20, 0.15]
        )
    }
}


// -----------------------------------------------------
// 将波动率立方体字典解析为 DDB 系统可识别的市场数据对象
// -----------------------------------------------------
volSurf = parseMktData(flatLpr1ySwaptionCube)

// =====================================================
// 八、设置定价输出项
// =====================================================

setting = dict(STRING, ANY)
setting["calcDelta"] = true
setting["calcGamma"] = true
setting["calcVega"] = true
setting["calcTheta"] = true
setting["calcRho"] = true


// =====================================================
// 九、调用欧式 swaption 定价器
// =====================================================

bachelierResult = irEuropeanSwaptionPricer(
    swaption,
    pricingDate,
    discountCurve,
    forwardCurve,
    volSurf,
    setting
)

// =====================================================
// 十、输出定价结果
// =====================================================

print("LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = " + string(bachelierResult))
/*
npv->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = 265595.520334303262643
delta->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = 92079255.637157037854194
gamma->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = 1.727311841805548E10
vega->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = 25749948.686961725354194
theta->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = -20524909.91052808612585
rho->LPR1Y_PAYER_SWAPTION_SAMPLE Bachelier result = 790326.494059825199656
*/

相关函数:parseInstrumentparseMktData

产品字段说明

字段名 类型 描述 是否必填
productType STRING 固定填 "Option"
optionType STRING 固定填 "EuropeanOption"
assetType STRING 固定填 "IrEuropeanSwaption"
instrumentId STRING 合约代码,标准格式为:“SWPT_参考利率_期权期限x利率互换期限C/P”比如:“SWPT_LPR1Y_1Y5YC” 表示参考利率为LPR1Y、期权期限为1Y的固定利率支付方利率互换期权,利率互换期限为5Y
start DATE 起息日
maturity DATE 到期日
strike DOUBLE 执行利率
payoffType STRING 枚举,可选 "Call" 和 "Put"
underlying DICT/INSTRUMENT 标的资产:可解析成 IrFixedFloatingSwap 对象的字典或者 IrFixedFloatingSwap 对象
dayCountConvention STRING 日期计数惯例, 可选 "ActualActualISDA", "ActualActualISMA", "Actual365", "Actual360"
discountCurve STRING 定价时参考的贴现曲线名称,人民币存款默认为 "CNY_FR_007"
forwardCurve STRING 定价时参考的远期曲线名称,如 "CNY_LPR_1Y"

波动率立方体字段说明

字段名 类型 描述 是否必填
cubeName STRING 波动率立方名称
mktDataType STRING 市场数据类型,固定填 "Cube"
cubeType STRING 曲面类型,固定填 "IrSwaptionVolatilityCube"
referenceDate DATE 参考日期
currency STRING 币种,例如 "CNY"
iborIndex STRING 标的利率互换的参考利率
atmTerms DOUBLE[] 平值期权的期限,以年化比例(year fraction)表示
atmTenors DOUBLE[] 平值期权标的利率互换的期限,以年化比例(year fraction)表示
atmVols DOUBLE Matrix 平值期权的波动率,形状为 size(atmTerms) * size(atmTenors)
otmTerms DOUBLE[] 虚值期权的期限,以年化比例(year fraction)表示
otmTenors DOUBLE[] 虚值期权标的利率互换的期限,以年化比例(year fraction)表示
paramCube Dict(String, Double Matrix) 虚值期权的波动率微笑参数。包含四个键 'alpha'、'beta'、'rho'、'nu',每个键对应一个参数,值为一个DOUBLE 类型矩阵,形状为 size(otmTerms) * size(otmTenors),矩阵中第i行第j列的值对应该参数在 otmTerms[i],otmTenors[j] 时的值。
volType STRING 波动率类型,默认值为 "Normal"