Repository navigation
Releases
Releases · nanoql-dev/nanoql
nanoql 2.3.1
Immutable
release. Only release title and notes can be modified.
Added
- Two guides: the FAQ, on the platforms, the .NET versions, how nanoql relates to QuantLib, the
licences and where to ask; and how nanoql is checked, from the references and the tolerance to the
checks on each change and release. Getting started's first swap runs in Python too.
Fixed
- The Excel add-in under multi-threaded calculation, Excel's default: every generated worksheet function was
registered thread-safe, so Excel's calculation threads showed handles too, through Excel's RTD function, which Excel
can refuse there. On some machines it did: Excel-DNA's log window opened with "The RTD server … could not be
registered" for each cell making a handle, and the cell's result rested on Excel recalculating it later on its main
thread. A function whose result is a handle, or holds handles, now runs on Excel's main thread; every other function
still runs on all of Excel's threads. A workbook building many costly objects at once, such as bootstrapped curves,
calibrations or engines' results, now builds them one at a time; the values computed from them still use all of
Excel's threads (#28). nqlxlVersion()named 2.0 in every 2.y add-in, and a repro export's vectors named their generator
nanoql-excel 2.0.0: both read the add-in's assembly version, which stays 2.0.0.0 within 2.y. Both now give the
release's version.
Known limits
- The Excel add-ins are unsigned. A firm whose Excel requires add-ins signed by a trusted publisher signs the
.xll
with its own certificate. - The add-ins run on the .NET 10 Desktop Runtime, Excel-DNA's just-in-time path, not compiled to native code.
- The Function Wizard shows some functions' argument names cut short, since Excel takes a function's argument names
as one text of 255 characters at most:nqlOISRateHelper,nqlOISRateHelper2,nqlOvernightIndexedCouponand
nqlSabrSwaptionVolatilityCube, and in the experimental add-innqlConstNotionalCrossCurrencyBasisSwapRateHelper
andnqlMtMCrossCurrencyBasisSwapRateHelpertoo. Each still takes every argument. - The bindings, the C++ layer among them, cover Windows x64 and Arm64, Linux x64 and Arm64 (glibc 2.28 or later) and
macOS on Apple silicon (14 or later); Intel Macs have none, though nanoql's .NET library runs there. - A .NET app of your own published with Native AOT for
osx-arm64carries .NET 10's unwind fault
(dotnet/runtime#135616) until .NET ships its fix;
nanoql-bind fix-unwindcorrects its object before the link (the bindings guide, "On macOS"). - macOS's C archive isn't notarized: a browser download opened in Finder carries the quarantine attribute into its
folder, whichxattr -dr com.apple.quarantine <folder>clears. - On macOS, a caller of the C library through its own libffi (ctypes, cffi's ABI mode, JNA) misreads a by-value period
that five functions take on the stack, until its libffi carries the fix of libffi issue #750; nanoql's Python package
and callers compiled by clang are unaffected (the bindings guide, "C and C++"). - Python 3.11 or later; NumPy 1.26 or later, 2.3 or later on Windows Arm64.
- The Java layer is built and tested in the repository and not released.
The platforms in this release's run
- Windows x64: 8,729 of 8,729 tests pass, the reference platform.
- Windows Arm64: 8,667 of 8,729 tests pass; 62 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.AmericanBasketStrikeScalingTests.APositiveStrikeKeepsQuantLibsBits,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CurveRecalculationTests.ACurveOnAChangedQuoteIsBootstrappedAfreshand 52 more. - Linux x64: 8,656 of 8,729 tests pass; 73 fail, reported and not blocking:
NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolvedand 63 more. - Linux Arm64: 8,654 of 8,729 tests pass; 75 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolvedand 65 more. - macOS Arm64: 8,653 of 8,729 tests pass; 76 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.BetaRiskTests.AMultiEventPathMovesItsLaterDatesOnly,NanoQL.Tests.Divergences.CTSMMCapletAlphaFormCalibrationTests.ACalibrationWhoseReturnedPassFitsKeepsQuantLibsNumbers,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolvedand 66 more. - The linux-arm64 bindings: every check green.
- The linux-x64 bindings: every check green.
- The osx-arm64 bindings: every check green.
- The win-arm64 bindings: every check green.
- The win-x64 bindings: every check green.
nanoql 2.3
Immutable
release. Only release title and notes can be modified.
Added
- The bindings on three more platforms: Python's wheels and the C archive, its C++ header and CMake package among
it, for Windows Arm64, Linux Arm64 (glibc 2.28 or later) and macOS on Apple silicon (14 or later), each built and
checked in every release run as Windows x64 and Linux x64 are, its replays of the vector suite bit for bit with .NET
on the same machine (#19).
Changed
- Complex exponentials, powers, sines and cosines take the angle's sine and cosine apart, in nanoql's own
functions in place ofSystem.Numerics.Complex's, which take both fromMath.SinCos: under .NET's JIT the
platform's combined routine, an ulp off for some angles on macOS and on Linux x64 with glibc older than 2.36. There
a result resting on them can move in its last bits, and now matches the native library's bit for bit: the Heston
family's semi-analytic engines (Bates's and the COS engine among them), the Heston process's density and its
Broadie–Kaya schemes, the variance-gamma FFT engines, and the complexExpm1, exponential integrals and Bessel
functions. On Windows and on Linux Arm64 nothing moves.
Fixed
nanoql-bind buildon macOS: a native library it built forosx-arm64could read a caller's floating-point
values wrong, with no refusal, after an exception thrown and caught inside a call, an internal fallback's: .NET 10's
Native AOT writes the unwind information of a function that saves d8 to d15 in the wrong bits
(dotnet/runtime#135616). The tool now corrects it before the
link; rebuild such a library with this release's tool.
Known limits
- The Excel add-ins are unsigned. A firm whose Excel requires add-ins signed by a trusted publisher signs the
.xll
with its own certificate. - The add-ins run on the .NET 10 Desktop Runtime, Excel-DNA's just-in-time path, not compiled to native code.
- The bindings, the C++ layer among them, cover Windows x64 and Arm64, Linux x64 and Arm64 (glibc 2.28 or later) and
macOS on Apple silicon (14 or later); Intel Macs have none, though nanoql's .NET library runs there. - A .NET app of your own published with Native AOT for
osx-arm64carries the same unwind fault until .NET ships its
fix;nanoql-bind fix-unwindcorrects its object before the link (the bindings guide, "On macOS"). - macOS's C archive isn't notarized: a browser download opened in Finder carries the quarantine attribute into its
folder, whichxattr -dr com.apple.quarantine <folder>clears. - On macOS, a caller of the C library through its own libffi (ctypes, cffi's ABI mode, JNA) misreads a by-value period
that five functions take on the stack, until its libffi carries the fix of libffi issue #750; nanoql's Python package
and callers compiled by clang are unaffected (the bindings guide, "C and C++"). - Python 3.11 or later; NumPy 1.26 or later, 2.3 or later on Windows Arm64.
- The Java layer is built and tested in the repository and not released.
The platforms in this release's run
- Windows x64: 8,729 of 8,729 tests pass, the reference platform.
- Windows Arm64: 8,667 of 8,729 tests pass; 62 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.AmericanBasketStrikeScalingTests.APositiveStrikeKeepsQuantLibsBits,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CurveRecalculationTests.ACurveOnAChangedQuoteIsBootstrappedAfreshand 52 more. - Linux x64: 8,656 of 8,729 tests pass; 73 fail, reported and not blocking:
NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolvedand 63 more. - Linux Arm64: 8,654 of 8,729 tests pass; 75 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolvedand 65 more. - macOS Arm64: 8,653 of 8,729 tests pass; 76 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.BetaRiskTests.AMultiEventPathMovesItsLaterDatesOnly,NanoQL.Tests.Divergences.CTSMMCapletAlphaFormCalibrationTests.ACalibrationWhoseReturnedPassFitsKeepsQuantLibsNumbers,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolvedand 66 more. - The linux-arm64 bindings: every check green.
- The linux-x64 bindings: every check green.
- The osx-arm64 bindings: every check green.
- The win-arm64 bindings: every check green.
- The win-x64 bindings: every check green.
nanoql 2.2
Immutable
release. Only release title and notes can be modified.
Added
- Experimental: a tranche's expected loss from the saddle-point model's own tail.
SaddlePointTailLossModel<TCopula, TInitTraits>integrates the model's saddle-point tail over the tranche, where
SaddlePointLossModelreads a large-pool loss. On a 100-name pool (hazard 1%, recovery 40%), where that reading puts
the whole loss in the first tranche at correlation 0, it is within 2% of the recursive model on the same latent model
on the 3% to 22% tranches at correlations from 0.3, at one and five years. At high correlation it refuses a tranche
whose tail it can't read: one attaching close above zero, [0.1%, 3%] from 0.6, or a senior one crowding the pool's
largest loss, [22%, 60%] at 0.9 (#13). - Experimental: the analytic GJR-GARCH engine within the no-arbitrage bounds.
AnalyticGJRGARCHEngine.CalculateWithinBounds, on an engine or static, returnsCalculate's results but refuses a
price outside a call's or a put's no-arbitrage bounds beyond rounding: the Edgeworth price leaves them in both wings
at every λ, and everywhere once the variance's moments grow.Calculateis unchanged (#14). - Where the closed-form barrier and lookback engines are exact: each engine's remarks state its condition under term
structures, on a volatility of time alone: (r − q)/σ² constant over the option's life; for a rebate paid at the hit,
r/σ² and q/σ² each constant; for the partial-time windows, σ and r − q flat. Each names the engine to use outside it,
where the library has one (#15).
Fixed
- Black's formula: a price below zero within rounding, which its arithmetic can reach at tiny standard deviations,
is 0, where QuantLib's check refused it ("negative value"): within 16 ε of the discounted larger of the forward and
the strike, a few ulps of the forward. A larger negative and NaN still refuse. The Gaussian copula spread engine then
prices volatilities within rounding of zero, from about 1e-14 to 1e-8, but for most from 4e-14 to 1.3e-9, which its
density calculator refuses (#12). - Kahale's interpolated smile section: a segment whose fit missed its right end's price, a jump in the section and
an arbitrage, is refitted to the same ends and slopes, so nothing else in the section moves; on 163 SABR smiles of a
sweep the fit missed on 60. The route is opt-in:KahaleSmileSection'sinterpolate, and the Markov-functional
model'sKahaleInterpolationadjustment (#16).
Known limits
- The Excel add-ins are unsigned. A firm whose Excel requires add-ins signed by a trusted publisher signs the
.xll
with its own certificate. - The add-ins run on the .NET 10 Desktop Runtime, Excel-DNA's just-in-time path, not compiled to native code.
- The bindings, the C++ layer among them, cover Windows x64 and Linux x64 (glibc 2.28 or later); Windows Arm64,
Linux Arm64 and macOS on Apple silicon follow in later releases, and Intel Macs have none, though nanoql's .NET
library runs there. - Python 3.11 or later.
- The Java layer is built and tested in the repository and not released.
The platforms in this release's run
- Windows x64: 8,728 of 8,728 tests pass, the reference platform.
- Linux x64: 8,655 of 8,728 tests pass; 73 fail, reported and not blocking:
NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolvedand 63 more. - macOS Arm64: 8,652 of 8,728 tests pass; 76 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.BetaRiskTests.AMultiEventPathMovesItsLaterDatesOnly,NanoQL.Tests.Divergences.CTSMMCapletAlphaFormCalibrationTests.ACalibrationWhoseReturnedPassFitsKeepsQuantLibsNumbers,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolvedand 66 more. - The linux-x64 bindings: every check green.
- The win-x64 bindings: every check green.
nanoql 2.1
Immutable
release. Only release title and notes can be modified.
Added
- The C++ layer: each platform's C archive carries
nanoql.hpp, C++17 overnanoql.h, and a CMake package in
lib/cmake/nanoql/:find_package(nanoql CONFIG)givesnanoql::cppandnanoql::c, and a version request
follows CMake's SameMajorVersion rule. The C++ page covers installing, CMake and a first program
(#7). nanoql-bindwrites the C++ layer for a library of your own:cpp, andbuild'sinclude/beside the C
headers.- Migrating from QuantLib's C++: a guide pairs QuantLib's C++ with nanoql's
C++ layer for the rates products, beside the QuantLib-Python and QLNet guides.
Fixed
- Python:
OISRateHelper's tenor form andSwapRateHelper's two forms taking a rate can be called without
forward_startorfwd_start, as their defaults allow; they raised "no overload takes these arguments" (#8).
Validation
- The coverage figures count only the lines a test executes: the test data the runner built while discovering the
tests no longer counts as covered, so the same tests read slightly lower figures than 2.0's.
Known limits
- The Excel add-ins are unsigned. A firm whose Excel requires add-ins signed by a trusted publisher signs the
.xll
with its own certificate. - The add-ins run on the .NET 10 Desktop Runtime, Excel-DNA's just-in-time path, not compiled to native code.
- The bindings, the C++ layer among them, cover Windows x64 and Linux x64 (glibc 2.28 or later); Windows Arm64,
Linux Arm64 and macOS on Apple silicon follow in later releases, and Intel Macs have none, though nanoql's .NET
library runs there. - Python 3.11 or later.
- The Java layer is built and tested in the repository and not released.
The platforms in this release's run
- Windows x64: 8,622 of 8,622 tests pass, the reference platform.
- Linux x64: 8,549 of 8,622 tests pass; 73 fail, reported and not blocking:
NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolvedand 63 more. - macOS Arm64: 8,546 of 8,622 tests pass; 76 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.BetaRiskTests.AMultiEventPathMovesItsLaterDatesOnly,NanoQL.Tests.Divergences.CTSMMCapletAlphaFormCalibrationTests.ACalibrationWhoseReturnedPassFitsKeepsQuantLibsNumbers,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolvedand 66 more. - The linux-x64 bindings: every check green.
- The win-x64 bindings: every check green.
nanoql 2.0
Immutable
release. Only release title and notes can be modified.
nanoql's first public release is 2.0, the whole library rather than a preview. Its versions have two parts: a minor
release adds, and nothing stable is removed until it has been deprecated for at least two releases and a year. The
experimental API may change in any release, and its released names are never reused.
Added
- The library,
NanoQLon NuGet, for .NET 10: dates, calendars and day counts; interest-rate, credit, equity, FX,
inflation and commodity term structures, bootstrapped or fitted; instruments with their cash flows; and the pricing
engines and models over them, analytic, tree, finite-difference and Monte Carlo. Every pricer is a plain function of
its inputs: there are no observers, lazy objects or global evaluation date. - The extensions,
NanoQL.Extensions: market conventions as XML records, which a desk reads, overrides and
versions, with every preset nanoql ships; and instruments and models beyond the core. - Python,
pip install nanoql: one wheel per platform for Python 3.11 or later, nanoql's native library inside,
no .NET runtime needed. - C, an archive per platform on the GitHub Release:
nanoql.h, the library and the notices, for C and any
language that calls C. The symbols ship in an archive of their own. - Excel,
nanoql-excel-2.0-win-x64.zipon the GitHub Release: the stable add-in and the experimental one, and five
example workbooks; their symbols in a zip of their own. - The bindings tool,
NanoQL.Bindon NuGet: a library, a Python package or an Excel add-in of your own, your
assembly's functions beside nanoql's in one native library; andNanoQL.Excel, the add-in's runtime, which the tool's
builds restore. - Debugging: each NuGet package's symbols on NuGet's symbol server, and the native library's in the release's
symbols archives, their sources mapped to this release's commit on GitHub.
Validation
Checked against QuantLib 1.44 on Windows x64.
- The vectors: 3,348,122 reference outputs in 1,169 vector files, of which four files and 39,887 outputs check
QLNet's additions against QLNet 1.13.2. Each output agrees within a relative 1e-10 of the larger of the two values and
the output's scale (an amount's is its notional), except 4,854 (0.14%) held to a documented looser tolerance. - The tests: QuantLib's own tests, ported at QuantLib's tolerances.
- The types: 2,281 of the 2,282 public types with executable code are run by a QuantLib-checked test, QLNet's
additions by a QLNet-checked one. The one apart,FactorReductionFunctions, every output of which is QuantLib's
defect fixed, is checked by its own tests. 303 more are listed apart, 291 with no executable code and 12 own-tested
(six of them extensions, five experimental and one a term structure), and three are equality-only. 89.5% of the ported
lines are covered. - The divergences: 720 documented divergences from QuantLib, each with its own test class.
What each module's checks cover is on the validation page.
Platforms
- Windows x64: the validated platform, where every test and vector passes; a failure there blocks a release.
- Linux and macOS, the .NET library: supported; their known differences, a result's last bits where the C
runtime's maths functions differ, are counted in each release's notes. - The bindings, the native library under C and Python: Windows x64 and Linux x64 (glibc 2.28 or later), each built
and tested natively in every release run, its differences counted in each release's notes. Windows Arm64, Linux
Arm64 and macOS on Apple silicon follow in later releases.
Versions
- A version is major and minor, with a third part only for a fix (2.0.1). A minor release adds; a 2.y release removes
or changes the stable API only where it was deprecated at least two releases and at least a year before, and a
deprecated member says so in every language. - The experimental API (the
NQL0001diagnostic, C'sNANOQL_EXPERIMENTAL, the experimental add-in) may change or go
in any release. Its released names still never move and are never reused: a removed function's name is retired. - A released C function's, type's or Excel function's name never moves, in any release.
Extension points
The public bases QuantLib's hierarchy derives from, abstract or unsealed, are nanoql's extension points: term
structures, stochastic processes, volatility structures, calendars, day counters and the rest, listed on
the extension points page. Six generic types are open in 2.0 where
QuantLib's are sealed by their use:
- three extension points:
PiecewiseSpreadYieldCurve<,>,InterpolatedPiecewiseForwardSpreadedTermStructure<>and
InterpolatedYoYOptionletStripper<>; - three open to nanoql's own named classes only, through
private protectedconstructors:
InterpolatedYoYCapFloorTermPriceSurface<,>,InterpolatedYoYOptionletVolatilityCurve<>and
KInterpolatedYoYOptionletVolatilitySurface<>.
Known limits
- The Excel add-ins are unsigned. A firm whose Excel requires add-ins signed by a trusted publisher signs the
.xll
with its own certificate. - The add-ins run on the .NET 10 Desktop Runtime, Excel-DNA's just-in-time path, not compiled to native code.
- No bindings for Intel Macs; nanoql's .NET library runs there.
- Python 3.11 or later.
- The Java and C++ layers are built and tested in the repository and not released; C++ includes
nanoql.has it is.
The platforms in this release's run
- Windows x64: 8,605 of 8,605 tests pass, the reference platform.
- Linux x64: 8,533 of 8,605 tests pass; 72 fail, reported and not blocking:
NanoQL.Tests.Conventions.HestonSlvMcQualityMaximumTests.TheCalibrationsLargestErrorIsWithinFifteenBasisPoints,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheFixedVsFloatingSwapsCompoundingLegsFairSpreadIsSolved,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheMtMSwapsCompoundingLegsFairSpreadIsSolvedand 62 more. - macOS Arm64: 8,530 of 8,605 tests pass; 75 fail, reported and not blocking:
NanoQL.Tests.Conventions.BoostSignTests.TheSignOfANaNIsItsSignBit,NanoQL.Tests.Divergences.AbcdCalibrationGuardTests.TheFitsQuantLibCompletesKeepItsBits(set: 5, a: 0.45336334464724903, b: -1.4254877636528123, c: 1.5935876342523034, d: 0.26597942707915356),NanoQL.Tests.Divergences.BetaRiskTests.AMultiEventPathMovesItsLaterDatesOnly,NanoQL.Tests.Divergences.CTSMMCapletAlphaFormCalibrationTests.ACalibrationWhoseReturnedPassFitsKeepsQuantLibsNumbers,NanoQL.Tests.Divergences.CalibrationBasketNominalTests.AFlippedSolutionKeepsItsNominal,NanoQL.Tests.Divergences.CirFellerConstraintTests.ACalibrationWithTheSpeedAndLevelFixedIsQuantLibs,NanoQL.Tests.Divergences.CmsCalibrationGuessTests.TheFixedPathStartsAtTheGuess,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheLevenbergMarquardtFitsKeepQuantLibsValues,NanoQL.Tests.Divergences.CmsCalibrationReversionTransformTests.TheSimplexFitsHaveAFiniteReversion,NanoQL.Tests.Divergences.CrossCurrencySwapCompoundedSpreadFairSpreadTests.TheBasisSwapsCompoundingLegsFairSpreadIsSolvedand 65 more. - The linux-x64 bindings: every check green.
- The win-x64 bindings: every check green.