fxEuropeanOptionPricer
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
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: 1693.9919
fxEuropeanOptionPricer([instrument, instrument], pricingDate, spot, domesticCurve, foreignCurve, surf)
fxEuropeanOptionPricer(instrument, [pricingDate, pricingDate], spot, domesticCurve, foreignCurve, surf)
fxEuropeanOptionPricer(instrument, pricingDate, [spot, spot], domesticCurve, foreignCurve, surf)
fxEuropeanOptionPricer(instrument, pricingDate, spot, [domesticCurve, domesticCurve], foreignCurve, surf)
fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, [foreignCurve, foreignCurve], surf)
fxEuropeanOptionPricer(instrument, pricingDate, spot, domesticCurve, foreignCurve, [surf, surf])
Related functions: parseInstrument, parseMktData
Product Field Specifications
| Field Name | Data Type | Description | Required |
|---|---|---|---|
| productType | STRING | Must be "Option" | √ |
| optionType | STRING | Must be "EuropeanOption" | √ |
| assetType | STRING | Must be "FxEuropeanOption" | √ |
| notionalAmount | DOUBLE | Notional principal amount | √ |
| notionalCurrency | STRING | Notional principal | √ |
| instrumentId | STRING | InstrumentId ID | × |
| maturity | DATE | Maturity date | √ |
| underlying | STRING |
The currency pair, in the format "EURUSD", "EUR.USD", or "EUR/USD". Supported currency pairs include:
|
√ |
| direction | STRING | Trading direction, can be "Buy" or "Sell" | √ |
| strike | DOUBLE | Strike price | √ |
| dayCountConvention | STRING | The day count convention. It can be: "ActualActualISDA", "ActualActualISMA"," Actual365", "Actual360" | √ |
| payoffType | STRING | Payoff type. It can be "Call" or "Put". | √ |
| domesticCurve | STRING | The domestic discount curve name | × |
| foreignCurve | STRING | The foreign discount curve name | × |
| delivery | DATE | The delivery date | × |
Curve Field Specifications
IrYieldCurve
| Field Name | Data Type | Description | Required |
|---|---|---|---|
| mktDataType | STRING | Must be "Curve" | √ |
| referenceDate | DATE | Reference Date | √ |
| curveType | STRING | Must be "IrYieldCurve" | √ |
| dayCountConvention | STRING |
The day count convention to use. It can be:
|
√ |
| interpMethod | STRING |
Interpolation method. It can be:
|
√ |
| extrapMethod | STRING |
Extrapolation method. It can be
|
√ |
| dates | DATE vector | Date of each data point | √ |
| values | DOUBLE vector | Value of each data point, corresponding to the elements in dates. | √ |
| curveName | STRING | Curve name | × |
| currency | STRING | Currency. It can be CNY", "USD", "EUR", "GBP", "JPY", "HKD" | √ |
| compounding | STRING |
The compounding interest. It can be:
|
√ |
| settlement | DATE | Settlement date. If specified, all subsequent tenor intervals are computed starting from "settlement" rather than from "referenceDate". | × |
| frequency | INTEGRAL/STRING |
The interest payment frequency. Supported values:
|
× |
| curveModel | STRING |
Curve construction model; Currently, only "Bootstrap" is supported. |
× |
| curveParams | DICT | Model parameters. | × |
FxVolatilitySurface
| Field Name | Data Type | Description | Required |
|---|---|---|---|
| mktDataType | STRING | Must be "Surface" | √ |
| referenceDate | DATE | Reference Date | √ |
| surfaceType | STRING | Must be "FxVolatilitySurface" | √ |
| smileMethod | STRING |
Volatility smile method. It can be:
|
√ |
| volSmiles | DICT(STRING, ANY)vector |
Volatility smiles vector. Each element is one smile . It has the following members:
|
√ |
| termDates | DATE vector | Term date corresponding to each smile in volSmiles. | √ |
| surfaceName | STRING | Surface name | × |
| currencyPair | STRING |
Foreign exchange currency pair. Available options: "EURUSD", "USDCNY", "EURCNY", "GBPCNY", "JPYCNY", "HKDCNY". Currency pairs may also use |
√ |
