Turn your quotes into arbitrage-free vol surfaces.
Raw prices or implied vols in, a fitted surface out in a fraction of a second. No model to choose, and sensible defaults out of the box.
Published in Risk · Cutting Edge · Feb 2026Stress
Built for the days that break other fitters.
The surfaces above are not a calm Tuesday. Each one is a full session from one of the worst days equity vol has seen, refit every five minutes. Liquidity thins, quotes go wide and sparse, some expiries are no longer quoted. There are many ways a vol fitter can fail on a day like this. A wing that does not make sense. A wrong ATM vol term structure. Or simply a forward that is itself unreliable. A typical vol fitter lets you down on the very day you need it most. Ours is designed to be robust from the ground up, enforcing many properties of a vol surface through penalties or hard constraints. And because there is only so much a depleted order book can tell you, ours can also draw on earlier snapshots from the same session. Open any of the dates below in the gallery and see how the fit sits against the quotes, expiry by expiry.
What it does
European and American. Prices and greeks.
Calibrates the forward curve from the chain, fits the vol surface, and reprices under spot scenarios.
Fit
Quotes in, surface out
- Price API takes raw option prices. Forwards and discount factors are calibrated from the chain when you do not supply them, then the vols are backed out for you.
- European and American exercise, with discrete cash dividends.
- Or the Vol API, which takes implied vols directly.
Price
Then price off it
- Prices and smooth greeks, including the shadow greeks.
- Spot scenarios priced off the fitted surface, using the SSR.
- Persist a fitted surface and rehydrate it later.
Deploy
Wherever it has to run
- Rust engine in-process, with Python and C/C++ bindings.
- JSON in, JSON out. Same contract across languages, with typed models over it in Rust and Python.
- License file for fully offline use, or call the hosted API. Linux and Windows, x86_64.
Integration
One call. No model to choose.
Post the chain. Omit the forward and the discount factor and they are calibrated from the quotes. The defaults get you a surface on the first call; the hyperparameters are there for the chains that need them.
# pip install "grafit[types]"
import grafit
from grafit_types import FitFromPricesRequest, TimeSlicePricesInput
# One TimeSlicePricesInput per expiry. The surface is fitted jointly across all
# of them, which is what makes the calendar constraints meaningful.
def time_slice(t, call_bid, call_ask, put_bid, put_ask):
return TimeSlicePricesInput(
strikes=[2000, 2200, 2400, 2600, 2800],
call_bid_prices=call_bid,
call_ask_prices=call_ask,
put_bid_prices=put_bid,
put_ask_prices=put_ask,
time_to_expiry=t,
is_american=False,
)
request = FitFromPricesRequest(
spot=2440.675,
time_slices_prices=[
# 33 days
time_slice(0.09178, [462.51, 297.76, 178.17, 98.85, 53.69],
[483.25, 318.51, 183.05, 102.51, 56.14],
[24.41, 59.80, 134.24, 241.63, 392.95],
[28.07, 63.46, 137.90, 266.03, 419.80]),
# 124 days
time_slice(0.34110, [558.91, 430.78, 334.37, 252.61, 190.37],
[588.20, 460.07, 341.69, 257.49, 195.25],
[113.49, 179.39, 270.91, 370.98, 506.44],
[115.93, 184.27, 278.24, 405.15, 545.49]),
],
)
surface = grafit.fit_vol_surface_from_prices(request)Options market makers · Systematic funds · Trading desks
Start fitting with Volptima.
Contact us, arrange a trial, and turn your option quotes into vol surfaces.