CP∂ versus Strata and QuantLib + ORE

Back to insights & articles

Instrument coverage and analytics of Counterpoint Dynamics' CP∂ pricing framework against OpenGamma's Strata and the QuantLib project with ORE, the Open Source Risk Engine built on it, read from each code base at its latest release.

CP∂ is under active development and gains instruments and features weekly. This comparison is a snapshot of CP∂'s main branch on 9 October 2026; Strata, QuantLib and ORE are compared at their latest releases. Rows marked missing or partial for CP∂ may already have moved.

Update, October 2026. Since the September snapshot CP∂ has added zero-coupon swaps, three-leg basis swaps, bills, NDFs, FX options, zero-coupon and year-on-year inflation swaps, and inflation-linked notes. Caps, floors, swaptions and CDSs are now bookable trades, and exotics can be written as data and priced by Monte Carlo. A new Margin & capital family covers ISDA SIMM, FRTB-SA, CRIF generation and per-trade attribution, and gamma now includes the cross terms. QuantLib's column now includes ORE, the Open Source Risk Engine built on it, every library is compared at its latest release, and the shared validation suite has grown from 20 metrics to 25.

CP∂
main @ 2026-10-09
F# / .NET 10 · 45.8k lines
proprietary
Jita CP∂'s maths engine
v1.0.9 @ 2026-10-07
F# / .NET 10 · 13.9k lines
proprietary
QuantLib
v1.43 @ 2026-07-13
C++17 · 437k lines
BSD 3-clause
ORE built on QuantLib, scored in its column
v1.8.17.0 @ 2026-09-15
C++20 · 487k lines
Modified BSD
Strata
v2.12.77 @ 2026-10-05
Java 8+ · 536k lines
Apache 2.0
Shared validation
25 metrics match
within rounding
(23 for QuantLib)

Summary

The three libraries were built for different jobs. The coverage picture follows from that. QuantLib is the broadest pricing toolkit: two decades of instruments and engines across rates, credit, equity, FX and inflation, with short-rate, Heston, local-vol and LIBOR market models, trees, finite differences and Monte Carlo. Strata is a trade-and-market-data platform: every mainstream listed and OTC product, a large convention database, a scenario-and-report calculation engine, and analytic sensitivities in every pricer. Neither simulates exposure, so on its own neither does xVA beyond QuantLib's single-swap analytic CVA engine. ORE, the Open Source Risk Engine, is built on QuantLib to close that gap: trade and market-data XML, portfolio analytics, and exposure simulation with CVA, DVA, FVA, MVA and KVA over netting sets, and SIMM, SA-CCR and SA-CVA. Its column here is therefore QuantLib + ORE, and every cell it supplies through ORE is marked ORE.

CP∂ has the narrowest product set but the deepest analytics stack per trade: symbolic payoffs that compile to exact forward-mode sensitivities, a Monte Carlo engine for CVA, DVA and FVA with netting and CSA, exposure-based VaR, ES and PFE, ISDA SIMM and the FRTB standardised approach fed from the same sensitivities, IFRS 9 hedge effectiveness, funds transfer pricing, and a live-formula Excel emitter. On the products all three share, they match within rounding on the validated metrics. The comparison is about breadth against depth, not correctness.

Of the … product lines in the union below, QuantLib + ORE fully supports …, Strata … and CP∂ …. QuantLib's surplus is equity and exotic options, callable and convertible bonds, CMS, inflation options and Bermudan exercise. Strata's is exchange-traded products, NDFs and CDS indices. CP∂'s is commodity swaps, credit-linked notes, and MTM cross-currency swaps shared only with Strata. Everything downstream of a simulation it shares only with ORE.

Coverage by family

Each row counts the product lines in that family from the instrument matrix below. Solid bars are full support. Hatched extensions are partial support: the product is reachable by assembling primitives, lives in QuantLib's experimental tree, or is present without a pricer.

CP∂StrataQuantLib + ORE partial
Counts are of distinct product lines, not conventions or currencies. A product that a library expresses as a configuration of a generic swap leg still counts once. Bars are in the fixed order CP∂, Strata, QuantLib + ORE within every family.

Code for every row

Every supported cell below carries a runnable example: the fewest lines that build the product and print one number. All three libraries run against one calendar-free market, defined once per library in the preambles here. Open a row with its code button. Each pane's header shows what that snippet printed when it last ran.

The corpus is 316 snippets across 140 rows, all passing. F# scripts for CP∂, Java classes for Strata, Python scripts for QuantLib + ORE. Those go through QuantLib's Python binding, so a few C++-only classes are stated as such rather than imitated. Where QuantLib alone falls short of a row and ORE reaches further, the snippet runs ORE's Python binding instead, on the same market written out as ORE configuration beside the preamble. 45 do, each marked ORE.

Every row is one of two kinds, and the chip beside its name says which. A priced row names one contract and one measure. Every library that supports the row computes exactly that, and the value under each mark is what it printed. A capability row shows only that a feature exists. There the three libraries have no contract in common, and the number carries no claim.

On a priced row the chip reports how far apart the libraries landed:

That is the point of the exercise. A difference in the number means a difference in pricing methodology, or a bug. It never means a difference in the contract. Of the rows two or more libraries price, 58 agree to one part in a billion and 28 to a named residual.

This page is generated from the snippets themselves. Each column is re-run by its own library, and CP∂'s on every CP∂ build, so a snippet shown here is one that runs.

Instrument matrix

One row per product line in the union of the three libraries. Hover or focus a cell for the reason behind a partial or missing mark.

full: a first-class product with a pricer partial: assembled from primitives, experimental, or present without a pricer none

Leg & schedule features

Product coverage understates the two larger libraries' advantage on swaps. Strata's generic swap leg and QuantLib's coupon and schedule classes carry long lists of schedule and rate-computation options. CP∂ splits the same ground in two. Leg conventions cover the common generated schedules. The trade layer lets a trade override its convention outright, or list every period explicitly with its own notional, rate, spread and payment date. The explicit route is available on every trade family.

Analytics matrix

Curves, models, sensitivities, risk and platform capabilities. This is where the three diverge most.

Reference data

Strata's convention database is loaded from editable INI and CSV files; QuantLib's calendars, indices and currencies are C++ classes. CP∂'s conventions are F# code in CPDelta.DefaultContext, weighted toward South African and other African markets, with a resolver hook for overrides.

ItemCP∂StrataQuantLibNote
Currencies4855110Strata accepts any ISO code; 55 have constants. CP∂ includes 12 African currencies and 5 precious metals.
Holiday calendars with real rules12≈2554CP∂: AUD CAD CHF DKK EUR GBP JPY PLN SEK TRY USD ZAR via the PublicHoliday package. QuantLib calendars often carry several exchange and settlement variants each.
IBOR-style indices1611321Strata counts every tenor as a constant; QuantLib and CP∂ count one class per index family.
Overnight indices72116CP∂: AONIA, ESTR, SARON, SOFR, SONIA, TONAR, ZARONIA.
Price indices5915CP∂: EUHICPXT, JPCPI, UKRPI, USCPI, ZACPI. QuantLib counts zero-coupon and year-on-year variants separately.
Day counts82113CP∂ has Act/n, 30/360 (US, E), Act/Act ISDA and ICMA.
Business-day adjustments577CP∂ has no Modified Preceding; it adds two ISDA CDS roll rules the others handle inside the CDS product.
Roll / date-generation rules34511CP∂: none, end-of-month, last business day of month. Strata enumerates day-of-month and weekday rolls; QuantLib has backward, forward, IMM, CDS and zero rules.
Interpolators / extrapolators2 / 315 / 1016 / 2CP∂ solver-supported curve shapes: linear zero and log-linear discount factor. QuantLib counts interpolation families, each usable on discount, zero or forward.
Named swap conventions—57—Strata: 13 fixed-IBOR, 14 fixed-overnight, 10 IBOR-IBOR, 8 cross-currency, 9 inflation, 3 other. CP∂ and QuantLib derive these per index.

Verified parity & speed

CP∂'s test suite prices one calendar-free specification against closed forms, QuantLib 1.43 and Strata 2.12.73. The build fails if any library differs by more than one part in a hundred billion, and every shared product line below passes. What differences remain are rounding: the largest, on the zero-coupon swap, is a millionth of a cent on a ZAR 10 million trade. The snippets run on Strata 2.12.77, whose public API differs from 2.12.73 only by a bucketed CMS vega measure and a bond-period regularity flag.

Timings from the August 2026 comparison on an Apple M4, single-threaded, construct-and-price per operation. They are indicative only. The CP∂ swaption figure predates its analytic Black route and reflects the binomial lattice. QuantLib was driven through its Python binding.

OperationCP∂ µsStrata µsQuantLib µsNote
5Y swap NPV43.611.424.7CP∂ in symbolic expression mode; the float flavour is faster but was not in that run.
European swaption13,39912.531CP∂ lattice at the time; Black is now selected by registering a GBM on the par rate.
15-pillar bootstrap4,4662,3851,049All three reproduce DF(15Y) = 0.4063024141. CP∂'s solve keeps the graph differentiable.
Source: CP∂ commit 37629533, QuantLib v1.43 via SWIG Python, Strata v2.12.73, macOS 26.5. Strata's multi-threaded calculation runner and CP∂'s MSIL and GPU compilation were both outside this measurement.

Where each wins

CP∂ Depth per trade

  • Counterparty risk. A portfolio exposure engine, matched only by ORE's: HW1F, HW2F and GBM drivers with correlation, CVA/DVA/FCA/FBA, netting sets with CSA thresholds and margin period of risk, EE/EPE/ENE, PFE, EEPE, VaR, ES and pathwise xVA sensitivities.
  • Exact sensitivities. Forward-mode automatic differentiation through the whole graph, including the bootstrap root-find, with no calibration Jacobian and no bumping. Gamma and cross-gamma difference the exact gradient.
  • Margin and capital. ISDA SIMM and FRTB-SA from the same sensitivities (FRTB-SA in no other library), CRIF output, and each trade's incremental and Euler share of margin, capital and xVA.
  • Explainability. Every convention and input is a named symbol; the trace renders as MathML, text, or an Excel workbook with live formulas.
  • Treasury and accounting. IFRS 9 hedge effectiveness, funds transfer pricing, retail amortisation.
  • Commodity swaps and CLNs, and a validated MTM cross-currency swap.
  • Bindings. C#, generated Python, F# scripting.

Strata Platform and market

  • Listed products. Futures and options on IBOR, overnight and bond futures, deliverable swap futures, generic ETDs, NDFs, CDS indices.
  • Built-in risk measures. Analytic point sensitivities in every pricer, calibrated and market-quote PV01, gamma, vega, currency exposure, explain PV, all as standard measures.
  • Calculation engine. Scenario perturbations, a multi-threaded runner, CSV and FpML loaders, report templates.
  • Curve groups. Global simultaneous calibration with Jacobians; 15 interpolators; inflation with seasonality.
  • Convention database an order of magnitude larger, in editable files.
  • Apache 2.0 with a decade of production use.

QuantLib + ORE Breadth of models

  • Model zoo. Hull-White, G2++, Vasicek, CIR, Black-Karasinski, GSR and Markov-functional short rate; Heston, Bates, local and stochastic-local vol; LIBOR market model.
  • Numerical methods. Binomial and trinomial trees, finite differences, Monte Carlo with Sobol and Brownian bridge, Longstaff-Schwartz for Bermudan and American exercise.
  • Equity and exotics. Vanilla, American, barrier, Asian, basket, lookback, cliquet, quanto, variance swaps, convertibles, callable bonds.
  • Volatility. SABR and ZABR cubes, optionlet stripping, delta-based FX surfaces, Andreasen-Huge, Heston calibration.
  • Reference data for 110 currencies and 54 calendars.
  • ORE on top. Trade and market-data XML, scripted trades, and a simulation-based exposure engine: CVA, DVA, FVA, MVA and KVA over netting sets with CSAs, EE, EPE and PFE.
  • BSD licence, SWIG bindings for Python, C#, Java and R, and the largest community.

Only QuantLib lacks: built-in sensitivities. Every Greek is a bump-and-reprice the caller arranges, with only an experimental bucket helper. Adjoint differentiation exists as an external fork. It also has no scenario framework, no loaders and no report layer of its own; ORE adds all three, and a sensitivity analytic that arranges the bumping.

Only CP∂ and ORE have a portfolio exposure engine. Only ORE computes KVA, MVA, SA-CCR and SA-CVA; only CP∂ computes FRTB-SA.

Nobody has: reverse-mode adjoint differentiation in the core.

Where CP∂ is thinnest. Bermudan and American exercise, which would need Longstaff-Schwartz on its Monte Carlo engine. SABR, CMS and barrier instruments. Listed futures and options. KVA, MVA, SA-CCR and SA-CVA. The schedule options on generated legs (stubs, roll conventions, amortising notional), which CP∂ reaches only by listing periods explicitly. In the other direction, FRTB-SA and exact sensitivities through the bootstrap are CP∂'s alone, and simulated counterparty risk it shares only with ORE.

Method

All three inventories were read from source. CP∂ from the Instrument union, its definition and trade files, the Models and Analytics folders, CPDelta.DefaultContext, CPDelta.Simm, CPDelta.Frtb, and the design notes. Strata from ProductType, the product, pricer, measure, market, calc and loader modules, and its convention constants, at tag v2.12.77. QuantLib from ql/instruments, ql/pricingengines, ql/models, ql/termstructures, ql/methods, ql/experimental and the calendar, day-count, index and currency headers, at tag v1.43. ORE from its Python wheel 1.8.17.0 and its examples and user guide at tag v1.8.17.0. A QuantLib + ORE cell is ORE's when its snippet runs ORE, and QuantLib's otherwise. A row is full when the library can book the contract: a first-class product type with a pricer, or a capability with a dedicated API. It is partial when the library can only price it, by assembling primitives by hand, or when the product is present without a pricer, lives in QuantLib's experimental tree, or covers a subset of what another library offers. Counts of conventions and indices are of named constants or classes in code; all three accept user-defined additions.

Prepared for Counterpoint Dynamics from the CP∂ repository on branch main and the public Strata, QuantLib and ORE repositories. Performance figures are reproduced from the August 2026 comparison and are not re-measured here.