fxEuropeanOptionPricer

First introduced in version: 3.00.4

Syntax

fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, foreignCurve, volSurf, [setting])

Details

Prices a foreign exchange European option using BlackScholes Model and Analytic Method, and returns its net present value (NPV).

Parameters

Note:
Scalar inputs will be automatically expanded to match the length of other vector inputs. All vector inputs must be of equal length.

instrument An INSTRUMENT scalar/vector representing the FX European option(s) to be priced. See Product Field Specifications for details.

pricingDate A DATE scalar/vector specifying the valuation date(s).

spot A numeric scalar/vector representing the spot FX rate(s).

domesticCurve A MKTDATA scalar/vector representing the domestic discount curve(s). See Curve Field Specifications for details.

foreignCurve A MKTDATA scalar/vector representing the foreign discount curve(s). See Curve Field Specifications for details.

volSurf A MKTDATA scalar/vector representing the FX volatility surface(s). See Curve Field Specifications for details.

setting (optional): A dictionary used to configure pricing outputs. It supports the following keys:

  • calcDelta: Set a boolean value to specify whether to calculate delta.

  • calcGamma: Set a boolean value to specify whether to calculate gamma.

  • calcVega: Set a boolean value to specify whether to calculate vega.

  • calcTheta: Set a boolean value to specify whether to calculate theta.

  • calcRhoDomestic: Set a boolean value to specify whether to calculate domestic rho.

  • calcRhoForeign: Set a boolean value to specify whether to calculate foreign rho.

Returns

A DOUBLE scalar/vector.

Examples

pricingDate = 2025.08.18
ccyPair = "USDCNY"

option = {
    "productType": "Option",
    "optionType": "EuropeanOption",
    "assetType": "FxEuropeanOption",
    "notionalCurrency": "USD",
    "notionalAmount": 1E6,
    "strike": 7.2,
    "maturity": 2025.10.28,
    "payoffType": "Call",
    "dayCountConvention": "Actual365",
    "underlying": ccyPair
}

quoteTerms = ['1d', '1w', '2w', '3w', '1M', '2M', '3M', '6M', '9M', '1y', '18M', '2y', '3y']
quoteNames = ["ATM", "D25_RR", "D25_BF", "D10_RR", "D10_BF"]
quotes = [0.030000, -0.007500, 0.003500, -0.010000, 0.005500, 
          0.020833, -0.004500, 0.002000, -0.006000, 0.003800, 
          0.022000, -0.003500, 0.002000, -0.004500, 0.004100, 
          0.022350, -0.003500, 0.002000, -0.004500, 0.004150, 
          0.024178, -0.003000, 0.002200, -0.004750, 0.005500, 
          0.027484, -0.002650, 0.002220, -0.004000, 0.005650, 
          0.030479, -0.002500, 0.002400, -0.003500, 0.005750, 
          0.035752, -0.000500, 0.002750,  0.000000, 0.006950, 
          0.038108,  0.001000, 0.002800,  0.003000, 0.007550, 
          0.039492,  0.002250, 0.002950,  0.005000, 0.007550, 
          0.040500,  0.004000, 0.003100,  0.007000, 0.007850, 
          0.041750,  0.005250, 0.003350,  0.008000, 0.008400, 
          0.044750,  0.006250, 0.003400,  0.009000, 0.008550]
quotes = reshape(quotes, size(quoteNames):size(quoteTerms)).transpose()

curveDates = [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]
              
domesticCurveInfo = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": pricingDate,
    "currency": "CNY",
    "dayCountConvention": "Actual365",
    "compounding": "Continuous",  
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": curveDates,
    "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
}
foreignCurveInfo = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "referenceDate": pricingDate,
    "currency": "USD",
    "dayCountConvention": "Actual365",
    "compounding": "Continuous",  
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "frequency": "Annual",
    "dates": curveDates,
    "values":[4.3345, 
              4.3801, 
              4.3119, 
              4.3065, 
              4.2922, 
              4.2196, 
              4.1599, 
              4.0443, 
              4.0244, 
              3.9698, 
              3.7740, 
              3.6289, 
              3.5003]/100
}

spot = 7.1627
instrument = parseInstrument(option)
domesticCurve = parseMktData(domesticCurveInfo)
foreignCurve = parseMktData(foreignCurveInfo)
surf = fxVolatilitySurfaceBuilder(pricingDate, ccyPair, quoteNames, quoteTerms, quotes, spot, domesticCurve, foreignCurve)

fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, foreignCurve, surf)   
// output: 1,677.5117
fxEuropeanOptionPricer([instrument, instrument], pricingDate, spot, domesticCurve, foreignCurve, surf)
// output: [1677.5117,1677.5117]
fxEuropeanOptionPricer(instrument, [pricingDate, pricingDate], spot, domesticCurve, foreignCurve, surf)
// output: [1677.5117,1677.5117]
fxEuropeanOptionPricer(instrument, pricingDate, [spot, spot], domesticCurve, foreignCurve, surf)
// output: [1677.5117,1677.5117]
fxEuropeanOptionPricer(instrument, pricingDate, spot, [domesticCurve, domesticCurve], foreignCurve, surf)
// output: [1677.5117,1677.5117]
fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, [foreignCurve, foreignCurve], surf)
// output: [1677.5117,1677.5117]
fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, foreignCurve, [surf, surf])
// output: [1677.5117,1677.5117]

Related functions: parseInstrument, parseMktData

Product Field Specifications

Field Name Data Type Description Required
productType STRING Must be "Option". Yes
optionType STRING Must be "EuropeanOption". Yes
assetType STRING Must be "FxEuropeanOption". Yes
notionalAmount DOUBLE Notional principal amount Yes
notionalCurrency STRING Notional principal Yes
instrumentId STRING InstrumentId ID No
maturity DATE Maturity date Yes
underlying STRING

The currency pair, in the format "EURUSD", "EUR.USD", or "EUR/USD". Supported currency pairs include:

  • "EURUSD": Euro to US Dollar

  • "USDCNY": US Dollar to Chinese Yuan

  • "EURCNY": Euro to Chinese Yuan

  • "GBPCNY": British Pound to Chinese Yuan

  • "JPYCNY": Japanese Yen to Chinese Yuan

  • "HKDCNY": Hong Kong Dollar to Chinese Yuan

Yes
direction STRING Trading direction, can be "Buy" or "Sell" Yes
strike DOUBLE Strike price Yes
dayCountConvention STRING The day count convention. It can be: "ActualActualISDA", "ActualActualISMA"," Actual365", "Actual360" Yes
payoffType STRING Payoff type. It can be "Call" or "Put". Yes
domesticCurve STRING The domestic discount curve name No
foreignCurve STRING The foreign discount curve name No
delivery DATE The delivery date No

Curve Field Specifications

IrYieldCurve

Field Name Data Type Description Required
mktDataType STRING Must be "Curve" Yes
referenceDate DATE Reference Date Yes
curveType STRING Must be "IrYieldCurve" Yes
dayCountConvention STRING

The day count convention to use. It can be:

  • "Actual360": actual/360

  • "Actual365": actual/365

  • "ActualActualISMA": actual/actual according to ISMA (International Securities Market Association) convention

  • "ActualActualISDA": actual/actual according to ISDA (International Swaps and Derivatives Association) convention.

Yes
interpMethod STRING

Interpolation method. It can be:

  • "Linear": linear interpolation

  • "CubicSpline": cubic spline interpolation

  • "CubicHermiteSpline": cubic Hermite interpolation

Yes
extrapMethod STRING

Extrapolation method. It can be

  • Flat: flat extrapolation

  • Linear: linear extrapolation

Yes
dates DATE vector Date of each data point Yes
values DOUBLE vector Value of each data point, corresponding to the elements in dates. Yes
curveName STRING Curve name No
currency STRING Currency. It can be CNY", "USD", "EUR", "GBP", "JPY", "HKD" Yes
compounding STRING

The compounding interest. It can be:

  • "Compounded": discrete compounding

  • "Simple": simple interest (no compounding).

  • "Continuous": continuous compounding.

Yes
settlement DATE Settlement date. If specified, all subsequent tenor intervals are computed starting from "settlement" rather than from "referenceDate". No
frequency INTEGRAL/STRING

The interest payment frequency. Supported values:

  • -1 or "NoFrequency": No payment frequency

  • 0 or "Once": Single lump-sum payment of principal and interest at maturity.

  • 1 or "Annual": Annually

  • 2 or "Semiannual": Semiannually

  • 3 or "EveryFourthMonth": Every four months

  • 4 or "Quarterly": Quarterly

  • 6 or "BiMonthly": Every two months

  • 12 or "Monthly": Monthly

  • 13 or "EveryFourthWeek": Every four weeks

  • 26 or "BiWeekly": Every two weeks

  • 52 or "Weekly": Weekly

  • 365 or "Daily": Daily

  • 999 or "Other": Other frequencies

No
curveModel STRING

Curve construction model; It can be "Bootstrap" (default), "NS", "NSS".

When the value is "NSS" or "NS", the fields interpMethod, extrapMethod, dates, and values are not required.

No
curveParams DICT

Model parameters. It is required when curveModel is "NSS" or "NS":

  • If curveModel = "NS": must include keys 'beta0', 'beta1', 'beta2', 'lambda'.

  • If curveModel = "NSS": must include keys 'beta0', ‘beta1', 'beta2', 'beta3', 'lambda0', 'lambda1'.

No

FxVolatilitySurface

Field Name Data Type Description Required
mktDataType STRING Must be "Surface" Yes
referenceDate DATE Reference Date Yes
surfaceType STRING Must be "FxVolatilitySurface" Yes
smileMethod STRING

Volatility smile method. It can be:

  • "Linear": linear smile

  • "CubicSpline": cubic-spline smile

  • "SVI": SVI-model smile

  • "SABR": SABR-model smile

Yes
volSmiles DICT(STRING, ANY)vector

Volatility smiles vector. Each element is one smile . It has the following members:

  • strikes: A DOUBLE vector indicating the strike prices.

  • vols: A DOUBLE vector indicating the volatilities corresponding to strikes (of the same length).

  • curveParams: A DICT(STRING, DOUBLE) indicating the model parameters for the smile method; only effective when smileMethod is "SVI" or "SABR":

    • smileMethod = 'SVI': Must have the keys: 'a', 'b', 'rho', 'm', 'sigma'

    • smileMethod = 'SABR':

      Must have the keys: 'alpha', 'beta', 'rho', 'nu'

  • fwd (optional ): A DOUBLE scalar indicating the forward value. It is required when smileMethod is "SVI" or "SABR".

Yes
termDates DATE vector Term date corresponding to each smile in volSmiles. Yes
surfaceName STRING Surface name No
currencyPair STRING

Foreign exchange currency pair. Available options: "EURUSD", "USDCNY", "EURCNY", "GBPCNY", "JPYCNY", "HKDCNY".

Currency pairs may also use . or / as separators. For example, "EURUSD" can also be written as "EUR.USD" or "EUR/USD".

Yes