Repository navigation
nanoql 2.2
·
15 commits
to main
since this release
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.