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.
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.
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.
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.
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.
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.
Curves, models, sensitivities, risk and platform capabilities. This is where the three diverge most.
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.
| Item | CP∂ | Strata | QuantLib | Note |
|---|---|---|---|---|
| Currencies | 48 | 55 | 110 | Strata accepts any ISO code; 55 have constants. CP∂ includes 12 African currencies and 5 precious metals. |
| Holiday calendars with real rules | 12 | ≈25 | 54 | CP∂: 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 indices | 16 | 113 | 21 | Strata counts every tenor as a constant; QuantLib and CP∂ count one class per index family. |
| Overnight indices | 7 | 21 | 16 | CP∂: AONIA, ESTR, SARON, SOFR, SONIA, TONAR, ZARONIA. |
| Price indices | 5 | 9 | 15 | CP∂: EUHICPXT, JPCPI, UKRPI, USCPI, ZACPI. QuantLib counts zero-coupon and year-on-year variants separately. |
| Day counts | 8 | 21 | 13 | CP∂ has Act/n, 30/360 (US, E), Act/Act ISDA and ICMA. |
| Business-day adjustments | 5 | 7 | 7 | CP∂ has no Modified Preceding; it adds two ISDA CDS roll rules the others handle inside the CDS product. |
| Roll / date-generation rules | 3 | 45 | 11 | CP∂: 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 / extrapolators | 2 / 3 | 15 / 10 | 16 / 2 | CP∂ 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. |
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.
| Operation | CP∂ µs | Strata µs | QuantLib µs | Note |
|---|---|---|---|---|
| 5Y swap NPV | 43.6 | 11.4 | 24.7 | CP∂ in symbolic expression mode; the float flavour is faster but was not in that run. |
| European swaption | 13,399 | 12.5 | 31 | CP∂ lattice at the time; Black is now selected by registering a GBM on the par rate. |
| 15-pillar bootstrap | 4,466 | 2,385 | 1,049 | All three reproduce DF(15Y) = 0.4063024141. CP∂'s solve keeps the graph differentiable. |
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.
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.