Skip to main content
Version: Staging

Schema: LiveSurfaceCurve (ID: 1035)

LiveSurfaceCurve (surfaceType = 'Live') records are computed and publish continuously during trading hours and represent a current best implied volatility market fit.

SurfaceType = 'PriorDay' records contain the `closing surface record from the prior trading period (usually from just before the last main session close).

METADATA

AttributeValue
Topic1000-analytics
MLink TokenOptSurface
SRSE ProductSRAnalytics

Note: The symbol = next to a field number indicates that it is a primary key.

BODY

#FieldTypeComment
10=ekeyExpiryKey
11=surfaceTypeenum : SurfaceCurveType
100tickerTickerKeyunderlying stock key that this option expiration attaches to
103fkeyExpiryKeyunderlying future key (if any)
106uPrcDriverKeyExpiryKeyunderlier driver key
109uPrcDriverTypeenum : SpdrKeyTypeunderlier driver key type (stock or future)
112uPrcDriverdoubleunderlier driver (mid-market)
115uPrcdoubleeffective uPrc used for surface fitting
118uBiddoubleeffective uBid
121uAskdoubleeffective uAsk
124yearsfloattime to expiration (in years)
127ratefloataverage interest rate to expiration (SR global rate curve)
130sdivfloatstock dividend (borrow rate)
133ddivfloat(expected) cumulative discrete dividend $ amounts prior to expiration
136ddivPvfloat(expected) cumulative npv of discrete dividend $ amounts prior to expiration (SR global rate curve)
139ddivSourceenum : DDivSourceForecast if any of the dividends prior to expiry are forecast rather than announced
142symbolRatiofloatunderlier price ratio (usually 1.0 or a multi-hedge option price ratio; if one exists)
145exTypeenum : ExerciseTypeexercise type (American or European)
148modelTypeenum : CalcModelTypeoption pricing model used for price calcs (Normal, LogNormal, etc.)
151priceTypeenum : CalcPriceTypeEquity has independent sdiv and rate, Future has sdiv = rate
154earnCntfloatnumber of qualifying earnings events prior to expiration [can be fractional] (from StockEarningsCalendar)
157earnCntAdjfloatnumber of qualifying earnings events prior to expiration [adjusted] (from StockEarningsCalendar + LiveSurfaceTerm)
160axisVolRTfloataxis volatility x sqrt(years) (used to compute xAxis) [usually 4m atm vol]
163axisFUPrcfloataxis FwdUPrc (fwd underlying price used to compute xAxis)
164synSpotdoubleSynthetic spot price (market-derived spot when the underlying is not a traded instrument)
165synCarrydoubleSynthetic carry rate; corresponds to the relationship between uPrc and synSpot (set when the underlying is not a traded instrument)
166atmStrikefloatsynthetic strike with cPrice = pPrice
169moneynessTypeenum : MoneynessTypemoneyness (xAxis) convention
172underlierModeenum : UnderlierModeunderlier pricing mode (None=use spot/stock market; FrontMonth=use front month future market * uPrcRatio; Actual = use actual underlier future market)
175cpAdjTypeenum : CPAdjTypeadjustment used to align calls/puts (if any)
178priceQuoteTypeenum : PriceQuoteTypePrice or Vol
181atmVolfloatatm vol (xAxis = 0)
184atmCenfloatatm vol (xAxis = 0) (eMove/earnCntAdj censored)
187atmVolHistfloathistorical realized volatility (includes eMoveHist x earnCntAdj adjustment). Note that this is the default atmVol if no implied markets existed previous day.
190atmCenHistfloatcensored (earnings events removed) historical realized volatility. Trailing periods is 2x forward time to expiration. From HistoricalVolatility(windowType=hlCen).mv_nnn
193eMovefloatimplied earnings move (from LiveSurfaceTerm)
196eMoveHistfloathistorical earnings move (avg of trailing 8 moves). From StockEarningsCalendar.eMoveHist
199uPrcRatiodoubleuPrcAdj = uPrc * uPrcRatioFit
202minAtmVolfloatminimum estimated atm vol
205maxAtmVolfloatmaximum estimated atm vol
208minCPAdjValdoubleminimum cpAdjVal (sdiv or uPrcRatio)
211maxCPAdjValdoubleminimum cpAdjVal (sdiv or uPrcRatio)
214atmFixedMovefloatfixed strike atm move from prior period
217atmPhifloatsurface phi @ xAxis = 0
220atmRhofloatsurface rho @ xAxis = 0
223atmVegafloatsurface vega @ xAxis = 0
226slopefloatvolatility surface slope (dVol / dXAxis) @ ATM (xAxis=0)
229varSwapFVfloatvariance swap fair value (estimated by numerical integration over OTM price surface)
232gridTypeenum : GridTypegridType defines skew curve coeff points + spline type
235knotShiftfloatconstant that should be added to each base knot location [-3.0 - +3.0]
238fitPowerCfloatfit power of the vol fit (call wing)
241fitPowerPfloatfit power of the vol fit (put wing)
244minXAxisfloatminimum xAxis value; xAxis values to the left extrapolate horizontally
247maxXAxisfloatmaximum xAxis value; xAxis values to the right extrapolate horizontally
250asymptoticVolCfloatasymptotic volatility (call wing)
253asymptoticVolPfloatasymptotic volatility (put wing)
256minCurvValuefloatminimum curvature (2nd derivative) of skew curve (can be negative if curve is not strictly convex)
259minCurvXAxisfloatxAxis of minimum curvature point
262maxCurvValuefloatmaximum curvature (2nd derivative) of skew curve
265maxCurvXAxisfloatxAxis of maximum curvature point
268skewMinXfloatxAxis = (effStrike / effAxisFUPrc - 1.0) / axisVolRT; effStrike = strike * strikeRatio; effAxisFUPrc = axisFUPrc * symbolRatio
271skewMinYfloatskewMinX / skewMinY are the skew curve minimum point (usually a positive x value and a negative y value)
274surfaceFitenum : SurfaceFit
277skewC00floatcurve coeff[0]
280skewC01floatcurve coeff[1]
283skewC02float
286skewC03float
289skewC04float
292skewC05float
295skewC06float
298skewC07float
301skewC08float
304skewC09float
307skewC10float
310skewC11float
313skewC12float
316skewC13float
319skewC14float
322skewC15float
325skewC16float
328skewC17float
331skewC18float
334skewC19float
337skewC20float
340skewC21float
343skewC22float
346skewC23float
349skewC24float
352skewC25float
355skewC26float
358skewC27float
361skewC28float
364ivAdjD07floatxAxis = -5.0
367ivAdjD06floatxAxis = -4.0
370ivAdjD05floatxAxis = -3.0
373ivAdjD04floatxAxis = -2.0
376ivAdjD03floatxAxis = -1.5
379ivAdjD02floatxAxis = -1.0
382ivAdjD01floatxAxis = -0.5
385ivAdjU01floatxAxis = +0.5
388ivAdjU02floatxAxis = +1.0
391ivAdjU03floatxAxis = +1.5
394ivAdjU04floatxAxis = +2.0
397ivAdjU05floatxAxis = +3.0
400ivAdjU06floatxAxis = +4.0
403ivAdjU07floatxAxis = +5.0
406cpAdjD04floatxAxis = -4.0
409cpAdjD03floatxAxis = -3.0
412cpAdjD02floatxAxis = -2.0
415cpAdjD01floatxAxis = -1.0
418cpAdjU01floatxAxis = +1.0
421cpAdjU02floatxAxis = +2.0
424cpAdjU03floatxAxis = +3.0
427cpAdjU04floatxAxis = +4.0
430pwidthfloatminimum mkt premium width
433vwidthfloatminimum mkt volatility width
436cCntbytenum call strikes in base fit
439pCntbytenum put strikes in base fit
442cBidMissbytenumber of call bid violations (surface outside the market)
445cAskMissbytenumber of call ask violations (surface outside the market)
448pBidMissbytenumber of put bid violations
451pAskMissbytenumber of put ask violations
454fitAvgErrfloataverage error (sPrc - midPrc)
457fitAvgAbsErrfloataverage absolute error (sPrc - midPrc)
460fitMaxPrcErrfloatworst case surface premium violation
463fitErrXXfloatokey_xx of the option with the largest fit error in this expiration
466fitErrCPenum : CallPutokey_cp of the option with the largest fit error in this expiration
469fitErrDefloatdelta of fixErrXX
472fitErrBidfloatbid of the option with the largest fit error
475fitErrAskfloatask of the option with the largest fit error
478fitErrPrcfloatsurface prc of the option with the largest fit error
481fitErrVolfloatsurface vol of the option with the largest fit error
484numSaddlePtsbytenumber of saddle points
487minSaddleSpanfloatsmallest distance between saddle points
490maxSaddleCurvaturefloatmaximum saddle point curvature
493skewCounterintskew surface fit counter
496sdivCounterintsdiv surface fit counter
499marketSessionenum : MarketSessionmarket session this surface is from
502tradeableStatusenum : TradeableStatusindicates whether the surface is currently tradeable or not (all server surface integrity checks pass)
505surfaceResultenum : SurfaceResult
508sTimestampDateTimelast surface curve fit timestamp
511timeTimeSpan
514timestampDateTime

Get Schema API Call

import requests 

# Replace with your desired MLINK URL
MLINK_PROD_URL = 'https://mlink-live.nms.saturn.spiderrockconnect.com/rest/json'

# Replace with your MLINK API Key
API_KEY = 'XXXX-XXXX-XXXX-XXXX'

# Replace with your desired MsgType.
MSG_TYPE = 'LiveSurfaceCurve'

# Request Parameters for Get Schema Of The MsgType
params = {
#Required Parameters
"apiKey": API_KEY,
"cmd": 'getschema',
"msgType": MSG_TYPE,
}

response = requests.get(MLINK_PROD_URL, params=params)

Get Msg API Call

import requests 

# Replace with your desired MLINK URL
MLINK_PROD_URL = 'https://mlink-live.nms.saturn.spiderrockconnect.com/rest/json'

# Replace with your MLINK API Key
API_KEY = 'XXXX-XXXX-XXXX-XXXX'

# Replace with your desired MsgType.
MSG_TYPE = 'LiveSurfaceCurve'

# Replace with your pkey value for getting the specific message desired
PKEY = 'ReplaceThisValueForTheQueryToWork'

# Replace with your desired view. A "|" separated list of views can be provided
# If no view is provided, all views will be returned.
VIEW = 'ticker|fkey|uPrcDriverKey|uPrcDriverType|uPrcDriver|uPrc|uBid|uAsk|years|rate|sdiv|ddiv|ddivPv|ddivSource|symbolRatio|exType|modelType|priceType|earnCnt|earnCntAdj|axisVolRT|axisFUPrc|synSpot|synCarry|atmStrike|moneynessType|underlierMode|cpAdjType|priceQuoteType|atmVol|atmCen|atmVolHist|atmCenHist|eMove|eMoveHist|uPrcRatio|minAtmVol|maxAtmVol|minCPAdjVal|maxCPAdjVal|atmFixedMove|atmPhi|atmRho|atmVega|slope|varSwapFV|gridType|knotShift|fitPowerC|fitPowerP|minXAxis|maxXAxis|asymptoticVolC|asymptoticVolP|minCurvValue|minCurvXAxis|maxCurvValue|maxCurvXAxis|skewMinX|skewMinY|surfaceFit|skewC00|skewC01|skewC02|skewC03|skewC04|skewC05|skewC06|skewC07|skewC08|skewC09|skewC10|skewC11|skewC12|skewC13|skewC14|skewC15|skewC16|skewC17|skewC18|skewC19|skewC20|skewC21|skewC22|skewC23|skewC24|skewC25|skewC26|skewC27|skewC28|ivAdjD07|ivAdjD06|ivAdjD05|ivAdjD04|ivAdjD03|ivAdjD02|ivAdjD01|ivAdjU01|ivAdjU02|ivAdjU03|ivAdjU04|ivAdjU05|ivAdjU06|ivAdjU07|cpAdjD04|cpAdjD03|cpAdjD02|cpAdjD01|cpAdjU01|cpAdjU02|cpAdjU03|cpAdjU04|pwidth|vwidth|cCnt|pCnt|cBidMiss|cAskMiss|pBidMiss|pAskMiss|fitAvgErr|fitAvgAbsErr|fitMaxPrcErr|fitErrXX|fitErrCP|fitErrDe|fitErrBid|fitErrAsk|fitErrPrc|fitErrVol|numSaddlePts|minSaddleSpan|maxSaddleCurvature|skewCounter|sdivCounter|marketSession|tradeableStatus|surfaceResult|sTimestamp|time|timestamp'

# Replace with your desired where clause.
# a string in the form "field1:eq:valuse" or "(field1:ne:value1 & field1:ne:value2)
# "WHERE" clauses can contain the following comparison symbols:
# :gt: is greater than
# :ge: is greater than or equal to
# :lt: is less than
# :le: is less than or equal to
# :eq: is equal
# :ne: is not equal
# %26 is an AND statement
# | is an OR statement
# :sw: is starts with
# :ew: is ends with
# :cv: is contains values
# :nv: is does not contain value
# :cb: is contained between (two dates for instance) separated by '$'
WHERE = ''

# Request Parameters for getmsg Of The MsgType
params = {
# Required Parameters
"apiKey": API_KEY,
"cmd": 'getmsg',
"pkey": PKEY,
"msgType": MSG_TYPE,
# Optional Parameters
"view": VIEW,
"where": WHERE
}

response = requests.get(MLINK_PROD_URL, params=params)

Get Msgs API Call

import requests 

# Replace with your desired MLINK URL
MLINK_PROD_URL = 'https://mlink-live.nms.saturn.spiderrockconnect.com/rest/json'

# Replace with your MLINK API Key
API_KEY = 'XXXX-XXXX-XXXX-XXXX'

# Replace with your desired MsgType.
MSG_TYPE = 'LiveSurfaceCurve'

# Replace with your desired view. A "|" separated list of views can be provided
# If no view is provided, all views will be returned
VIEW = 'ticker|fkey|uPrcDriverKey|uPrcDriverType|uPrcDriver|uPrc|uBid|uAsk|years|rate|sdiv|ddiv|ddivPv|ddivSource|symbolRatio|exType|modelType|priceType|earnCnt|earnCntAdj|axisVolRT|axisFUPrc|synSpot|synCarry|atmStrike|moneynessType|underlierMode|cpAdjType|priceQuoteType|atmVol|atmCen|atmVolHist|atmCenHist|eMove|eMoveHist|uPrcRatio|minAtmVol|maxAtmVol|minCPAdjVal|maxCPAdjVal|atmFixedMove|atmPhi|atmRho|atmVega|slope|varSwapFV|gridType|knotShift|fitPowerC|fitPowerP|minXAxis|maxXAxis|asymptoticVolC|asymptoticVolP|minCurvValue|minCurvXAxis|maxCurvValue|maxCurvXAxis|skewMinX|skewMinY|surfaceFit|skewC00|skewC01|skewC02|skewC03|skewC04|skewC05|skewC06|skewC07|skewC08|skewC09|skewC10|skewC11|skewC12|skewC13|skewC14|skewC15|skewC16|skewC17|skewC18|skewC19|skewC20|skewC21|skewC22|skewC23|skewC24|skewC25|skewC26|skewC27|skewC28|ivAdjD07|ivAdjD06|ivAdjD05|ivAdjD04|ivAdjD03|ivAdjD02|ivAdjD01|ivAdjU01|ivAdjU02|ivAdjU03|ivAdjU04|ivAdjU05|ivAdjU06|ivAdjU07|cpAdjD04|cpAdjD03|cpAdjD02|cpAdjD01|cpAdjU01|cpAdjU02|cpAdjU03|cpAdjU04|pwidth|vwidth|cCnt|pCnt|cBidMiss|cAskMiss|pBidMiss|pAskMiss|fitAvgErr|fitAvgAbsErr|fitMaxPrcErr|fitErrXX|fitErrCP|fitErrDe|fitErrBid|fitErrAsk|fitErrPrc|fitErrVol|numSaddlePts|minSaddleSpan|maxSaddleCurvature|skewCounter|sdivCounter|marketSession|tradeableStatus|surfaceResult|sTimestamp|time|timestamp'

# Replace with your desired where clause.
# a string in the form "field1:eq:value" or "(field1:ne:value1 & field1:ne:value2)
# "WHERE" clauses can contain the following comparison symbols:
# :gt: is greater than
# :ge: is greater than or equal to
# :lt: is less than
# :le: is less than or equal to
# :eq: is equal
# :ne: is not equal
# %26 is an AND statement
# | is an OR statement
# :sw: is starts with
# :ew: is ends with
# :cv: is contains values
# :nv: is does not contain value
# :cb: is contained between (two dates for instance) separated by '$'
WHERE = ''

# Replace with your desired limit of how many messages you receive. The default limit is 500
LIMIT = 500

# Order clause eg. "(field1:DESC | field1:ASC | field2:DESC:ABS | field2:ASC:ABS" (default is unordered; default is faster)
ORDER = 'ticker:ASC'

# Request Parameters for getmsgs Of The MsgType
params = {
# Required Parameters
"apiKey": API_KEY,
"cmd": 'getmsgs',
"msgType": MSG_TYPE,
# Optional Parameters
"view": VIEW,
"where": WHERE,
"limit": LIMIT,
"order": ORDER
}

response = requests.get(MLINK_PROD_URL, params=params)

Get Aggregate API Call

import requests 

# Replace with your desired MLINK URL
MLINK_PROD_URL = 'https://mlink-live.nms.saturn.spiderrockconnect.com/rest/json'

# Replace with your MLINK API Key
API_KEY = 'XXXX-XXXX-XXXX-XXXX'

# Replace with your desired MsgType.
MSG_TYPE = 'LiveSurfaceCurve'

# Replace with fields you want to see aggregate values for. A "|" separated list of measures should be provided
MEASURE = 'ticker|fkey|uPrcDriverKey|uPrcDriverType|uPrcDriver|uPrc|uBid|uAsk|years|rate|sdiv|ddiv|ddivPv|ddivSource|symbolRatio|exType|modelType|priceType|earnCnt|earnCntAdj|axisVolRT|axisFUPrc|synSpot|synCarry|atmStrike|moneynessType|underlierMode|cpAdjType|priceQuoteType|atmVol|atmCen|atmVolHist|atmCenHist|eMove|eMoveHist|uPrcRatio|minAtmVol|maxAtmVol|minCPAdjVal|maxCPAdjVal|atmFixedMove|atmPhi|atmRho|atmVega|slope|varSwapFV|gridType|knotShift|fitPowerC|fitPowerP|minXAxis|maxXAxis|asymptoticVolC|asymptoticVolP|minCurvValue|minCurvXAxis|maxCurvValue|maxCurvXAxis|skewMinX|skewMinY|surfaceFit|skewC00|skewC01|skewC02|skewC03|skewC04|skewC05|skewC06|skewC07|skewC08|skewC09|skewC10|skewC11|skewC12|skewC13|skewC14|skewC15|skewC16|skewC17|skewC18|skewC19|skewC20|skewC21|skewC22|skewC23|skewC24|skewC25|skewC26|skewC27|skewC28|ivAdjD07|ivAdjD06|ivAdjD05|ivAdjD04|ivAdjD03|ivAdjD02|ivAdjD01|ivAdjU01|ivAdjU02|ivAdjU03|ivAdjU04|ivAdjU05|ivAdjU06|ivAdjU07|cpAdjD04|cpAdjD03|cpAdjD02|cpAdjD01|cpAdjU01|cpAdjU02|cpAdjU03|cpAdjU04|pwidth|vwidth|cCnt|pCnt|cBidMiss|cAskMiss|pBidMiss|pAskMiss|fitAvgErr|fitAvgAbsErr|fitMaxPrcErr|fitErrXX|fitErrCP|fitErrDe|fitErrBid|fitErrAsk|fitErrPrc|fitErrVol|numSaddlePts|minSaddleSpan|maxSaddleCurvature|skewCounter|sdivCounter|marketSession|tradeableStatus|surfaceResult|sTimestamp|time|timestamp'

# Replace with fields you want to see aggregated. A "|" separated list of fields should be provided
GROUP = 'uPrcDriverType|ddivSource|exType|modelType|priceType|moneynessType|underlierMode|cpAdjType|priceQuoteType|gridType|surfaceFit|fitErrCP|marketSession|tradeableStatus|surfaceResult'

# Replace with your desired where clause.
# a string in the form "field1:eq:value" or "(field1:ne:value1 & field1:ne:value2)
# "WHERE" clauses can contain the following comparison symbols:
# :gt: is greater than
# :ge: is greater than or equal to
# :lt: is less than
# :le: is less than or equal to
# :eq: is equal
# :ne: is not equal
# %26 is an AND statement
# | is an OR statement
# :sw: is starts with
# :ew: is ends with
# :cv: is contains values
# :nv: is does not contain value
# :cb: is contained between (two dates for instance) separated by '$'
WHERE = ''

# Request Parameters for getaggregate Of The MsgType
params = {
# Required Parameters
"apiKey": API_KEY,
"cmd": 'getaggregate',
"msgType": MSG_TYPE,
"measure": MEASURE,
"group": GROUP,
# Optional Parameters
"where": WHERE,
}

response = requests.get(MLINK_PROD_URL, params=params)

Get Count API Call

import requests 

# Replace with your desired MLINK URL
MLINK_PROD_URL = 'https://mlink-live.nms.saturn.spiderrockconnect.com/rest/json'

# Replace with your MLINK API Key
API_KEY = 'XXXX-XXXX-XXXX-XXXX'

# Replace with your desired MsgType.
MSG_TYPE = 'LiveSurfaceCurve'

# Replace with your desired where clause.
# a string in the form "field1:eq:value" or "(field1:ne:value1 & field1:ne:value2)
# "WHERE" clauses can contain the following comparison symbols:
# :gt: is greater than
# :ge: is greater than or equal to
# :lt: is less than
# :le: is less than or equal to
# :eq: is equal
# :ne: is not equal
# %26 is an AND statement
# | is an OR statement
# :sw: is starts with
# :ew: is ends with
# :cv: is contains values
# :nv: is does not contain value
# :cb: is contained between (two dates for instance) separated by '$'
WHERE = ''

# Request Parameters for getCount Of The MsgType
params = {
# Required Parameters
"apiKey": API_KEY,
"cmd": 'getcount',
"msgType": MSG_TYPE,
# Optional Parameters
"where": WHERE,
}

response = requests.get(MLINK_PROD_URL, params=params)