eqProxyVolatilitySurfaceBuilder
Syntax
eqProxyVolatilitySurfaceBuilder(referenceDate, proxyExpiries, proxyStrikes,
proxyCallPrices, proxyPutPrices, proxySpot, spot, discountCurve, dividendCurve,
[model=”SVI”], [surfaceName])
Details
Builds an equity proxy volatility surface.
Parameters
referenceDate: A DATE scalar specifying the reference date.
proxyExpiries: A DATE vector specifying the expiries of the proxy option contracts.
proxyStrikes: A DOUBLE matrix specifying the strikes of the proxy option contracts. The number of columns must match proxyExpiries.
proxyCallPrices: A DOUBLE matrix specifying the call prices of the proxy option contracts. The number of columns must match proxyExpiries, and the number of rows must match proxyStrikes.
proxyPutPrices: A DOUBLE matrix specifying the put prices of the proxy option contracts. The number of columns must match proxyExpiries, and the number of rows must match proxyStrikes.
proxySpot: ADOUBLE scalar specifying the spot price of the proxy option.
spot: A DOUBLE scalar specifying the spot price of the option being priced.
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.
model (optional): A STRING scalar specifying the model used to construct the volatility smile. Default is "SVI". Supported values: "SABR", "Linear", "CubicSpline", "SVI".
surfaceName (optional): A STRING scalar specifying the name of the surface.
Returns
A VolatilitySurface object.
Examples
referenceDate = 2025.11.12
// parse For discount curve: CNY_FR_007
discountCurveDict = {
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"curveName": "CNY_FR_007",
"referenceDate": referenceDate,
"currency": "CNY",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"dates": [
2025.11.13, 2025.11.19, 2025.11.26, 2025.12.03, 2025.12.12,
2026.01.12, 2026.02.12, 2026.05.12, 2026.08.12, 2026.11.12,
2027.05.12, 2027.11.12, 2028.11.12
],
"values":[
0.015219, 0.015311, 0.015668, 0.015948, 0.016003,
0.015557, 0.015474, 0.015278, 0.01517, 0.01515,
0.015306, 0.015462, 0.015716
]
}
discountCurve = parseMktData(discountCurveDict)
// build eq dividend curve
spot = 7.285
term_dates = [2026.01.28, 2026.03.25, 2026.06.23, 2026.12.23]
call_prices = matrix(
[1.2850, 1.0350, 0.7850, 0.5350, 0.3078, 0.1618, 0.0730, 0.0318, 0.0141, 0.0073],
[1.2850, 1.0350, 0.7850, 0.5350, 0.3421, 0.2235, 0.1388, 0.0898, 0.0544, 0.0362],
[1.2850, 1.0350, 0.7850, 0.5350, 0.3901, 0.2851, 0.2087, 0.1495, 0.1083, 0.0788],
[1.2850, 1.0350, 0.7850, 0.5350, 0.2850, 0.0945, 0.0168, 0.0031, 0.0016, 0.0012]
)
put_prices = matrix(
[0.0040, 0.0086, 0.0189, 0.0408, 0.0938, 0.1934, 0.3500, 0.5638, 0.7947, 1.0380],
[0.0279, 0.0493, 0.0847, 0.1428, 0.2354, 0.3668, 0.5289, 0.7182, 0.9429, 1.1685],
[0.1000, 0.1525, 0.2224, 0.3175, 0.4276, 0.5790, 0.7471, 0.9336, 1.1392, 1.3555],
[0.0012, 0.0013, 0.0021, 0.0048, 0.0139, 0.0710, 0.2414, 0.4752, 0.7342, 0.9793]
)
strikes = matrix(
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25]
)
dividendCurve = eqDividendCurveBuilder(referenceDate, term_dates, "CallPutParity", ,
call_prices, put_prices, strikes, spot, discountCurve, "Actual365");
// build eq proxy volatility surface
expiries = [2026.01.28, 2026.03.25, 2026.06.23, 2026.12.23]
call_prices = matrix(
[1.2850, 1.0350, 0.7850, 0.5350, 0.3078, 0.1618, 0.0730, 0.0318, 0.0141, 0.0073],
[1.2850, 1.0350, 0.7850, 0.5350, 0.3421, 0.2235, 0.1388, 0.0898, 0.0544, 0.0362],
[1.2850, 1.0350, 0.7850, 0.5350, 0.3901, 0.2851, 0.2087, 0.1495, 0.1083, 0.0788],
[1.2850, 1.0350, 0.7850, 0.5350, 0.2850, 0.0945, 0.0168, 0.0031, 0.0016, 0.0012]
)
put_prices = matrix(
[0.0040, 0.0086, 0.0189, 0.0408, 0.0938, 0.1934, 0.3500, 0.5638, 0.7947, 1.0380],
[0.0279, 0.0493, 0.0847, 0.1428, 0.2354, 0.3668, 0.5289, 0.7182, 0.9429, 1.1685],
[0.1000, 0.1525, 0.2224, 0.3175, 0.4276, 0.5790, 0.7471, 0.9336, 1.1392, 1.3555],
[0.0012, 0.0013, 0.0021, 0.0048, 0.0139, 0.0710, 0.2414, 0.4752, 0.7342, 0.9793]
)
strikes = matrix(
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25],
[6.00, 6.25, 6.50, 6.75, 7.00, 7.25, 7.50, 7.75, 8.00, 8.25]
)
proxy_spot = 7.285
spot = 7169.79
surface = eqProxyVolatilitySurfaceBuilder(referenceDate, expiries, strikes,
call_prices, put_prices, proxy_spot, spot, discountCurve, dividendCurve , "SVI")
print(surface)
Related Functions: parseMktData, eqDividendCurveBuilder
