Skip to content

Release Notes

This page is the source of truth for quantflow release notes. Each section below maps to a tagged release on GitHub. When a new tag is pushed, the matching section is extracted by .github/workflows/release.yml and published as the GitHub Release body.

v1.2.0

This release completes the discount curve and forward calibration work introduced in v1.1.0. The experimental curve calibration API has been simplified and part of it removed: see the Breaking changes section below.

Breaking changes

  • VolSurface.calibrate_curves accepts only yield curve model types for the quote and asset legs, no longer curve instances. The asset curve is always fitted from the parity forwards, falling back to an interpolated monotonic cubic curve when the requested model cannot be calibrated (#92).
  • Removed the per-expiry OLS discount fitting API: the DiscountPair model and the PutCallParities.fit_discounts and implied_forward methods. Use calibrate_forward and quote_discount instead (#92).
  • Removed VolSurface.collect_put_call_parities and implied_forward_term_structure. The surface reference date is now an explicit ref_date field (defaulting to the current UTC time) rather than a property derived from the curves (#92).

New features

  • The default quote and asset curves of the volatility surface are now interpolated monotonic cubic curves calibrated from put-call parity; the Deribit and Yahoo Finance loaders have been updated accordingly (#92).

Documentation and assets

  • Updated the curve calibration and volatility surface tutorials for the new calibration API (#92).

Full changelog

v1.1.0

This release introduces the eSSVI parametrisation of the implied volatility surface and the calibration of discount curves and forwards from put-call parity, together with a new tutorial and expanded reference documentation. There are no breaking changes.

New features

  • eSSVI (extended surface SVI) parametrisation of the implied volatility surface, with an arbitrage-free calibration to market quotes. The calibration is still experimental and will be refined in future releases (#86, #88, #90).
  • Calibration of forwards and discount curves from put-call parity, with selectable curve models for the quote and asset legs in the volatility surface API (#90).

Improvements and fixes

  • A calibrated parity forward of zero is no longer treated as missing (#90).
  • Fixed a stale date in the volatility surface documentation (#89).

Documentation and assets

  • New tutorial on discount curves from option prices, backed by a recorded Deribit BTC fixture and a fixture recording tool (#90).
  • Expanded API reference indexes, glossary and bibliography entries (#88).

Full changelog

v1.0.0

First major release, consolidating the API for the 1.x series: a new distributions package, a rewritten Kalman filtering module, an expanded interest-rate toolkit and leaner naming across the options API. Several modules were renamed, reworked or removed: see Breaking changes before upgrading.

Breaking changes

  • New quantflow.dists package: Marginal1D moved there from quantflow.utils.marginal, and the 1D distributions from quantflow.utils.distributions; update imports accordingly (#80).
  • implied_vol/implied_vols fields and arguments renamed to iv across the options surface, calibration and plotting APIs (#67).
  • Kalman filtering rewritten: the old quantflow.ta.kalman module was removed and replaced by a state-space API with LinearGaussianModel, KalmanFilter and UnscentedKalmanFilter (#76, #79).
  • Options inputs and strategies reworked, with moneyness utilities moved into the new quantflow.options.moneyness module (#68).
  • Interest-rate package overhaul: CIR and Vasicek models expanded, Nelson-Siegel slimmed down, new no-discount curve (#74).
  • The quantflow.ai package was removed (#75).
  • EWMA alpha/period conversion corrected; results change for code relying on the previous formula (#73).

New features

  • Interpolated yield curves (#81).
  • Historical calibration of interest-rate models (#77).
  • Yield-curve fitting of forward and discount factors (#63).
  • Yahoo Finance volatility-surface loader (#61).

Improvements and fixes

  • Increased test coverage across the package, the app and the CIR curves (#69, #70, #71).
  • Documentation examples are now built once in CI and shared by the multi-arch image builds (#82).
  • Dependency updates, including aio-fluid (#78).

Documentation and assets

  • Docs improvements: plotly charts, example fixtures relocated, frontend moved, CIR and Vasicek rates API pages (#62, #64, #65, #66, #72).
  • Code of conduct added (#83).

Full changelog

v0.9.0

Pricing-engine and calibration overhaul. MaturityPricer now evaluates call prices and Greeks lazily at arbitrary log-strikes instead of carrying a precomputed grid, Fourier pricers take a moneyness-based truncation parameter, and the volatility-surface calibration can fit Black implied vols directly. This release contains several API changes: see Breaking changes below.

Breaking changes

MaturityPricer reworked. (#59)

  • The precomputed std, log_strike and call arrays are gone. A MaturityPricer now holds a single pricing field (an OptionPricingResult) that evaluates call prices and Greeks on demand at any log-strike.
  • moneyness is now a method, moneyness(log_strikes), not a cached array property. The time_value and intrinsic_value array properties and the interp(...) helper were removed; use prices(log_strikes) to get a DataFrame of prices and implied vols on a chosen log-strike grid.

Fourier pricing truncation: max_log_strike → moneyness parameters. (#59)

  • Marginal1D.call_option, call_option_carr_madan and call_option_lewis take max_moneyness (a multiple of the marginal standard deviation) instead of max_log_strike. The COS path takes cos_moneyness_std_precision instead.
  • OptionPricingResult.call_at(...) is renamed call_price(...), the method field is removed, and a new abstract call_greeks(log_strike) returns a Greeks namedtuple (price, delta, gamma).

OptionPricerBase.call_pricecall_prices. (#59) The method is now vectorised: it takes arrays of times-to-maturity and log-strikes and prices them in a single maturity-grouped call.

DIVFMPricer no longer builds a fixed moneyness grid. (#59) The max_moneyness_ttm and n fields are removed; the fitted IV surface is evaluated on demand through OptionPricingResultDIVFM.

New features

  • Implied-vol calibration residuals. New ResidualKind enum and a residual_kind field on VolModelCalibration: set it to ResidualKind.IV to fit the model to Black implied vols (recovered by inverting the model price) rather than to forward-space prices. The IV residual is naturally well-scaled across moneyness, so moneyness_weight is not applied in that mode. (#59)
  • Greeks from the pricing result. OptionPricingCosResult.call_greeks returns closed-form price, delta and gamma from the COS expansion; the transform-based result derives delta and gamma by differentiating the call grid; DIVFM uses finite differences on the fitted surface. (#59)
  • COS truncation control on OptionPricer. New cos_moneyness_std_precision field (default 12) sets the width of the COS integration interval in standard deviations. (#59)

Improvements and fixes

  • Calibration residuals are now computed in a single vectorised pricing call. Deep-wing strikes where the model price falls outside the no-arbitrage band (so Newton fails to invert it) are masked out instead of poisoning the fit, and a parameter set that fails to invert on more than half the options is rejected with a large penalty. (#59)
  • Calibration plots now evaluate the model on a fresh moneyness grid; plot(max_moneyness=...) no longer accepts None. (#59)
  • OptionEntry.mid_price() no longer caches through a private attribute. (#59)
  • Stale Jupytext notebook mirrors under notebooks/ removed. (#59)

Documentation and assets

  • New GitHub social-preview banner under docs/assets/logos/png/. (#59)
  • docs/api/options/black.md and the volatility-surface calibration examples updated for the new pricer API. (#59)
  • The release procedure moved out of .github/copilot-instructions.md into its own .github/instructions/release.instructions.md.

Full changelog

v0.8.0

Volatility-surface calibration overhaul. This release adds a two-factor BNS model, a double-Heston model (with optional jumps), Lewis and COS pricing methods, and reworks the calibration package layout. Several module renames and signature changes were made along the way: see Breaking changes below.

Breaking changes

Module renames.

  • quantflow.sp.weiner is now quantflow.sp.wiener (typo fix). Update imports.
  • quantflow.options.calibration is now a package, not a single module. Top-level imports keep working through the package __init__.py re-exports. Code reaching into the old quantflow.options.heston_calibration must switch to quantflow.options.calibration.heston.

ModelOptionPrice field rename. (#47)

  • ModelOptionPrice.moneyness previously meant log(K/F). It now means standardised moneyness log(K/F) / sqrt(ttm), and the raw log-strike is exposed as a new field log_strike. Code reading option.moneyness and expecting a log-strike must switch to option.log_strike.
  • get_intrinsic_value(moneyness=...) argument renamed to log_strike=....

New features

  • BNS2: two-factor Barndorff-Nielsen & Shephard stochastic-volatility model with a single Brownian motion driving a convex combination of independent Gamma-OU variances and per-factor leverage. New section in the BNS calibration tutorial. (#54)
  • DoubleHeston and DoubleHestonJ: two-factor Heston (with optional log-price jumps) and matching DoubleHestonCalibration / DoubleHestonJCalibration. (#46)
  • Lewis and COS option-pricing methods: selectable via OptionPricingMethod, alongside the existing Carr-Madan / FFT path. (#47)
  • CIR tutorial with PDF comparison example. (#49)

Improvements and fixes

  • Heston calibration convergence fixes. (#45, #49)
  • BNS calibration: dedicated BNSCalibration class extracted, characteristic exponent derivation cleaned up, broader test coverage. (#50, #51)
  • OU module reworked: clearer Gamma-OU API, stronger tests for moments and the integrated Laplace transform. (#51)
  • pricing_method_comparison example simplified; redundant time-comparison code removed. (#48)

Documentation and assets

  • New logo set (favicon, lockup, marks, social banners) under docs/assets/logos/. (#53)
  • Bibliography rebuilt from BibTeX via docs/bib2md.py; glossary expanded; mathjax tweaks for inline rendering. (#47, #49)
  • Tutorial-writing instructions added at .github/instructions/tutorial.instructions.md.

Full changelog