Skip to main content
Version: Upcoming

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

#FieldTypeDefault ValueComment
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.)
151prcFrameworkenum : PricingFrameworkSpot (Equity), Forward (Cash), Future, Physical
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)
166synSpotdoubleSynthetic spot price (market-derived spot when the underlying is not a traded instrument)
169synCarrydoubleSynthetic carry rate; corresponds to the relationship between uPrc and synSpot (set when the underlying is not a traded instrument)
172atmStrikefloatsynthetic strike with cPrice = pPrice
175moneynessTypeenum : MoneynessTypemoneyness (xAxis) convention
178underlierModeenum : UnderlierModeunderlier pricing mode (None=use spot/stock market; FrontMonth=use front month future market * uPrcRatio; Actual = use actual underlier future market)
181cpAdjTypeenum : CPAdjTypeadjustment used to align calls/puts (if any)
184priceQuoteTypeenum : PriceQuoteTypePrice or Vol
187atmVolfloatatm vol (xAxis = 0)
190atmCenfloatatm vol (xAxis = 0) (eMove/earnCntAdj censored)
193atmVolHistfloathistorical realized volatility (includes eMoveHist x earnCntAdj adjustment). Note that this is the default atmVol if no implied markets existed previous day.
196atmCenHistfloatcensored (earnings events removed) historical realized volatility. Trailing periods is 2x forward time to expiration. From HistoricalVolatility(windowType=hlCen).mv_nnn
199eMovefloatimplied earnings move (from LiveSurfaceTerm)
202eMoveHistfloathistorical earnings move (avg of trailing 8 moves). From StockEarningsCalendar.eMoveHist
205uPrcRatiodoubleuPrcAdj = uPrc * uPrcRatioFit
208minAtmVolfloatminimum estimated atm vol
211maxAtmVolfloatmaximum estimated atm vol
214minCPAdjValdoubleminimum cpAdjVal (sdiv or uPrcRatio)
217maxCPAdjValdoubleminimum cpAdjVal (sdiv or uPrcRatio)
220atmFixedMovefloatfixed strike atm move from prior period
223atmPhifloatsurface phi @ xAxis = 0
226atmRhofloatsurface rho @ xAxis = 0
229atmVegafloatsurface vega @ xAxis = 0
232slopefloatvolatility surface slope (dVol / dXAxis) @ ATM (xAxis=0)
235varSwapFVfloatvariance swap fair value (estimated by numerical integration over OTM price surface)
238gridTypeenum : GridTypegridType defines skew curve coeff points + spline type
241knotShiftfloatconstant that should be added to each base knot location [-3.0 - +3.0]
244fitPowerCfloatfit power of the vol fit (call wing)
247fitPowerPfloatfit power of the vol fit (put wing)
250minXAxisfloatminimum xAxis value; xAxis values to the left extrapolate horizontally
253maxXAxisfloatmaximum xAxis value; xAxis values to the right extrapolate horizontally
256asymptoticVolCfloatasymptotic volatility (call wing)
259asymptoticVolPfloatasymptotic volatility (put wing)
262minCurvValuefloatminimum curvature (2nd derivative) of skew curve (can be negative if curve is not strictly convex)
265minCurvXAxisfloatxAxis of minimum curvature point
268maxCurvValuefloatmaximum curvature (2nd derivative) of skew curve
271maxCurvXAxisfloatxAxis of maximum curvature point
274skewMinXfloatxAxis = (effStrike / effAxisFUPrc - 1.0) / axisVolRT; effStrike = strike * strikeRatio; effAxisFUPrc = axisFUPrc * symbolRatio
277skewMinYfloatskewMinX / skewMinY are the skew curve minimum point (usually a positive x value and a negative y value)
280surfaceFitenum : SurfaceFit
283skewC00floatcurve coeff[0]
286skewC01floatcurve coeff[1]
289skewC02float
292skewC03float
295skewC04float
298skewC05float
301skewC06float
304skewC07float
307skewC08float
310skewC09float
313skewC10float
316skewC11float
319skewC12float
322skewC13float
325skewC14float
328skewC15float
331skewC16float
334skewC17float
337skewC18float
340skewC19float
343skewC20float
346skewC21float
349skewC22float
352skewC23float
355skewC24float
358skewC25float
361skewC26float
364skewC27float
367skewC28float
370ivAdjD07floatxAxis = -5.0
373ivAdjD06floatxAxis = -4.0
376ivAdjD05floatxAxis = -3.0
379ivAdjD04floatxAxis = -2.0
382ivAdjD03floatxAxis = -1.5
385ivAdjD02floatxAxis = -1.0
388ivAdjD01floatxAxis = -0.5
391ivAdjU01floatxAxis = +0.5
394ivAdjU02floatxAxis = +1.0
397ivAdjU03floatxAxis = +1.5
400ivAdjU04floatxAxis = +2.0
403ivAdjU05floatxAxis = +3.0
406ivAdjU06floatxAxis = +4.0
409ivAdjU07floatxAxis = +5.0
412cpAdjD04floatxAxis = -4.0
415cpAdjD03floatxAxis = -3.0
418cpAdjD02floatxAxis = -2.0
421cpAdjD01floatxAxis = -1.0
424cpAdjU01floatxAxis = +1.0
427cpAdjU02floatxAxis = +2.0
430cpAdjU03floatxAxis = +3.0
433cpAdjU04floatxAxis = +4.0
436pwidthfloatminimum mkt premium width
439vwidthfloatminimum mkt volatility width
442cCntbytenum call strikes in base fit
445pCntbytenum put strikes in base fit
448cBidMissbytenumber of call bid violations (surface outside the market)
449cAskMissbytenumber of call ask violations (surface outside the market)
450pBidMissbytenumber of put bid violations (surface outside the market)
451pAskMissbytenumber of put ask violations (surface outside the market)
460fitAvgErrfloataverage error (sPrc - midPrc)
461fitAvgAbsErrfloataverage absolute error (sPrc - midPrc)
462fitMaxPrcErrfloatworst 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 the option with the largest fit error in this expiration
472fitErrBidfloatbid of the option with the largest fit error in this expiration
475fitErrAskfloatask of the option with the largest fit error in this expiration
478fitErrPrcfloatsurface prc of the option with the largest fit error in this expiration
481fitErrVolfloatsurface vol of the option with the largest fit error in this expiration
490numSaddlePtsbytenumber of saddle points
493minSaddleSpanfloatsmallest distance between saddle points
496maxSaddleCurvaturefloatmaximum saddle point curvature
499skewCounterintskew surface fit counter
502sdivCounterintsdiv surface fit counter
505tradingSessionenum : TradingSessiontrading session this surface is from
508tradeableStatusenum : TradeableStatusindicates whether the surface is currently tradeable or not (all server surface integrity checks pass)
511surfaceResultenum : SurfaceResult
514sTimestampDateTimelast surface curve fit timestamp
517timeTimeSpan
520timestampDateTime

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|prcFramework|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|tradingSession|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|prcFramework|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|tradingSession|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|prcFramework|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|tradingSession|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|prcFramework|moneynessType|underlierMode|cpAdjType|priceQuoteType|gridType|surfaceFit|fitErrCP|tradingSession|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)