irSwaptionVolatilityCubeBuilder

首发版本:3.00.6

语法

irSwaptionVolatilityCubeBuilder(referenceDate, underlying, atmTenors, atmTerms, atmVols, otmTenors, otmTerms, otmStrikes, otmVols, discountCurve, forwardCurve, [volType='Normal'], [model='SABR'], [cubeName])

详情

构建利率互换期权波动率立方体。

参数

referenceDate DATE 类型标量,表示波动率立方体的参考日期。

underlying STRING 类型标量,表示标的利率互换名称。可选值为 "CNY_FR_007", "CNY_SHIBOR_3M", "CNY_LPR_1Y", "CNY_LPR_5Y"。

atmTenors DURATION 类型向量,表示平值期权标的利率互换期限。

atmTerms DURATION 类型向量,表示平值期权的期限。

atmVols DOUBLE 类型矩阵,表示平值期权的波动率。矩阵行数应与 atmTerms 长度一致,列数应与 atmTenors 长度一致。 矩阵第 i 行、第 j 列对应期限为 atmTerms[i]、标的利率互换期限为 atmTenors[j] 的平值期权波动率。

otmTenors DURATION 类型向量,表示虚值期权标的利率互换期限。

otmTerms DURATION 类型向量组成的元组, 表示虚值期权的期限。与 otmTenors 等长,otmTerms[i] 为 otmTenors[i] 对应的虚值期权的期限向量。

otmStrikes DOUBLE类型向量,表示虚值期权相对于远期 Swap Rate 的偏移的执行价(标准 Black/Bachelier forward-ATM 约定下,ATM strike 等于远期平价 Swap Rate)。

otmVols DOUBLE 类型矩阵组成的元组,表示虚值期权的波动率。长度与 otmTenors 一致,otmVols[i] 为 otmTenors[i] 对应的虚值期权的波动率矩阵。矩阵行数与 otmTerms[i] 长度一致,列数与 otmStrikes 长度一致。每个矩阵第 m 行、第 n 列对应期限为 otmTerms[i][m]、偏移为 otmStrikes[n] 的虚值期权波动率。

discountCurve 一个类型为 IrYieldCurve 的 MKTDATA 标量或向量,表示定价使用的折现曲线。

forwardCurve 一个类型为 IrYieldCurve 的 MKTDATA 标量或向量,表示定价使用的远期曲线。

volType 可选参数,STRING 类型标量,表示波动率类型,默认值为 "Normal"。可选值为:"Normal",表示正态波动率;"Lognormal",表示对数正态波动率。

model 可选参数,STRING 类型标量,表示构建波动率立方体使用的模型,目前仅支持 "SABR"。

cubeName 可选参数,STRING 类型标量,表示波动率立方体的名称,默认为 "IRSWAPTIONVOLCUBE/{underlying}",其中 underlying 为参数 underlying

返回值

MKTDATA 类型,一个 IrSwaptionVolatilityCube 对象,表示构建得到的利率互换期权波动率立方体。

例子

构建一个利率互换期权波动率立方体。

// =====================================================
// 一、自定义收益率曲线创建函数
// =====================================================
def createLpr1yFlatCurve(asOfDate, zeroRate){

    // -------------------------------------------------
    // 1. 构造收益率曲线的期限节点日期
    // -------------------------------------------------
    pillarDates = asOfDate + [1, 92, 183, 365, 730, 1095, 1460, 1825, 2555, 3650]

    // -------------------------------------------------
    // 2. 构造每个期限节点上的零利率
    // -------------------------------------------------
    pillarValues = take(zeroRate, size(pillarDates))
    
    // -------------------------------------------------
    // 3. 构造收益率曲线市场数据字典
    // -------------------------------------------------
    curveDict = {

        // 市场数据类型:Curve 表示曲线类市场数据
        "mktDataType": "Curve",

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

        // 曲线估值日
        "referenceDate": asOfDate,

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

        // 曲线名称
        "curveName": "CNY_LPR_1Y",

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

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

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

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

        // 付息频率:无频率
        "frequency": "NoFrequency",

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

        // 曲线各节点对应的零利率
        "values": pillarValues
    }

    // -------------------------------------------------
    // 4. 将字典解析为市场数据对象并返回
    // -------------------------------------------------
    return parseMktData(curveDict)
}

// =====================================================
// 二、创建估值日和人民币 LPR 1Y 平坦收益率曲线
// =====================================================
aod = 2021.03.18

// 创建一条零利率为 3.40% 的人民币 LPR 1Y 平坦收益率曲线
cnyCurve = createLpr1yFlatCurve(aod, 0.0340)

// =====================================================
// 三、定义 ATM Swaption 波动率网格
// =====================================================
// 期权到期期限
atmTerms = [6M, 1y, 2y]

// 标的互换期限,也可以理解为 swap tenor
atmTenors = [1y, 3y, 5y]

// -----------------------------------------------------
// 平值期权波动率矩阵
//
// atmVols 是一个 3 × 3 矩阵:
// 行对应 atmTerms,即期权到期期限:[6M, 1y, 2y]
// 列对应 atmTenors,即标的互换期限:[1y, 3y, 5y]
// DolphinDB中matrix为列优先,后续例子同理
// -----------------------------------------------------
atmVols = matrix(
    0.0058 0.0061 0.0063,
    0.0061 0.0065 0.0067,
    0.0064 0.0066 0.0069
)

// =====================================================
// 四、定义 OTM Swaption 波动率数据
// OTM = Out of The Money,表示虚值期权波动率。
// 这里通常用于描述不同 strike 偏移下的波动率微笑结构。
// =====================================================
// OTM 数据对应的标的互换期限
otmTenors = [1y, 3y, 5y]

// 每一个 OTM tenor 下,对应的 option term 列表
// 这里写成 [atmTerms, atmTerms, atmTerms],表示:对每个标的互换期限 1y、3y、5y,都使用相同的一组期权到期期限 [6M, 1y, 2y]。
otmTerms = [atmTerms, atmTerms, atmTerms]

// 虚值期权的 strike 偏移量
otmStrikes = [-0.0020, -0.0010, 0.0000, 0.0010, 0.0020]


// =====================================================
// 五、不同标的互换期限下的 OTM 波动率矩阵
//
// 每个矩阵对应一个 swap tenor。
// 例如:
// otmVols1y 对应标的互换期限为 1y;
// otmVols3y 对应标的互换期限为 3y;
// otmVols5y 对应标的互换期限为 5y。
// 每个矩阵是 3 × 5:
// 列对应 otmStrikes,共 5 个 strike 偏移;
// 行对应 option terms,即 [6M, 1y, 2y]。
// =====================================================

// -----------------------------------------------------
// 1. 标的互换期限为 1y 时的 OTM 波动率矩阵
// 列:otmStrikes = [-20bp, -10bp, 0bp, +10bp, +20bp]
// 行:atmTerms   = [6M, 1y, 2y]
// -----------------------------------------------------
otmVols1y = matrix(
    0.0063 0.0067 0.0068,
    0.0060 0.0065 0.0066,
    0.0058 0.0061 0.0063,
    0.0061 0.0064 0.0065,
    0.0063 0.0068 0.0069
)

// -----------------------------------------------------
// 2. 标的互换期限为 3y 时的 OTM 波动率矩阵
// 列:otmStrikes
// 行:atmTerms
// -----------------------------------------------------
otmVols3y = matrix(
    0.0066 0.0069 0.0072,
    0.0063 0.0066 0.0070,
    0.0061 0.0065 0.0067,
    0.0064 0.0067 0.0069,
    0.0067 0.0070 0.0071
)


// -----------------------------------------------------
// 3. 标的互换期限为 5y 时的 OTM 波动率矩阵
// 列:otmStrikes
// 行:atmTerms
// -----------------------------------------------------
otmVols5y = matrix(
    0.0070 0.0071 0.0074,
    0.0067 0.0069 0.0072,
    0.0064 0.0066 0.0069,
    0.0067 0.0068 0.0071,
    0.0070 0.0072 0.0075
)

// -----------------------------------------------------
// 将不同 swap tenor 下的 OTM 波动率矩阵放入一个列表中
// -----------------------------------------------------
otmVols = [otmVols1y, otmVols3y, otmVols5y]

// =====================================================
// 六、构建 Swaption 波动率立方体
// Swaption volatility cube 是在三个维度上组织波动率数据:
// 1. option term:期权到期期限,例如 6M、1y、2y
// 2. swap tenor:标的互换期限,例如 1y、3y、5y
// 3. strike:执行利率偏移,例如 -20bp、-10bp、ATM、+10bp、+20bp
// ATM 波动率矩阵提供平值波动率;
// OTM 波动率矩阵提供不同 strike 偏移下的波动率微笑信息。
// =====================================================
swaptionVolCube = irSwaptionVolatilityCubeBuilder(

    // 估值日
    aod,

    // 收益率曲线名称
    // 需要与前面 curveDict 中的 curveName 保持一致
    "CNY_LPR_1Y",

    // ATM 标的互换期限
    atmTenors,

    // ATM 期权到期期限
    atmTerms,

    // ATM 波动率矩阵
    atmVols,

    // OTM 标的互换期限
    otmTenors,

    // OTM 期权到期期限
    otmTerms,

    // OTM strike 偏移量
    otmStrikes,

    // OTM 波动率矩阵列表
    otmVols,

    // 贴现曲线
    cnyCurve,

    // 远期曲线
    cnyCurve
)
print(swaptionVolCube)

相关函数:parseMktData