Skip to content

Commit d6d3ce1

Browse files
committed
feat: add Gaussian1D framework bindings (models, swaption, and cap/floor engines)
1 parent 180f8a8 commit d6d3ce1

20 files changed

Lines changed: 2062 additions & 4 deletions

docs/api/models.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,49 @@ helper = ql.HestonModelHelper(
327327
.. autoclass:: pyquantlib.ConstantParameter
328328
```
329329

330+
## Gaussian 1-D Framework
331+
332+
### Gsr
333+
334+
```{eval-rst}
335+
.. autoclass:: pyquantlib.Gsr
336+
```
337+
338+
Gaussian short-rate (GSR) model in forward measure. Supports constant or piecewise mean reversion and volatility, with both static and floating (Handle-based) data.
339+
340+
```python
341+
# Constant mean reversion
342+
gsr = ql.Gsr(term_structure_handle, [], [0.01], 0.1)
343+
344+
# Piecewise
345+
gsr = ql.Gsr(term_structure, [step_date], [0.01, 0.02], [0.1, 0.15])
346+
```
347+
348+
### MarkovFunctional
349+
350+
```{eval-rst}
351+
.. autoclass:: pyquantlib.MarkovFunctional
352+
```
353+
354+
Markov Functional 1-factor model calibrated to swaption or caplet smiles.
355+
356+
```{eval-rst}
357+
.. autoclass:: pyquantlib.MarkovFunctionalModelSettings
358+
```
359+
360+
```{eval-rst}
361+
.. autoclass:: pyquantlib.MarkovFunctionalModelOutputs
362+
```
363+
364+
```python
365+
# Swaption-calibrated MarkovFunctional
366+
mf = ql.MarkovFunctional(
367+
term_structure, 0.01, [], [0.01],
368+
swaption_vol_handle, expiries, tenors, swap_index,
369+
)
370+
```
371+
330372
```{note}
331373
Abstract base classes are available in `pyquantlib.base` for custom model implementations:
332-
`CalibratedModel`, `ShortRateModel`, `OneFactorModel`, `OneFactorAffineModel`, `TwoFactorModel`, `AffineModel`, `TermStructureConsistentModel`, `CalibrationHelper`, `BlackCalibrationHelper`.
374+
`CalibratedModel`, `ShortRateModel`, `OneFactorModel`, `OneFactorAffineModel`, `TwoFactorModel`, `AffineModel`, `TermStructureConsistentModel`, `Gaussian1dModel`, `CalibrationHelper`, `BlackCalibrationHelper`.
333375
```

docs/api/pricingengines.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,50 @@ engine = ql.FdG2SwaptionEngine(model, tGrid=100, xGrid=50, yGrid=50)
482482
swaption.setPricingEngine(engine)
483483
```
484484

485+
### Gaussian1dSwaptionEngine
486+
487+
```{eval-rst}
488+
.. autoclass:: pyquantlib.Gaussian1dSwaptionEngine
489+
```
490+
491+
Gaussian 1-D model swaption engine with numerical integration. Supports European and Bermudan exercise.
492+
493+
```python
494+
model = ql.Gsr(curve, [ql.Date(15, 1, 2025)], [0.01], 0.01)
495+
engine = ql.Gaussian1dSwaptionEngine(model, integrationPoints=64)
496+
swaption.setPricingEngine(engine)
497+
print(swaption.NPV())
498+
```
499+
500+
### Gaussian1dJamshidianSwaptionEngine
501+
502+
```{eval-rst}
503+
.. autoclass:: pyquantlib.Gaussian1dJamshidianSwaptionEngine
504+
```
505+
506+
Jamshidian decomposition swaption engine for Gaussian 1-D models. European exercise only.
507+
508+
```python
509+
engine = ql.Gaussian1dJamshidianSwaptionEngine(model)
510+
swaption.setPricingEngine(engine)
511+
```
512+
513+
### Gaussian1dNonstandardSwaptionEngine
514+
515+
```{eval-rst}
516+
.. autoclass:: pyquantlib.Gaussian1dNonstandardSwaptionEngine
517+
```
518+
519+
Gaussian 1-D model engine for nonstandard swaptions (period-varying notionals and strikes).
520+
521+
### Gaussian1dFloatFloatSwaptionEngine
522+
523+
```{eval-rst}
524+
.. autoclass:: pyquantlib.Gaussian1dFloatFloatSwaptionEngine
525+
```
526+
527+
Gaussian 1-D model engine for float-float swaptions.
528+
485529
## Barrier Engines
486530

487531
### AnalyticBarrierEngine
@@ -731,6 +775,21 @@ Analytic cap/floor engine for affine short-rate models (Hull-White, CIR, G2++).
731775

732776
Lattice-based cap/floor engine for short-rate models.
733777

778+
### Gaussian1dCapFloorEngine
779+
780+
```{eval-rst}
781+
.. autoclass:: pyquantlib.Gaussian1dCapFloorEngine
782+
```
783+
784+
Gaussian 1-D model cap/floor engine with numerical integration.
785+
786+
```python
787+
model = ql.Gsr(curve, [ql.Date(15, 1, 2025)], [0.01], 0.01)
788+
engine = ql.Gaussian1dCapFloorEngine(model, integrationPoints=64)
789+
cap.setPricingEngine(engine)
790+
print(cap.NPV())
791+
```
792+
734793
## YoY Inflation Cap/Floor Engines
735794

736795
### YoYInflationBlackCapFloorEngine

docs/changelog.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4040
- `MCDigitalEngine` factory function for Monte Carlo digital option pricing (pseudo-random and low-discrepancy)
4141
- `AnalyticDividendEuropeanEngine` for European options with discrete dividends
4242
- `AnalyticBSMHullWhiteEngine` for BSM + Hull-White stochastic interest rates
43+
- `Gaussian1dSwaptionEngine` for Gaussian 1-D model swaption pricing (European/Bermudan)
44+
- `Gaussian1dJamshidianSwaptionEngine` for Jamshidian decomposition swaption pricing
45+
- `Gaussian1dNonstandardSwaptionEngine` for nonstandard swaption pricing with OAS support
46+
- `Gaussian1dFloatFloatSwaptionEngine` for float-float swaption pricing with OAS support
47+
- `Gaussian1dCapFloorEngine` for Gaussian 1-D model cap/floor pricing
4348
- `AnalyticCapFloorEngine` for analytic cap/floor pricing with affine short-rate models
4449
- `TreeCapFloorEngine` for lattice-based cap/floor pricing with short-rate models
4550

4651
#### Models
52+
- `Gaussian1dModel` ABC for Gaussian 1-D short-rate models (in `pyquantlib.base`)
53+
- `Gsr` Gaussian short-rate model with piecewise volatility and reversion, plus calibration methods
54+
- `MarkovFunctional` Markov-functional model with `ModelSettings` builder and `ModelOutputs` diagnostics
55+
- `Gaussian1dModelHandle` and `RelinkableGaussian1dModelHandle` for Gaussian1dModel references
4756
- `CoxIngersollRoss` (CIR) short-rate model with Feller constraint support
4857
- `ExtendedCoxIngersollRoss` extended CIR model fitted to the initial term structure
4958
- `CapHelper` calibration helper for ATM caps (with handle and hidden-handle constructors)

include/pyquantlib/pyquantlib.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ namespace ql_models {
297297
void hestonmodelhelper(py::module_&);
298298
void coxingersollross(py::module_&);
299299
void extendedcoxingersollross(py::module_&);
300+
void gaussian1dmodel(py::module_&);
301+
void gsr(py::module_&);
302+
void markovfunctional(py::module_&);
300303
}
301304

302305
namespace ql_instruments {
@@ -455,6 +458,12 @@ namespace ql_pricingengines {
455458
// Cap/floor engines
456459
void analyticcapfloorengine(py::module_&);
457460
void treecapfloorengine(py::module_&);
461+
void gaussian1dcapfloorengine(py::module_&);
462+
// Gaussian1D swaption engines
463+
void gaussian1dswaptionengine(py::module_&);
464+
void gaussian1djamshidianswaptionengine(py::module_&);
465+
void gaussian1dnonstandardswaptionengine(py::module_&);
466+
void gaussian1dfloatfloatswaptionengine(py::module_&);
458467
}
459468

460469
namespace ql_methods {

pyquantlib/__init__.pyi

Lines changed: 23 additions & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)