eqEuropeanOptionPricer
First introduced in version: 3.00.5
Syntax
eqEuropeanOptionPricer(instrument, pricingDate, spot, discountCurve,
dividendCurve, volSurf, [setting])
Details
Prices an European equity option.
Parameters
instrument: An INSTRUMENT scalar or vector specifying the European equity options to be priced. For field requirements, see the Instrument field description.
pricingDate: A DATE scalar or vector specifying the pricing date.
spot: A numeric scalar or vector specifying the spot price.
discountCurve: A MKTDATA scalar or vector specifying the discount curve (IrYieldCurve).
dividendCurve: A MKTDATA scalar or vector specifying the dividend curve
(DividendCurve). This curve is built using
eqDividendCurveBuilder.
volSurf: A VolatilitySurface object specifying the equity option volatility
surface. This surface is built using
eqVolatilitySurfaceBuilder.
| Key | Value | Description |
|---|---|---|
| calcDelta | Boolean; defaults to false | Whether to calculate Delta, the sensitivity of the option price to the underlying asset price. |
| calcGamma | Boolean; defaults to false | Whether to calculate Gamma, the sensitivity of Delta to the underlying asset price. |
| calcVega | Boolean; defaults to false | Whether to calculate Vega, the sensitivity of the option price to volatility. |
| calcTheta | Boolean; defaults to false | Whether to calculate Theta, the sensitivity of the option price to the passage of time. |
| calcRhoIr | Boolean; defaults to false | Whether to calculate RhoIr, the sensitivity of the option price to the risk-free interest rate. |
| calcRhoDividend | Boolean; defaults to false | Whether to calculate RhoDividend, the sensitivity of the option price to changes in the dividend yield. |
Returns
- If the setting parameter is not specified, returns a DOUBLE scalar indicating the option’s net present value (NPV), i.e., the theoretical option price.
- If the setting parameter is specified, returns a dictionary (<STRING, DOUBLE>) containing the option’s NPV and the option price sensitivities represented by the Greeks. For details on Greeks, see the description of the setting parameter.
Examples
// ================================================================
// Data Sources:
// Spot Price : akshare fund_etf_hist_sina('sh510050') → 3.1140
// Option Chain: akshare option_risk_indicator_sse('20260213')
// → Option settlement prices reconstructed via Black-Scholes
// Rate Curve : China Money Network FX-Implied Interest Rate Curve (CNY)
// https://www.chinamoney.com.cn/chinese/bkcurvuiruuh/
// API: POST /ags/ms/cm-u-bk-fx/IuirCurvHis 2026-02-13
//
// Target : Call strike=3.2000 expiry=2026-03-25
// ================================================================
pricingDate = 2026.02.13
referenceDate = pricingDate
// ------------------------------------------------------------------
// 1. Spot Price
// ------------------------------------------------------------------
spot = 3.1140
// ------------------------------------------------------------------
// 2. Define the Option Instrument (near-month ATM / slightly OTM call)
// ------------------------------------------------------------------
optionDict = {
"productType" : "Option",
"optionType" : "EuropeanOption",
"assetType" : "EqEuropeanOption",
"notionalCurrency" : "CNY",
"notionalAmount" : 10000,
"strike" : 3.2000,
"maturity" : 2026.03.25,
"payoffType" : "Call",
"dayCountConvention": "Actual365",
"underlying" : "510050"
}
option = parseInstrument(optionDict)
// ------------------------------------------------------------------
// 3. Raw Option Chain Data (used to build dividend curve and vol surface)
// Expiry sequence: 2026.02.25 | 2026.03.25 | 2026.06.24 | 2026.09.23
// Strike range : [2.85, 3.60]
// ------------------------------------------------------------------
termDates = [2026.02.25, 2026.03.25, 2026.06.24, 2026.09.23]
callPrices = matrix(
[0.2655, 0.2155, 0.1656, 0.1156, 0.0318, 0.0039, 0.0015, 0.0008, 0.0003, 0.0001],
[0.2690, 0.2248, 0.1770, 0.1385, 0.0697, 0.0303, 0.0128, 0.0069, 0.0046, 0.0036],
[0.3030, 0.2655, 0.2278, 0.1970, 0.1431, 0.0991, 0.0677, 0.0479, 0.0346, 0.0254],
[0.3330, 0.2987, 0.2681, 0.2388, 0.1883, 0.1448, 0.1139, 0.0899, 0.0715, 0.0574]
)
putPrices = matrix(
[0.0004, 0.0009, 0.0021, 0.0045, 0.0218, 0.0939, 0.1901, 0.2896, 0.3908, 0.4916],
[0.0125, 0.0165, 0.0229, 0.0316, 0.0616, 0.1250, 0.2029, 0.2967, 0.3962, 0.4948],
[0.0396, 0.0507, 0.0634, 0.0798, 0.1253, 0.1814, 0.2499, 0.3321, 0.4175, 0.5077],
[0.0651, 0.0798, 0.0973, 0.1180, 0.1662, 0.2250, 0.2952, 0.3651, 0.4508, 0.5342]
)
strikes = matrix(
[2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
[2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
[2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
[2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000]
)
// ------------------------------------------------------------------
// 4. Discount Curve ── China Money Network FX-Implied CNY Rate Curve (2026-02-13)
// Source: https://www.chinamoney.com.cn/chinese/bkcurvuiruuh/
// Filter: USD.CNY / Shibor / Mean Quote Rate of OTC FX Spot Market / Swap Pips
// Field : rmbRateStr (CNY interest rate, %)
// ------------------------------------------------------------------
discountCurveDict = {
"mktDataType" : "Curve",
"curveType" : "IrYieldCurve",
"curveName" : "CNY_FR_007",
"referenceDate" : referenceDate,
"currency" : "CNY",
"dayCountConvention": "Actual365",
"compounding" : "Continuous",
"interpMethod" : "Linear",
"extrapMethod" : "Flat",
"dates" : [referenceDate + 1, referenceDate + 7, referenceDate + 14, referenceDate + 21, referenceDate + 30, referenceDate + 61, referenceDate + 91, referenceDate + 182, referenceDate + 273, referenceDate + 365, referenceDate + 547, referenceDate + 730, referenceDate + 1095],
"values" : [0.016134, 0.016107, 0.016102, 0.016102, 0.016102, 0.016103, 0.016029, 0.015832, 0.015889, 0.015898, 0.015561, 0.015583, 0.015892]
}
discountCurve = parseMktData(discountCurveDict)
// ------------------------------------------------------------------
// 5. Dividend Curve ── Implied via Call-Put Parity
// ------------------------------------------------------------------
dividendCurve = eqDividendCurveBuilder(
referenceDate, termDates, "CallPutParity", ,
callPrices, putPrices, strikes, spot, discountCurve,
"Actual365", "510050"
)
// ------------------------------------------------------------------
// 6. Volatility Surface ── SABR model, built from OTM options
// Strike < Spot → OTM Put; Strike >= Spot → OTM Call
// ------------------------------------------------------------------
optionExpiries = termDates
optionPrices = matrix(
[0.0004, 0.0009, 0.0021, 0.0045, 0.0218, 0.0039, 0.0015, 0.0008, 0.0003, 0.0001],
[0.0125, 0.0165, 0.0229, 0.0316, 0.0616, 0.0303, 0.0128, 0.0069, 0.0046, 0.0036],
[0.0396, 0.0507, 0.0634, 0.0798, 0.1253, 0.0991, 0.0677, 0.0479, 0.0346, 0.0254],
[0.0651, 0.0798, 0.0973, 0.1180, 0.1662, 0.1448, 0.1139, 0.0899, 0.0715, 0.0574]
)
payoffTypes = matrix(
["Put", "Put", "Put", "Put", "Put", "Call", "Call", "Call", "Call", "Call"],
["Put", "Put", "Put", "Put", "Put", "Call", "Call", "Call", "Call", "Call"],
["Put", "Put", "Put", "Put", "Put", "Call", "Call", "Call", "Call", "Call"],
["Put", "Put", "Put", "Put", "Put", "Call", "Call", "Call", "Call", "Call"]
)
volSurface = eqVolatilitySurfaceBuilder(
referenceDate,
optionExpiries,
strikes,
optionPrices,
payoffTypes,
spot,
discountCurve,
dividendCurve,
"SABR",
"50ETF_SABR_20260213"
)
// ------------------------------------------------------------------
// 7. Pricing ── Single contract NPV
// ------------------------------------------------------------------
npv = eqEuropeanOptionPricer(option, pricingDate, spot, discountCurve, dividendCurve, volSurface)
print("NPV = " + string(npv))
// ------------------------------------------------------------------
// 8. Pricing ── With Greeks
// ------------------------------------------------------------------
setting = {
"calcDelta" : true,
"calcGamma" : true,
"calcVega" : true,
"calcTheta" : true,
"calcRhoIr" : true,
"calcRhoDividend": true
}
result = eqEuropeanOptionPricer(option, pricingDate, spot, discountCurve, dividendCurve, volSurface, setting)
print(result)
// ------------------------------------------------------------------
// 9. Batch Pricing ── All common strikes expiring 2026-03-25 (Call)
// ------------------------------------------------------------------
allStrikes = [2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000]
results = array(DOUBLE, 0)
for (k in allStrikes) {
iDict = {
"productType" : "Option",
"optionType" : "EuropeanOption",
"assetType" : "EqEuropeanOption",
"notionalCurrency" : "CNY",
"notionalAmount" : 10000,
"strike" : k,
"maturity" : 2026.03.25,
"payoffType" : "Call",
"dayCountConvention": "Actual365",
"underlying" : "510050"
}
iOpt = parseInstrument(iDict)
results.append!(eqEuropeanOptionPricer(iOpt, pricingDate, spot, discountCurve, dividendCurve, volSurface))
}
t = table(allStrikes as strike, results as npv)
print(t)
Instrument Field Description
| Field | Type | Description | Required |
|---|---|---|---|
| productType | STRING | Fixed value: "Option" | Yes |
| optionType | STRING | Fixed value: "EuropeanOption" | Yes |
| assetType | STRING | Fixed value: “EqEuropeanOption" | Yes |
| notionalAmount | DOUBLE | Notional amount | Yes |
| notionalCurrency | STRING | Notional currency. Defaults to CNY. | Yes |
| instrumentId | STRING |
Contract identifier, e.g. CSI 500 ETF option 510500C2512M04800 |
No |
| direction | SRTRING | Trade direction: Buy or Sell. Defaults to Buy. | No |
| maturity | DATE | Maturity date | Yes |
| strike | DOUBLE | Strike price | Yes |
| payoffType | STRING | Enum. Supported values: Call, Put. | Yes |
| underlying | STRING | Underlying contract code, e.g. 510050. | Yes |
| dayCountConvention | STRING | Day count convention. Supported values: "ActualActualISDA", "ActualActualISMA", "Actual365", "Actual360". | Yes |
| discountCurve | STRING | Name of the discount curve used for pricing. Defaults to "CNY_FR_007" for CNY deposits. | No |
| dividendCurve | STRING | Name of the dividend curve used for pricing. | No |
Related Functions: parseInstrument, parseMktData, eqDividendCurveBuilder, eqVolatilitySurfaceBuilder
