createPricingEngine

首发版本:3.00.5

语法

createPricingEngine(name, instrument, [handler], [engineConfig], [setting], [model], [method])

详情

创建实时估值定价引擎。该引擎支持调用 DolphinDB 内置估值定价函数,也支持用户传入自定义函数。

定价引擎目前支持以下资产类型的内置定价函数:

资产类型 函数名 描述
固收 (Fixed Income) bondPricer 债券定价(支持贴现债、零息债、固定利率债)
bondFuturesPricer 国债期货定价
利率 (Interest Rate) irDepositPricer 存款定价
irFixedFloatingSwapPricer 标准利率互换定价
外汇 (FX) fxForwardPricer 外汇远期定价
fxSwapPricer 外汇掉期定价
fxEuropeanOptionPricer 外汇欧式期权定价

参数

name 字符串标量,表示引擎名称。该参数是引擎在一个数据节点上的唯一标识,可包含字母,数字和下划线,但必须以字母开头。

instrument INSTRUMENT 类型标量或向量,表示待定价的金融工具。定价过程中,市场数据匹配规则遵循 instrumentPricer 的规范。

handler 可选参数,一个自定义函数,用于处理定价完成后的结果输出。

  • engineConfig 中设置 outputTime = true,函数签名为 def(eventTime, name, date, npv, [greek...])
  • engineConfig 中设置 outputTime = false(默认值),函数签名为 def(name, date, npv, [greek...])

参数说明如下:

  • eventTime:NANOTIMESTAMP,触发事件的时间。
  • name:STRING,定价对象的 instrumentId。
  • date:DATE,定价日期。
  • npv:DOUBLE,定价结果的净值。
  • greek:DOUBLE 或 DOUBLE[],greek 指标。greek 列名和定价函数中的返回值保持一致,例如对于 bondPricer,关键利率久期对应的列名为 discountCurveKeyRateDuration。greek 的输出顺序固定如下,未指定的 greek 输出时会跳过:delta、gamma、vega、theta、rho、rhoDemestic、rhoForeign、rhoIr、rhoDividend、volga、vanna、discountCurveDelta、discountCurveGamma、discountCurveKeyRateDuration。

engineConfig 可选参数,一个字典,用于设置引擎运行配置。字典包含如下键值对:

  • numThreads:可选,整型标量,表示工作线程数,默认 8。设为 0 表示同步执行。

  • maxQueueDepth:可选,整型标量,表示最大队列深度,默认 10,000,000。

  • useSystemTime:可选,布尔标量,表示是否使用系统时间作为事件时间。默认为 true,使用系统时间作为事件时间。

  • timeColumn:可选,字符串标量,指定时间列作为事件时间。若指定该参数,必须将 useSystemTime 设置为 false。

  • outputTime:可选,布尔标量,表示是否输出事件时间列。默认值为 false。

setting 可选参数,字典(<STRING, ANY>),指定定价设置。不同资产支持的定价设置请参考对应定价函数中的 setting 参数。

  • 键:字符串,指定资产分类的路径。路径通常包含两到三层,各层之间以句点连接。比如对于贴现债,指定 "Cash.Bond.DiscountBond"。不同产品、资产、金融工具的类型标识符请参考 INSTRUMENT 类型

  • 值:字典(<STRING, ANY>),指定是否计算某个 Greek 指标以及设置计算对应指标所需的参数。支持局部配置和全局配置两种方式;指定局部配置时,全局默认值需要在 default 字段中配置。

    • 局部配置:

      { 
        "default": {
          "calcDiscountCurveDelta": true,
          "calcDiscountCurveKeyRateDuration": true,
          "discountCurveShift": 0.0001,
          "discountCurveKeyTerms": [1.0, 3.0, 5.0],
          "discountCurveKeyShifts": [0.0002, 0.0003, 0.0001]
        },
        "Cash.Bond.FixedRateBond": {
          "calcDiscountCurveGamma": true,
        },
        "Cash.Bond.OptionBond": {
          "calcDiscountCurveGamma": false,
          "useExerciseCashflow": true
        }
      }
    • 全局配置:

      {
          "calcDiscountCurveDelta": true,
          "calcDiscountCurveGamma": true,
          "calcDiscountCurveKeyRateDuration": true,
          "discountCurveShift": 0.0001,
          "discountCurveKeyTerms": [1.0, 3.0, 5.0],
          "discountCurveKeyShifts": [0.0002, 0.0003, 0.0001]
      }}

model 可选参数,字符串或字典(<STRING, ANY>),指定定价模型。不同金融工具支持的模型参考对应定价函数中的 model 参数。

  • 传入字符串时,比如 model="DCF",表示所有金融工具都使用该模型定价。

  • 传入字典时,其格式与 setting 参数类似,示例如下:

{
  "Cash.Bond.FixedRateBond": "DCF",
  "Cash.Bond.OptionBond": "DCF"
}

method 可选参数,字符串或字典(<STRING, ANY>),指定定价方法。不同金融工具支持的方法参考对应定价函数中的 method 参数。

  • 传入字符串时,比如 method= "Analytic",表示所有金融工具都使用该方法定价。

  • 传入字典时,其格式与 setting 参数类似,示例如下:

{
  "Cash.Bond.FixedRateBond": "Analytic",
  "Cash.Bond.OptionBond": "Analytic"
}

返回值

返回一个定价引擎句柄。

例子

例1. 本例中定义待定价金融工具 240025.IB,根据 instrumentPricer 的默认规则,该工具将使用名为 CNY_TREASURY_BOND 的市场数据。通过调用 appendMktData 接口将相关市场数据写入定价引擎。

try{dropStreamEngine("PRICING_ENGINE")}catch(ex){}

bondDict  = {
    "productType": "Cash",
    "assetType": "Bond",
    "bondType": "FixedRateBond",
    "instrumentId": "240025.IB",
    "start": 2024.12.25,
    "maturity": 2031.12.25,
    "issuePrice": 100.0,
    "coupon": 0.0149,
    "frequency": "Annual",
    "dayCountConvention": "ActualActualISDA"
}
instrument = parseInstrument(bondDict)

pricingDate = 2025.08.18

curveDict = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": pricingDate,
    "currency": "CNY",
    "curveName": "CNY_TREASURY_BOND",
    "dayCountConvention": "ActualActualISDA",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [
        2025.09.18, 2025.11.18, 2026.02.18, 2026.08.18, 2027.08.18,
        2028.08.18, 2030.08.18, 2032.08.18, 2035.08.18, 2040.08.18,
        2045.08.18, 2055.08.18, 2065.08.18, 2075.08.18
    ],
    "values": [
        1.3000, 1.3700, 1.3898, 1.3865, 1.4299,
        1.4471, 1.6401, 1.7654, 1.7966, 1.9930,
        2.1834, 2.1397, 2.1987, 2.2225
    ] \ 100.0
}

discountCurve = parseMktData(curveDict)

share streamTable(1:0, `name`date`price, [STRING, DATE, DOUBLE]) as st

def myHandler(name, date, price) {
    tableInsert(st, name, date, price)
}

engine = createPricingEngine("PRICING_ENGINE", [instrument], myHandler)

appendMktData(engine, discountCurve)

select * from st
name date price
240025.IB 2025.08.18 99.60

例2. 本例以 10 年期国债期货 T2409 为例,先清理并创建 FuturesEngine,通过回调函数将引擎返回的 npv 写入结果表;随后分别构造可交割国债和国债期货合约,配置转换因子、结算日等关键参数,并插入国债收益率曲线作为贴现曲线,最终查看期货合约的估值结果。

// 清理历史同名引擎,避免重复创建时报错
try{dropStreamEngine("FuturesEngine")}catch(ex){}

// 创建结果表,用于接收并保存期货定价引擎回调返回的估值结果
share streamTable(1000:0, `engineName`instrumentId`npv`updateTime, [STRING, STRING, DOUBLE, TIMESTAMP]) as futuresResult

// 定义回调函数:每次引擎完成计算后,将合约名称、NPV 和更新时间写入结果表
def futuresHandler(name, date, npv){
    tableInsert(futuresResult, "FuturesEngine", name, npv, now())
}

// 构造可交割国债,作为国债期货 T2409 的标的券
underlyingBond = parseInstrument({
    "productType": "Cash",
    "assetType": "Bond",
    "bondType": "FixedRateBond",
    "instrumentId": "UNDERLYING_BOND",
    "start": 2020.09.15,
    "maturity": 2030.09.15,
    "issuePrice": 100.0,
    "coupon": 0.03,
    "frequency": "Annual",
    "dayCountConvention": "ActualActualISDA",
    "currency": "CNY",
    "subType": "TREASURY_BOND",
    "discountCurve": "CNY_TREASURY_BOND"
})

// 构造国债期货合约,重点设置标的券、名义票息、转换因子和交割结算日
futuresIns = parseInstrument({
    "productType": "Futures",
    "futuresType": "BondFutures",
    "instrumentId": "T2409",
    "nominal": 100.0,
    "maturity": 2024.09.13,
    "settlement": 2024.09.17,
    "underlying": underlyingBond,
    "nominalCouponRate": 0.03,
    "conversionFactor": 0.9812
})

// 创建期货定价引擎,并绑定待估值合约与回调函数
engine = createPricingEngine("FuturesEngine", futuresIns, futuresHandler)

// 构造国债收益率曲线;curveName 需与标的券中的 discountCurve 保持一致
discountCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2024.09.10,
    "currency": "CNY",
    "curveName": "CNY_TREASURY_BOND",
    "dayCountConvention": "ActualActualISDA",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2024.12.10, 2025.12.10, 2026.12.10],
    "values": [0.000180, 0.000190, 0.000200]
})

// 向引擎追加市场数据,触发估值计算并通过 futuresHandler 写入结果表
appendMktData(engine, discountCurve)

// 查看 T2409 的估值结果
select * from futuresResult
engineName instrumentId npv updateTime
FuturesEngine T2409 117.84882688404052 2026.08.27 11:45:47.979

例3. 本例以 3 个月人民币定期存款为例,展示定价引擎如何根据本金、合同利率和贴现曲线,计算存款现值和应计利息。

// 清理历史同名引擎,避免重复创建时报错
try{dropStreamEngine("DepositEngine")}catch(ex){}

// 创建结果表,用于接收并保存存款定价引擎回调返回的估值结果
share streamTable(1000:0, `engineName`instrumentId`npv`updateTime, [STRING, STRING, DOUBLE, TIMESTAMP]) as depositResult

// 定义回调函数:每次引擎完成计算后,将合约名称、NPV 和更新时间写入结果表
def depositHandler(name, date, npv){
    tableInsert(depositResult, "DepositEngine", name, npv, now())
}

// 构造 3 个月人民币定期存款。Deposit 的本金币种字段必须使用 notionalCurrency;
// 同时本金金额使用 notionalAmount,与利率互换示例保持一致。
depositIns = parseInstrument({
    "productType": "Cash",
    "assetType": "Deposit",
    "instrumentId": "DEP_3M",
    "start": 2026.08.27,
    "maturity": 2026.11.27,
    "rate": 0.018,
    "dayCountConvention": "Actual360",
    "notionalCurrency": "CNY",
    "notionalAmount": 1000000.0,
    "payReceive": "Receive",
    "discountCurve": "CNY_DISC_CURVE"
})

// 创建存款定价引擎,并绑定待估值合约与回调函数
engine = createPricingEngine("DepositEngine", depositIns, depositHandler)

// 构造贴现曲线市场数据;curveName 与存款合约中的 discountCurve 对应
discountCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "CNY_DISC_CURVE",
    "dayCountConvention": "Actual360",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2026.09.27, 2026.11.27, 2027.02.27, 2027.08.27],
    "values": [0.0155, 0.0165, 0.0170, 0.0180]
})

// 向引擎追加市场数据,触发估值计算并通过 depositHandler 写入结果表
appendMktData(engine, discountCurve)

// 查看 DEP_3M 的估值结果
select * from depositResult
engineName instrumentId npv updateTime
DepositEngine DEP_3M 1,000,407.2780936392 2026.08.27 13:40:39.896

例4. 本例以一笔 5 年期固定兑浮动利率互换为例,帮助用户理解如何用贴现曲线和浮动端参考曲线估算互换价值,并查看 NPV、两端 PV 和 DV01。

// 清理历史同名引擎,避免重复创建时报错
try{dropStreamEngine("SwapEngine")}catch(ex){}

// 创建结果表,用于接收并保存利率互换定价引擎回调返回的估值结果
share streamTable(
    1000:0,
    `engineName`instrumentId`npv`updateTime,
    [STRING, STRING, DOUBLE, TIMESTAMP]
) as swapResult

// 定义回调函数:每次引擎完成计算后,将合约名称、NPV 和更新时间写入结果表
def swapHandler(name, date, npv){
    tableInsert(swapResult, "SwapEngine", name, npv, now())
}

// 构造 5 年期固定兑浮动利率互换;
// FR_007 互换除了 discountCurve / forwardCurve
// 还需要 assetPriceCurve,用于浮动端历史定盘数据
irsIns = parseInstrument({
    "productType": "Swap",
    "swapType": "IrSwap",
    "irSwapType": "IrFixedFloatingSwap",
    "instrumentId": "IRS_FR007_5Y",

    "start": 2026.08.27,
    "maturity": 2031.08.27,
    "frequency": "Quarterly",

    "fixedRate": 0.0385,
    "calendar": "CFET",
    "fixedDayCountConvention": "Actual365",
    "floatingDayCountConvention": "Actual365",

    "payReceive": "Pay",
    "iborIndex": "FR_007",
    "spread": 0.0,

    "notionalCurrency": "CNY",
    "notionalAmount": 10000000.0,

    // 三条曲线名称要和后面市场数据里的 curveName 保持一致
    "discountCurve": "CNY_DISC_CURVE",
    "forwardCurve": "FR007_FWD_CURVE",
    "assetPriceCurve": "PRICE_FR_007"
})

// 创建利率互换定价引擎,并绑定待估值合约与回调函数
engine = createPricingEngine(
    "SwapEngine",
    irsIns,
    swapHandler
)

// 构造人民币贴现曲线;curveName 与互换合约中的 discountCurve 对应
discountCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "CNY_DISC_CURVE",

    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",

    "dates": [
        2026.11.27,
        2027.08.27,
        2028.08.27,
        2029.08.27,
        2031.08.27
    ],
    "values": [
        0.0180,
        0.0185,
        0.0190,
        0.0200,
        0.0220
    ]
})

// 构造 FR007 远期曲线;curveName 与互换合约中的 forwardCurve 对应
forwardCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "FR007_FWD_CURVE",

    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",

    "dates": [
        2026.11.27,
        2027.02.27,
        2027.08.27,
        2028.08.27,
        2031.08.27
    ],
    "values": [
        0.0195,
        0.0200,
        0.0210,
        0.0220,
        0.0240
    ]
})

// 构造 FR007 历史定盘数据曲线。这是 IRS 定价非常关键的一条市场数据
// curveType 必须是 AssetPriceCurve
// curveName 要和 instrument 中的 assetPriceCurve 对应
fixingDates = 2026.05.19..2026.08.26
fixingRates = take(0.0190, size(fixingDates))

assetPriceCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "AssetPriceCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "PRICE_FR_007",

    // 历史 FR007 定盘利率
    "dates": fixingDates,
    "values": fixingRates
})

// 一次性追加三条市场数据,触发估值
appendMktData(engine, [discountCurve, forwardCurve, assetPriceCurve])


// 查看估值结果
select * from swapResult
engineName instrumentId npv updateTime
SwapEngine IRS_FR007_5Y -701,240.0307065442 2026.08.27 14:35:55.568

例5. 本例以 6 个月 USD/CNY 外汇远期为例,说明远期汇率如何受即期汇率和两种货币利率曲线影响,并输出远期理论汇率和合约 NPV。

// 清理历史同名引擎
try{dropStreamEngine("FxFwdEngine")}catch(ex){}

// 结果表
share streamTable(1000:0, `engineName`instrumentId`npv`updateTime, [STRING, STRING, DOUBLE, TIMESTAMP]) as fxFwdResult

// 回调函数
def fxFwdHandler(name, date, npv){
    tableInsert(fxFwdResult, "FxFwdEngine", name, npv, now())
}

// 构造外汇远期合约:使用 domesticCurve / foreignCurve
fxFwdIns = parseInstrument({
    "productType": "Forward",
    "forwardType": "FxForward",
    "instrumentId": "USDCNY_6M_FWD",
    "expiry": 2027.02.27,
    "delivery": 2027.03.01,
    "currencyPair": "USDCNY",
    "direction": "Buy",
    "notionalCurrency": "USD",
    "notionalAmount": 1000000.0,
    "strike": 7.10,
    "domesticCurve": "CNY_DISC_CURVE",
    "foreignCurve": "USD_DISC_CURVE"
})

// 创建引擎
engine = createPricingEngine("FxFwdEngine", fxFwdIns, fxFwdHandler)

// FX 即期汇率市场数据
spot = parseMktData({
    "mktDataType": "Price",
    "priceType": "FxSpotRate",
    "referenceDate": 2026.08.27,
    "spotDate": 2026.08.29,
    "value": 7.1200,
    "unit": "USDCNY"
})

// 人民币贴现曲线
cnyCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "CNY_DISC_CURVE",
    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2026.09.27, 2026.11.27, 2027.02.27],
    "values": [0.0155, 0.0165, 0.0170]
})

// 美元贴现曲线
usdCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "USD",
    "curveName": "USD_DISC_CURVE",
    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2026.09.27, 2026.11.27, 2027.02.27],
    "values": [0.0440, 0.0430, 0.0415]
})

// 触发定价
appendMktData(engine, spot)
appendMktData(engine, cnyCurve)
appendMktData(engine, usdCurve)

// 查看结果
select * from fxFwdResult
engineName instrumentId npv updateTime
FxFwdEngine USDCNY_6M_FWD -65,285.58303391563 2026.08.27 14:16:54.106

例6. 本例以一笔 USD/CNY 外汇掉期为例,展示如何评估近端和远端两笔换汇现金流的价值,并得到掉期点、分段 PV 和整体 NPV。

// 清理历史同名引擎
try{dropStreamEngine("FxSwapEngine")}catch(ex){}

// 结果表
share streamTable(1000:0, `engineName`instrumentId`npv`updateTime, [STRING, STRING, DOUBLE, TIMESTAMP]) as fxSwapResult

// 回调函数
def fxSwapHandler(name, date, npv){
    tableInsert(fxSwapResult, "FxSwapEngine", name, npv, now())
}

// 构造 USD/CNY 外汇掉期;同时使用 domesticCurve / foreignCurve 指定曲线名
fxSwapIns = parseInstrument({
    "productType": "Swap",
    "swapType": "FxSwap",
    "instrumentId": "USDCNY_SWAP",
    "currencyPair": "USDCNY",
    "direction": "Buy",
    "notionalCurrency": "USD",
    "notionalAmount": 1000000.0,
    "nearStrike": 7.12,
    "nearExpiry": 2026.09.27,
    "nearDelivery": 2026.09.29,
    "farStrike": 7.15,
    "farExpiry": 2027.03.27,
    "farDelivery": 2027.03.29,
    "domesticCurve": "CNY_DISC_CURVE",
    "foreignCurve": "USD_DISC_CURVE"
})


// 创建引擎
engine = createPricingEngine("FxSwapEngine", fxSwapIns, fxSwapHandler)

// 即期汇率
spot = parseMktData({
    "mktDataType": "Price",
    "priceType": "FxSpotRate",
    "referenceDate": 2026.08.27,
    "spotDate": 2026.08.29,
    "value": 7.1200,
    "unit": "USDCNY"
})

// 人民币贴现曲线
cnyCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "CNY_DISC_CURVE",
    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2026.09.27, 2027.03.27],
    "values": [0.0155, 0.0170]
})

// 美元贴现曲线
usdCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "USD",
    "curveName": "USD_DISC_CURVE",
    "dayCountConvention": "Actual365",
    "compounding": "Compounded",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": [2026.09.27, 2027.03.27],
    "values": [0.0440, 0.0415]
})

// 触发定价
appendMktData(engine, spot)
appendMktData(engine, cnyCurve)
appendMktData(engine, usdCurve)

// 查看结果
select * from fxSwapResult
engineName instrumentId npv updateTime
FxSwapEngine USDCNY_SWAP 109,673.96002695739 2026.08.27 14:20:02.733

例7. 本例以 3 个月 USD/CNY 欧式看涨期权为例,帮助用户了解期权定价中即期汇率、利率曲线和隐含波动率的作用,并查看理论价值及 Delta、Gamma、Vega 等希腊值。

// 清理历史同名引擎,避免重复创建时报错
try{dropStreamEngine("FxOptEngine")}catch(ex){}

// 创建结果表
share streamTable(
    1000:0,
    `engineName`instrumentId`npv`updateTime,
    [STRING, STRING, DOUBLE, TIMESTAMP]
) as fxOptResult

// 定义回调函数
// createPricingEngine 默认 handler 签名为 def(name, date, npv)
def fxOptHandler(name, date, npv){
    tableInsert(fxOptResult, "FxOptEngine", name, npv, now())
}

// 构造 3 个月 USD/CNY 欧式看涨期权;
// 1)underlying 用货币对
// 2)domesticCurve / foreignCurve 指定曲线名
fxOptIns = parseInstrument({
    "productType": "Option",
    "optionType": "EuropeanOption",
    "assetType": "FxEuropeanOption",
    "instrumentId": "USDCNY_CALL_7.2",
    "notionalCurrency": "USD",
    "notionalAmount": 1000000.0,
    "strike": 7.20,
    "maturity": 2026.11.27,
    "delivery": 2026.11.29,
    "payoffType": "Call",
    "direction": "Buy",
    "dayCountConvention": "Actual365",
    "underlying": "USDCNY",
    // 自定义两条曲线名称
    // 后续 IrYieldCurve 的 curveName 必须与这里一致
    "domesticCurve": "CNY_DISC_CURVE",
    "foreignCurve": "USD_DISC_CURVE"
})

// 创建定价引擎
engine = createPricingEngine("FxOptEngine", fxOptIns, fxOptHandler)

// 构造 USD/CNY 即期汇率。
// 对定价引擎来说,FX spot 应使用 Price / FxSpotRate
// unit 使用货币对名称,和 underlying 对应
spot = parseMktData({
    "mktDataType": "Price",
    "priceType": "FxSpotRate",
    "referenceDate": 2026.08.27,
    "spotDate": 2026.08.29,
    "value": 7.1200,
    "unit": "USDCNY"
})

// 构造人民币贴现曲线
// curveName 与 instrument 中 domesticCurve 对应
cnyCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "CNY",
    "curveName": "CNY_DISC_CURVE",

    "dayCountConvention": "Actual365",
    "compounding": "Continuous",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",

    "dates": [
        2026.09.27,
        2026.11.27,
        2027.02.27
    ],
    "values": [
        0.0155,
        0.0165,
        0.0170
    ]
})

// 构造美元贴现曲线
// curveName 与 instrument 中 foreignCurve 对应
usdCurve = parseMktData({
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": 2026.08.27,
    "currency": "USD",
    "curveName": "USD_DISC_CURVE",

    "dayCountConvention": "Actual365",
    "compounding": "Continuous",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",

    "dates": [
        2026.09.27,
        2026.11.27,
        2027.02.27
    ],
    "values": [
        0.0440,
        0.0430,
        0.0415
    ]
})

//  构造 USD/CNY 外汇波动率曲面
volSurf = parseMktData({
    "mktDataType": "Surface",
    "surfaceType": "FxVolatilitySurface",
    "referenceDate": 2026.08.27,
    "surfaceName": "USDCNY",
    "currencyPair": "USDCNY",

    "smileMethod": "Linear",

    // termDates 和 volSmiles 一一对应
    "termDates": [
        2026.11.27,
        2027.02.27
    ],

    "volSmiles": [
        {
            "strikes": [6.8, 7.2, 7.6],
            "vols": [0.0550, 0.0550, 0.0550]
        },
        {
            "strikes": [6.8, 7.2, 7.6],
            "vols": [0.0560, 0.0560, 0.0560]
        }
    ]
})

// 一次性追加全部市场数据,触发估值
appendMktData(engine, [spot, cnyCurve, usdCurve, volSurf])

// 查看估值结果
select * from fxOptResult
engineName instrumentId npv updateTime
FxOptEngine USDCNY_CALL_7.2 4,306.487653692539 2026.08.27 14:40:36.151

例8. 本例对固定利率债(FixedRateBond)定价。除计算净现值(NPV)外,还通过 modelmethod 参数指定定价模型和定价方法,并通过 setting 参数计算 Greeks 指标。

第一步:定义待定价的合约

bond = {
   "productType": "Cash",
   "assetType": "Bond",
   "bondType": "FixedRateBond",
   "instrumentId": "240025.IB",
   "start": 2024.12.25,
   "maturity": 2031.12.25,
   "issuePrice": 100.0,
   "coupon": 0.0149,
   "frequency": "Annual",
   "dayCountConvention": "ActualActualISDA"
}
fixedRateBond = parseInstrument(bond)

第二步:定义定价需要用到的市场数据

pricingDate = 2025.08.18
curve = {
  "mktDataType": "Curve",
  "curveType": "IrYieldCurve",
  "referenceDate": pricingDate,
  "currency": "CNY",
  "curveName": "CNY_TREASURY_BOND",
  "dayCountConvention": "ActualActualISDA",
  "compounding": "Compounded",
  "interpMethod": "Linear",
  "extrapMethod": "Flat",
  "frequency": "Annual",
  "dates":[2025.09.18, 2025.11.18, 2026.02.18, 2026.08.18, 2027.08.18, 2028.08.18, 2030.08.18,
      2032.08.18, 2035.08.18, 2040.08.18, 2045.08.18, 2055.08.18,2065.08.18, 2075.08.18],
  "values":[1.3000, 1.3700, 1.3898, 1.3865, 1.4299, 1.4471, 1.6401,
       1.7654, 1.7966, 1.9930, 2.1834, 2.1397, 2.1987, 2.2225] / 100.0
}
discountCurve = parseMktData(curve)

第三步:指定定价设置、定价模型和定价方法

// 定价设置
setting = dict(STRING, ANY)
setting["Cash.Bond.FixedRateBond"] = {
    "calcDiscountCurveDelta": true,
    "calcDiscountCurveGamma": true,
    "calcDiscountCurveKeyRateDuration": true,
    "discountCurveShift": 0.0001,
    "discountCurveKeyTerms": [1.0, 3.0, 5.0],
    "discountCurveKeyShifts": [0.0002, 0.0003, 0.0001]
}

// 定价模型
model = {
    "Cash.Bond.FixedRateBond": "DCF"
}

// 定价方法
method = {
    "Cash.Bond.FixedRateBond": "Analytic"
}

第四步:定义回调函数,每次引擎完成计算后,将合约名称、NPV、Greeks 和定价日期写入结果表

share streamTable(1000:0, `engineName`instrumentId`npv`discountCurveDelta`discountCurveGamma`discountCurveKeyRateDuration`pricingDate, [STRING, STRING, DOUBLE, DOUBLE, DOUBLE, DOUBLE[], TIMESTAMP]) as result

def resultHandler(name, date, npv, discountCurveDelta, discountCurveGamma, discountCurveKeyRateDuration){
    tableInsert(result, "fixedRateBondPricer", name, npv, discountCurveDelta, discountCurveGamma, [discountCurveKeyRateDuration], date)
}

第五步:创建定价引擎并插入市场数据

engine = createPricingEngine("fixedRateBondPricer", fixedRateBond, resultHandler, , setting, model, method)

appendMktData(engine, discountCurve)

第六步:查看定价结果

select * from result
engineName instrumentId npv discountCurveDelta discountCurveGamma discountCurveKeyRateDuration pricingDate
fixedRateBondPricer 240025.IB 99.60084681135089 -592.2599412782859 4,223.064257757869 [0.012669167121743475, 0.06998233298563586, 1.9557862057092341] 2025.08.18 00:00:00.000

相关函数appendMktDatacreateMktDataEngine