Skip to content

nanoql 2.2

Choose a tag to compare

@github-actions github-actions released this 07 Nov 17:56
· 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
    SaddlePointLossModel reads 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, returns Calculate'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. Calculate is 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's interpolate, and the Markov-functional
    model's KahaleInterpolation adjustment (#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.TheMtMSwapsCompoundingLegsFairSpreadIsSolved and 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.TheBasisSwapsCompoundingLegsFairSpreadIsSolved and 66 more.
  • The linux-x64 bindings: every check green.
  • The win-x64 bindings: every check green.