itofin 0.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- itofin-0.6.1/Cargo.lock +185 -0
- itofin-0.6.1/Cargo.toml +13 -0
- itofin-0.6.1/PKG-INFO +221 -0
- itofin-0.6.1/README.md +200 -0
- itofin-0.6.1/crates/itofin-py/Cargo.toml +16 -0
- itofin-0.6.1/crates/itofin-py/README.md +200 -0
- itofin-0.6.1/crates/itofin-py/src/calibration.rs +112 -0
- itofin-0.6.1/crates/itofin-py/src/curve.rs +70 -0
- itofin-0.6.1/crates/itofin-py/src/heston.rs +288 -0
- itofin-0.6.1/crates/itofin-py/src/hullwhite.rs +229 -0
- itofin-0.6.1/crates/itofin-py/src/lib.rs +93 -0
- itofin-0.6.1/crates/itofin-py/src/market.rs +131 -0
- itofin-0.6.1/crates/itofin-py/src/option.rs +125 -0
- itofin-0.6.1/crates/itofin-py/src/settings.rs +40 -0
- itofin-0.6.1/crates/itofin-py/src/swap.rs +148 -0
- itofin-0.6.1/crates/itofin-py/src/swaption.rs +159 -0
- itofin-0.6.1/crates/itofin-py/src/time.rs +384 -0
- itofin-0.6.1/crates/itofin-py/tests/test_european_option.py +69 -0
- itofin-0.6.1/crates/itofin-py/tests/test_heston_calibration.py +140 -0
- itofin-0.6.1/crates/itofin-py/tests/test_heston_pricing.py +53 -0
- itofin-0.6.1/crates/itofin-py/tests/test_hullwhite_calibration.py +115 -0
- itofin-0.6.1/crates/itofin-py/tests/test_hullwhite_model.py +48 -0
- itofin-0.6.1/crates/itofin-py/tests/test_market.py +25 -0
- itofin-0.6.1/crates/itofin-py/tests/test_primitives.py +61 -0
- itofin-0.6.1/crates/itofin-py/tests/test_schedule.py +96 -0
- itofin-0.6.1/crates/itofin-py/tests/test_shared.py +68 -0
- itofin-0.6.1/crates/itofin-py/tests/test_skeleton.py +9 -0
- itofin-0.6.1/crates/itofin-py/tests/test_swaption.py +139 -0
- itofin-0.6.1/crates/itofin-py/tests/test_vanilla_swap.py +126 -0
- itofin-0.6.1/crates/libitofin/Cargo.toml +17 -0
- itofin-0.6.1/crates/libitofin/README.md +27 -0
- itofin-0.6.1/crates/libitofin/src/cashflow.rs +378 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/capflooredcoupon.rs +397 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/capflooredcoupon_oracle.rs +357 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/cashflows.rs +2644 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/coupon.rs +506 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/couponpricer.rs +406 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/dividend.rs +256 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/duration.rs +31 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/fixedratecoupon.rs +329 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/fixedrateleg.rs +694 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/floatingratecoupon.rs +564 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/iborcoupon.rs +685 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/iborleg.rs +666 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/mod.rs +44 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/overnightindexedcoupon.rs +580 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/overnightindexedcouponpricer.rs +388 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/overnightleg.rs +466 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/rateaveraging.rs +14 -0
- itofin-0.6.1/crates/libitofin/src/cashflows/simplecashflow.rs +286 -0
- itofin-0.6.1/crates/libitofin/src/currency.rs +182 -0
- itofin-0.6.1/crates/libitofin/src/discretizedasset.rs +599 -0
- itofin-0.6.1/crates/libitofin/src/errors.rs +135 -0
- itofin-0.6.1/crates/libitofin/src/event.rs +193 -0
- itofin-0.6.1/crates/libitofin/src/exercise.rs +86 -0
- itofin-0.6.1/crates/libitofin/src/handle.rs +521 -0
- itofin-0.6.1/crates/libitofin/src/indexes/ibor/eonia.rs +80 -0
- itofin-0.6.1/crates/libitofin/src/indexes/ibor/estr.rs +79 -0
- itofin-0.6.1/crates/libitofin/src/indexes/ibor/euribor.rs +250 -0
- itofin-0.6.1/crates/libitofin/src/indexes/ibor/mod.rs +20 -0
- itofin-0.6.1/crates/libitofin/src/indexes/ibor/sofr.rs +79 -0
- itofin-0.6.1/crates/libitofin/src/indexes/iborindex.rs +606 -0
- itofin-0.6.1/crates/libitofin/src/indexes/index.rs +244 -0
- itofin-0.6.1/crates/libitofin/src/indexes/interestrateindex.rs +514 -0
- itofin-0.6.1/crates/libitofin/src/indexes/mod.rs +18 -0
- itofin-0.6.1/crates/libitofin/src/indexes/swapindex.rs +398 -0
- itofin-0.6.1/crates/libitofin/src/instrument.rs +1038 -0
- itofin-0.6.1/crates/libitofin/src/instruments/bond.rs +794 -0
- itofin-0.6.1/crates/libitofin/src/instruments/bonds/fixedratebond.rs +310 -0
- itofin-0.6.1/crates/libitofin/src/instruments/bonds/mod.rs +8 -0
- itofin-0.6.1/crates/libitofin/src/instruments/capfloor.rs +466 -0
- itofin-0.6.1/crates/libitofin/src/instruments/fixedvsfloatingswap.rs +921 -0
- itofin-0.6.1/crates/libitofin/src/instruments/futures.rs +19 -0
- itofin-0.6.1/crates/libitofin/src/instruments/makeois.rs +933 -0
- itofin-0.6.1/crates/libitofin/src/instruments/makeswaption.rs +473 -0
- itofin-0.6.1/crates/libitofin/src/instruments/makevanillaswap.rs +830 -0
- itofin-0.6.1/crates/libitofin/src/instruments/mod.rs +43 -0
- itofin-0.6.1/crates/libitofin/src/instruments/oneassetoption.rs +625 -0
- itofin-0.6.1/crates/libitofin/src/instruments/overnightindexedswap.rs +622 -0
- itofin-0.6.1/crates/libitofin/src/instruments/payoffs.rs +139 -0
- itofin-0.6.1/crates/libitofin/src/instruments/swap.rs +775 -0
- itofin-0.6.1/crates/libitofin/src/instruments/swaption.rs +471 -0
- itofin-0.6.1/crates/libitofin/src/instruments/vanillaswap.rs +401 -0
- itofin-0.6.1/crates/libitofin/src/interestrate.rs +733 -0
- itofin-0.6.1/crates/libitofin/src/lib.rs +36 -0
- itofin-0.6.1/crates/libitofin/src/math/array.rs +289 -0
- itofin-0.6.1/crates/libitofin/src/math/beta.rs +205 -0
- itofin-0.6.1/crates/libitofin/src/math/comparison.rs +157 -0
- itofin-0.6.1/crates/libitofin/src/math/copulas.rs +524 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/binomial.rs +214 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/bivariatenormal.rs +501 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/bivariatestudentt.rs +351 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/chisquare.rs +149 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/gamma.rs +133 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/mod.rs +155 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/noncentralchisquare.rs +633 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/normal.rs +368 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/poisson.rs +307 -0
- itofin-0.6.1/crates/libitofin/src/math/distributions/studentt.rs +343 -0
- itofin-0.6.1/crates/libitofin/src/math/errorfunction.rs +193 -0
- itofin-0.6.1/crates/libitofin/src/math/expm1.rs +107 -0
- itofin-0.6.1/crates/libitofin/src/math/gammafunction.rs +236 -0
- itofin-0.6.1/crates/libitofin/src/math/incompletegamma.rs +213 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/discrete.rs +358 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/exponential_integrals.rs +602 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/expsinh.rs +248 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/filon.rs +203 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/gaussiannoncentralchisquaredpolynomial.rs +255 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/gaussianorthogonalpolynomial.rs +386 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/gaussianquadratures.rs +740 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/gausslaguerrecosinepolynomial.rs +173 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/kronrod.rs +581 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/lobatto.rs +340 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/mod.rs +193 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/momentbasedgaussianpolynomial.rs +220 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/piecewise.rs +244 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/segment.rs +114 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/simpson.rs +99 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/tabulatedgausslegendre.rs +177 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/tanhsinh.rs +229 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/trapezoid.rs +209 -0
- itofin-0.6.1/crates/libitofin/src/math/integrals/twodimensional.rs +165 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/bicubic.rs +343 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/bilinear.rs +321 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/cubic.rs +1431 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/flat.rs +353 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/linear.rs +251 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/loglinear.rs +234 -0
- itofin-0.6.1/crates/libitofin/src/math/interpolations/mod.rs +105 -0
- itofin-0.6.1/crates/libitofin/src/math/matrix.rs +377 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/choleskydecomposition.rs +299 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/mod.rs +18 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/pseudosqrt.rs +352 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/qrdecomposition.rs +281 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/svd.rs +519 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/symmetricschurdecomposition.rs +213 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/testsupport.rs +136 -0
- itofin-0.6.1/crates/libitofin/src/math/matrixutilities/tqreigendecomposition.rs +308 -0
- itofin-0.6.1/crates/libitofin/src/math/mod.rs +22 -0
- itofin-0.6.1/crates/libitofin/src/math/ode.rs +349 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/conjugategradient.rs +115 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/constraint.rs +264 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/costfunction.rs +254 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/endcriteria.rs +361 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/levenbergmarquardt.rs +428 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/linesearch.rs +243 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/linesearchbasedmethod.rs +80 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/lmdif.rs +1017 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/method.rs +25 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/mod.rs +19 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/problem.rs +179 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/projectedconstraint.rs +98 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/projection.rs +154 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/simplex.rs +268 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/steepestdescent.rs +60 -0
- itofin-0.6.1/crates/libitofin/src/math/optimization/testsupport.rs +82 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/boxmullergaussianrng.rs +92 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/inversecumulativersg.rs +135 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/knuthuniformrng.rs +203 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/lattice.rs +167 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/lattice_tables.rs +917 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/mod.rs +62 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/mt19937uniformrng.rs +160 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/randomsequencegenerator.rs +131 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/ranluxuniformrng.rs +180 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/rngtraits.rs +152 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/seedgenerator.rs +58 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/mod.rs +555 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/mt.rs +79 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/jaeckel_data_0.rs +16 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/jaeckel_offsets.rs +7 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d5_data_0.rs +1618 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d5_offsets.rs +130 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d6_data_0.rs +11961 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d6_data_1.rs +10213 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d6_offsets.rs +1331 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d7_data_0.rs +1524 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/joe_kuo_d7_offsets.rs +124 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo2_data_0.rs +3461 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo2_offsets.rs +252 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo3_data_0.rs +4101 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo3_offsets.rs +292 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo_data_0.rs +4440 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/kuo_offsets.rs +313 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/lemieux_data_0.rs +229 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/lemieux_offsets.rs +28 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/mod.rs +53 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/primitive_polynomials.rs +1468 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/sobol_levitan_data_0.rs +20 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/sobol/tables/sobol_levitan_offsets.rs +8 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/xoshiro256starstaruniformrng.rs +142 -0
- itofin-0.6.1/crates/libitofin/src/math/randomnumbers/zigguratgaussianrng.rs +654 -0
- itofin-0.6.1/crates/libitofin/src/math/solver1d.rs +814 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/bisection.rs +125 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/brent.rs +289 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/falseposition.rs +130 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/finitedifferencenewtonsafe.rs +154 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/halley.rs +330 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/mod.rs +17 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/newton.rs +192 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/newtonsafe.rs +194 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/ridder.rs +160 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/secant.rs +122 -0
- itofin-0.6.1/crates/libitofin/src/math/solvers1d/testkit.rs +283 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/gaussianstatistics.rs +348 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/generalstatistics.rs +353 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/histogram.rs +325 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/incrementalstatistics.rs +396 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/mod.rs +246 -0
- itofin-0.6.1/crates/libitofin/src/math/statistics/riskstatistics.rs +327 -0
- itofin-0.6.1/crates/libitofin/src/math/timegrid.rs +377 -0
- itofin-0.6.1/crates/libitofin/src/methods/lattices/lattice.rs +46 -0
- itofin-0.6.1/crates/libitofin/src/methods/lattices/mod.rs +17 -0
- itofin-0.6.1/crates/libitofin/src/methods/lattices/tree.rs +44 -0
- itofin-0.6.1/crates/libitofin/src/methods/lattices/treelattice.rs +772 -0
- itofin-0.6.1/crates/libitofin/src/methods/lattices/trinomialtree.rs +408 -0
- itofin-0.6.1/crates/libitofin/src/methods/mod.rs +7 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/mcsimulation.rs +328 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/mod.rs +23 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/montecarlomodel.rs +483 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/multipath.rs +145 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/multipathgenerator.rs +511 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/path.rs +189 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/pathgen.rs +44 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/pathgenerator.rs +333 -0
- itofin-0.6.1/crates/libitofin/src/methods/montecarlo/sample.rs +44 -0
- itofin-0.6.1/crates/libitofin/src/models/calibrationhelper.rs +453 -0
- itofin-0.6.1/crates/libitofin/src/models/equity/hestonmodel.rs +352 -0
- itofin-0.6.1/crates/libitofin/src/models/equity/hestonmodelhelper.rs +799 -0
- itofin-0.6.1/crates/libitofin/src/models/equity/mod.rs +10 -0
- itofin-0.6.1/crates/libitofin/src/models/mod.rs +30 -0
- itofin-0.6.1/crates/libitofin/src/models/model.rs +1087 -0
- itofin-0.6.1/crates/libitofin/src/models/parameter.rs +484 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/calibrationhelpers/caphelper.rs +679 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/calibrationhelpers/mod.rs +13 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/calibrationhelpers/swaptionhelper.rs +786 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/coxingersollross.rs +252 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/extendedcoxingersollross.rs +340 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/hullwhite.rs +1281 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/mod.rs +18 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/onefactormodel.rs +209 -0
- itofin-0.6.1/crates/libitofin/src/models/shortrate/vasicek.rs +209 -0
- itofin-0.6.1/crates/libitofin/src/option.rs +46 -0
- itofin-0.6.1/crates/libitofin/src/patterns/lazyobject.rs +557 -0
- itofin-0.6.1/crates/libitofin/src/patterns/mod.rs +5 -0
- itofin-0.6.1/crates/libitofin/src/patterns/observable.rs +616 -0
- itofin-0.6.1/crates/libitofin/src/patterns/visitor.rs +21 -0
- itofin-0.6.1/crates/libitofin/src/payoff.rs +28 -0
- itofin-0.6.1/crates/libitofin/src/pricingengine.rs +269 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/blackcalculator.rs +651 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/blackformula.rs +904 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/bond/bondfunctions.rs +968 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/bond/discountingbondengine.rs +237 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/bond/mod.rs +12 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/capfloor/analyticcapfloorengine.rs +614 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/capfloor/blackcapfloorengine.rs +665 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/capfloor/mod.rs +12 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/mod.rs +44 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swap/discountingswapengine.rs +408 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swap/mod.rs +9 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/blackswaptionengine.rs +1678 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/discretizedswap.rs +706 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/discretizedswaption.rs +148 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/jamshidianswaptionengine.rs +523 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/mod.rs +22 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/swaption/treeswaptionengine.rs +588 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/vanilla/analytichestonengine.rs +1431 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/vanilla/mceuropeanengine.rs +521 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/vanilla/mceuropeanhestonengine.rs +740 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/vanilla/mcvanillaengine.rs +420 -0
- itofin-0.6.1/crates/libitofin/src/pricingengines/vanilla/mod.rs +1099 -0
- itofin-0.6.1/crates/libitofin/src/processes/blackscholesprocess.rs +601 -0
- itofin-0.6.1/crates/libitofin/src/processes/hestonprocess.rs +858 -0
- itofin-0.6.1/crates/libitofin/src/processes/mod.rs +19 -0
- itofin-0.6.1/crates/libitofin/src/processes/ornsteinuhlenbeckprocess.rs +214 -0
- itofin-0.6.1/crates/libitofin/src/processes/stochasticprocessarray.rs +573 -0
- itofin-0.6.1/crates/libitofin/src/quotes/compositequote.rs +230 -0
- itofin-0.6.1/crates/libitofin/src/quotes/deltavolquote.rs +196 -0
- itofin-0.6.1/crates/libitofin/src/quotes/derivedquote.rs +145 -0
- itofin-0.6.1/crates/libitofin/src/quotes/mod.rs +72 -0
- itofin-0.6.1/crates/libitofin/src/quotes/multicompositequote.rs +236 -0
- itofin-0.6.1/crates/libitofin/src/quotes/simplequote.rs +260 -0
- itofin-0.6.1/crates/libitofin/src/settings.rs +515 -0
- itofin-0.6.1/crates/libitofin/src/shared.rs +58 -0
- itofin-0.6.1/crates/libitofin/src/stochasticprocess.rs +545 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/bootstraphelper.rs +630 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/bootstraptraits.rs +349 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/interpolatedcurve.rs +220 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/iterativebootstrap.rs +420 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/mod.rs +600 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/blackconstantvol.rs +281 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/blackvariancecurve.rs +437 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/blackvariancesurface.rs +465 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/localconstantvol.rs +222 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/localvolcurve.rs +223 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/localvolsurface.rs +521 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/localvoltermstructure.rs +69 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/mod.rs +521 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/optionlet/constantoptionletvol.rs +353 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/optionlet/mod.rs +117 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/swaption/constantswaptionvol.rs +408 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/swaption/mod.rs +423 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/volatility/volatilitytype.rs +14 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/bondhelpers.rs +594 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/discountcurve.rs +334 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/flatforward.rs +447 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/forwardcurve.rs +456 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/forwardspreadedtermstructure.rs +227 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/forwardstructure.rs +188 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/impliedtermstructure.rs +258 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/mod.rs +52 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/piecewiseyieldcurve.rs +507 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/ratehelpers.rs +2190 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/zerocurve.rs +332 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/zerospreadedtermstructure.rs +309 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yields/zeroyieldstructure.rs +184 -0
- itofin-0.6.1/crates/libitofin/src/termstructures/yieldtermstructure.rs +361 -0
- itofin-0.6.1/crates/libitofin/src/test_support.rs +39 -0
- itofin-0.6.1/crates/libitofin/src/time/asx.rs +248 -0
- itofin-0.6.1/crates/libitofin/src/time/businessdayconvention.rs +49 -0
- itofin-0.6.1/crates/libitofin/src/time/calendar.rs +706 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/argentina.rs +113 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/australia.rs +154 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/austria.rs +177 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/bespokecalendar.rs +103 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/botswana.rs +94 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/brazil.rs +163 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/canada.rs +148 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/chile.rs +171 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/china.rs +479 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/croatia.rs +116 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/czechrepublic.rs +116 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/denmark.rs +96 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/finland.rs +93 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/france.rs +157 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/germany.rs +272 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/hongkong.rs +560 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/hungary.rs +94 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/iceland.rs +105 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/india.rs +655 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/indonesia.rs +381 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/islamicholidays.rs +78 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/israel.rs +683 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/italy.rs +163 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/japan.rs +184 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/jointcalendar.rs +193 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/malta.rs +130 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/mexico.rs +110 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/mod.rs +121 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/montenegro.rs +104 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/newzealand.rs +209 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/northmacedonia.rs +147 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/norway.rs +91 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/nullcalendar.rs +55 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/poland.rs +147 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/romania.rs +151 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/russia.rs +278 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/saudiarabia.rs +223 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/serbia.rs +108 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/singapore.rs +339 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/slovakia.rs +122 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/slovenia.rs +113 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/southafrica.rs +104 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/southkorea.rs +391 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/sweden.rs +98 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/switzerland.rs +89 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/taiwan.rs +634 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/target.rs +91 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/thailand.rs +438 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/turkey.rs +388 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/ukraine.rs +103 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/unitedkingdom.rs +169 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/unitedstates.rs +526 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/uzbekistan.rs +136 -0
- itofin-0.6.1/crates/libitofin/src/time/calendars/weekendsonly.rs +54 -0
- itofin-0.6.1/crates/libitofin/src/time/date.rs +808 -0
- itofin-0.6.1/crates/libitofin/src/time/dategenerationrule.rs +86 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounter.rs +144 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actual360.rs +90 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actual364.rs +57 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actual36525.rs +119 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actual365fixed.rs +240 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actual366.rs +115 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/actualactual.rs +919 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/business252.rs +136 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/mod.rs +23 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/one.rs +81 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/simpledaycounter.rs +104 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/thirty360.rs +333 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/thirty365.rs +94 -0
- itofin-0.6.1/crates/libitofin/src/time/daycounters/yearfractiontodate.rs +240 -0
- itofin-0.6.1/crates/libitofin/src/time/ecb.rs +403 -0
- itofin-0.6.1/crates/libitofin/src/time/frequency.rs +96 -0
- itofin-0.6.1/crates/libitofin/src/time/imm.rs +208 -0
- itofin-0.6.1/crates/libitofin/src/time/mod.rs +26 -0
- itofin-0.6.1/crates/libitofin/src/time/period.rs +688 -0
- itofin-0.6.1/crates/libitofin/src/time/schedule.rs +2323 -0
- itofin-0.6.1/crates/libitofin/src/time/timeunit.rs +47 -0
- itofin-0.6.1/crates/libitofin/src/time/weekday.rs +106 -0
- itofin-0.6.1/crates/libitofin/src/types.rs +75 -0
- itofin-0.6.1/crates/libitofin/src/utilities/clone.rs +99 -0
- itofin-0.6.1/crates/libitofin/src/utilities/dataformatters.rs +79 -0
- itofin-0.6.1/crates/libitofin/src/utilities/mod.rs +6 -0
- itofin-0.6.1/crates/libitofin/src/utilities/null.rs +62 -0
- itofin-0.6.1/crates/libitofin/src/utilities/steppingiterator.rs +71 -0
- itofin-0.6.1/crates/libitofin/tests/external_coupon.rs +139 -0
- itofin-0.6.1/pyproject.toml +32 -0
itofin-0.6.1/Cargo.lock
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "autocfg"
|
|
7
|
+
version = "1.5.1"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|
10
|
+
|
|
11
|
+
[[package]]
|
|
12
|
+
name = "heck"
|
|
13
|
+
version = "0.5.0"
|
|
14
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
15
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
16
|
+
|
|
17
|
+
[[package]]
|
|
18
|
+
name = "itofin-py"
|
|
19
|
+
version = "0.6.1"
|
|
20
|
+
dependencies = [
|
|
21
|
+
"libitofin",
|
|
22
|
+
"pyo3",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
[[package]]
|
|
26
|
+
name = "libc"
|
|
27
|
+
version = "0.2.189"
|
|
28
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
29
|
+
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
|
|
30
|
+
|
|
31
|
+
[[package]]
|
|
32
|
+
name = "libitofin"
|
|
33
|
+
version = "0.6.1"
|
|
34
|
+
dependencies = [
|
|
35
|
+
"num-complex",
|
|
36
|
+
"thiserror",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[[package]]
|
|
40
|
+
name = "num-complex"
|
|
41
|
+
version = "0.4.6"
|
|
42
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
43
|
+
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
|
44
|
+
dependencies = [
|
|
45
|
+
"num-traits",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
[[package]]
|
|
49
|
+
name = "num-traits"
|
|
50
|
+
version = "0.2.19"
|
|
51
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
52
|
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
|
53
|
+
dependencies = [
|
|
54
|
+
"autocfg",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
[[package]]
|
|
58
|
+
name = "once_cell"
|
|
59
|
+
version = "1.21.4"
|
|
60
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
61
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
62
|
+
|
|
63
|
+
[[package]]
|
|
64
|
+
name = "portable-atomic"
|
|
65
|
+
version = "1.14.0"
|
|
66
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
67
|
+
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
|
|
68
|
+
|
|
69
|
+
[[package]]
|
|
70
|
+
name = "proc-macro2"
|
|
71
|
+
version = "1.0.106"
|
|
72
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
73
|
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
74
|
+
dependencies = [
|
|
75
|
+
"unicode-ident",
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
[[package]]
|
|
79
|
+
name = "pyo3"
|
|
80
|
+
version = "0.29.0"
|
|
81
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
82
|
+
checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
|
|
83
|
+
dependencies = [
|
|
84
|
+
"libc",
|
|
85
|
+
"once_cell",
|
|
86
|
+
"portable-atomic",
|
|
87
|
+
"pyo3-build-config",
|
|
88
|
+
"pyo3-ffi",
|
|
89
|
+
"pyo3-macros",
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
[[package]]
|
|
93
|
+
name = "pyo3-build-config"
|
|
94
|
+
version = "0.29.0"
|
|
95
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
96
|
+
checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
|
|
97
|
+
dependencies = [
|
|
98
|
+
"target-lexicon",
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
[[package]]
|
|
102
|
+
name = "pyo3-ffi"
|
|
103
|
+
version = "0.29.0"
|
|
104
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
105
|
+
checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
|
|
106
|
+
dependencies = [
|
|
107
|
+
"libc",
|
|
108
|
+
"pyo3-build-config",
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
[[package]]
|
|
112
|
+
name = "pyo3-macros"
|
|
113
|
+
version = "0.29.0"
|
|
114
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
115
|
+
checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
|
|
116
|
+
dependencies = [
|
|
117
|
+
"proc-macro2",
|
|
118
|
+
"pyo3-macros-backend",
|
|
119
|
+
"quote",
|
|
120
|
+
"syn",
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
[[package]]
|
|
124
|
+
name = "pyo3-macros-backend"
|
|
125
|
+
version = "0.29.0"
|
|
126
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
127
|
+
checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
|
|
128
|
+
dependencies = [
|
|
129
|
+
"heck",
|
|
130
|
+
"proc-macro2",
|
|
131
|
+
"quote",
|
|
132
|
+
"syn",
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
[[package]]
|
|
136
|
+
name = "quote"
|
|
137
|
+
version = "1.0.46"
|
|
138
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
139
|
+
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
|
140
|
+
dependencies = [
|
|
141
|
+
"proc-macro2",
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
[[package]]
|
|
145
|
+
name = "syn"
|
|
146
|
+
version = "2.0.118"
|
|
147
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
148
|
+
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
|
|
149
|
+
dependencies = [
|
|
150
|
+
"proc-macro2",
|
|
151
|
+
"quote",
|
|
152
|
+
"unicode-ident",
|
|
153
|
+
]
|
|
154
|
+
|
|
155
|
+
[[package]]
|
|
156
|
+
name = "target-lexicon"
|
|
157
|
+
version = "0.13.5"
|
|
158
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
159
|
+
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
160
|
+
|
|
161
|
+
[[package]]
|
|
162
|
+
name = "thiserror"
|
|
163
|
+
version = "2.0.18"
|
|
164
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
165
|
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
|
166
|
+
dependencies = [
|
|
167
|
+
"thiserror-impl",
|
|
168
|
+
]
|
|
169
|
+
|
|
170
|
+
[[package]]
|
|
171
|
+
name = "thiserror-impl"
|
|
172
|
+
version = "2.0.18"
|
|
173
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
174
|
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
|
175
|
+
dependencies = [
|
|
176
|
+
"proc-macro2",
|
|
177
|
+
"quote",
|
|
178
|
+
"syn",
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
[[package]]
|
|
182
|
+
name = "unicode-ident"
|
|
183
|
+
version = "1.0.24"
|
|
184
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
185
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
itofin-0.6.1/Cargo.toml
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[workspace]
|
|
2
|
+
resolver = "3"
|
|
3
|
+
members = ["crates/*"]
|
|
4
|
+
# `crates/worktrees` is a tooling-created directory for git worktrees and
|
|
5
|
+
# `crates/graphify-out` is where a buggy graphify watcher drops its rebuild
|
|
6
|
+
# (the scan root is `crates/`, so `<root>/graphify-out` lands inside the
|
|
7
|
+
# member glob) - neither is a crate; exclude both so `crates/*` does not try
|
|
8
|
+
# to load them as members and break every cargo command.
|
|
9
|
+
exclude = ["crates/worktrees", "crates/graphify-out"]
|
|
10
|
+
|
|
11
|
+
[workspace.package]
|
|
12
|
+
version = "0.6.1"
|
|
13
|
+
edition = "2024"
|
itofin-0.6.1/PKG-INFO
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: itofin
|
|
3
|
+
Version: 0.6.1
|
|
4
|
+
Classifier: Programming Language :: Rust
|
|
5
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
7
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
8
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Summary: Python bindings for libitofin: a Rust port of QuantLib for pricing, risk, and calibration.
|
|
13
|
+
Author-email: benbenbang <bn@bitbrew.dev>
|
|
14
|
+
License-Expression: BSD-3-Clause
|
|
15
|
+
Requires-Python: >=3.13
|
|
16
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
17
|
+
Project-URL: Homepage, https://github.com/benbenbang/libitofin
|
|
18
|
+
Project-URL: Issues, https://github.com/benbenbang/libitofin/issues
|
|
19
|
+
Project-URL: Repository, https://github.com/benbenbang/libitofin
|
|
20
|
+
|
|
21
|
+
# itofin
|
|
22
|
+
|
|
23
|
+
Idiomatic Python bindings over the [`libitofin`](https://github.com/benbenbang/libitofin) Rust core, a ground-up port of [QuantLib](https://github.com/lballabio/QuantLib) for pricing, risk, and calibration. The heavy numerics run in Rust; Python drives them. The pricing snippets below reproduce the cached Rust test oracles exactly; the abbreviated calibration snippets converge to the same targets within the tests' calibration tolerance (the full matrices live in `tests/`).
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install itofin
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Requires Python >= 3.13.
|
|
32
|
+
|
|
33
|
+
## Price a European option and its greeks
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import itofin
|
|
37
|
+
|
|
38
|
+
s = itofin.Settings()
|
|
39
|
+
s.set_evaluation_date(itofin.Date(15, 6, 2026))
|
|
40
|
+
dc = itofin.DayCounter.actual360()
|
|
41
|
+
|
|
42
|
+
process = itofin.BlackScholesProcess(60.0, 0.08, 0.0, 0.30, itofin.Date(15, 6, 2026), dc)
|
|
43
|
+
option = itofin.VanillaOption(itofin.OptionType.Call, 65.0, itofin.Date(15, 6, 2026) + 90, s)
|
|
44
|
+
option.set_engine(process)
|
|
45
|
+
|
|
46
|
+
print(f"NPV {option.npv():.10f}")
|
|
47
|
+
print(f"delta {option.delta():.10f}")
|
|
48
|
+
print(f"vega {option.vega():.10f}")
|
|
49
|
+
print(f"rho {option.rho():.10f}")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
NPV 2.1333684449
|
|
54
|
+
delta 0.3724827980
|
|
55
|
+
vega 11.3515440535
|
|
56
|
+
rho 5.0538998582
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Price under Heston and calibrate to a flat-vol surface
|
|
60
|
+
|
|
61
|
+
Semi-analytic Heston pricing:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
import itofin
|
|
65
|
+
|
|
66
|
+
s = itofin.Settings()
|
|
67
|
+
s.set_evaluation_date(itofin.Date(27, 12, 2004))
|
|
68
|
+
dc = itofin.DayCounter.actual_actual_isda()
|
|
69
|
+
|
|
70
|
+
# HestonProcess(risk_free, dividend, spot, v0, kappa, theta, sigma, rho, reference_date, day_counter)
|
|
71
|
+
process = itofin.HestonProcess(
|
|
72
|
+
0.0225, 0.02, 1.0, 0.1, 3.16, 0.09, 0.4, -0.2, itofin.Date(27, 12, 2004), dc
|
|
73
|
+
)
|
|
74
|
+
model = itofin.HestonModel(process)
|
|
75
|
+
option = itofin.VanillaOption(itofin.OptionType.Call, 1.05, itofin.Date(28, 3, 2005), s)
|
|
76
|
+
option.set_heston_engine(model, 64)
|
|
77
|
+
|
|
78
|
+
print(f"Heston NPV {option.npv():.10f}")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Heston NPV 0.0404774515
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Calibrating the model to a flat 10% vol surface drives the vol-of-vol `sigma` toward zero and both `v0` and `theta` toward the flat variance (0.10 squared = 0.01). The snippet below fits a 3-maturity by 3-strike grid; the full 21-helper matrix and its tighter tolerances live in `tests/test_heston_calibration.py`.
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
import math
|
|
89
|
+
import itofin
|
|
90
|
+
|
|
91
|
+
s = itofin.Settings()
|
|
92
|
+
s.set_evaluation_date(itofin.Date(15, 1, 2026))
|
|
93
|
+
dc = itofin.DayCounter.actual360()
|
|
94
|
+
ref = itofin.Date(15, 1, 2026)
|
|
95
|
+
risk_free = itofin.FlatForward(ref, 0.04, dc)
|
|
96
|
+
dividend = itofin.FlatForward(ref, 0.50, dc)
|
|
97
|
+
VOL = 0.10
|
|
98
|
+
|
|
99
|
+
helpers = []
|
|
100
|
+
for n in (1, 2, 3):
|
|
101
|
+
tau = float(n)
|
|
102
|
+
forward = dividend.discount(tau) / risk_free.discount(tau) # spot = 1.0
|
|
103
|
+
for moneyness in (-1.0, 0.0, 1.0):
|
|
104
|
+
strike = forward * math.exp(-moneyness * VOL * math.sqrt(tau))
|
|
105
|
+
helpers.append(itofin.HestonModelHelper(
|
|
106
|
+
itofin.Period(n, "Years"),
|
|
107
|
+
itofin.Calendar.null_calendar(),
|
|
108
|
+
1.0, # spot
|
|
109
|
+
strike,
|
|
110
|
+
VOL, # 10% flat vol
|
|
111
|
+
0.04, # risk-free
|
|
112
|
+
0.50, # dividend yield
|
|
113
|
+
itofin.CalibrationErrorType.RelativePriceError,
|
|
114
|
+
ref,
|
|
115
|
+
dc,
|
|
116
|
+
s,
|
|
117
|
+
))
|
|
118
|
+
|
|
119
|
+
process = itofin.HestonProcess(0.04, 0.50, 1.0, 0.01, 0.2, 0.02, 0.5, -0.75, ref, dc)
|
|
120
|
+
model = itofin.HestonModel(process)
|
|
121
|
+
method = itofin.LevenbergMarquardt(1e-8, 1e-8, 1e-8, False)
|
|
122
|
+
end_criteria = itofin.EndCriteria(400, 40, 1e-8, 1e-8, 1e-8)
|
|
123
|
+
model.calibrate(helpers, method, end_criteria, 96)
|
|
124
|
+
|
|
125
|
+
print(f"sigma {model.sigma():.6f}")
|
|
126
|
+
print(f"v0 {model.v0():.6f}")
|
|
127
|
+
print(f"theta {model.theta():.6f}")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
sigma 0.000216
|
|
132
|
+
v0 0.010000
|
|
133
|
+
theta 0.010000
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Calibrate Hull-White to a swaption matrix
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
import itofin
|
|
140
|
+
|
|
141
|
+
s = itofin.Settings()
|
|
142
|
+
s.set_evaluation_date(itofin.Date(15, 2, 2002))
|
|
143
|
+
curve = itofin.FlatForward(itofin.Date(19, 2, 2002), 0.04875825, itofin.DayCounter.actual365_fixed())
|
|
144
|
+
|
|
145
|
+
model = itofin.HullWhite(curve, 0.1, 0.01)
|
|
146
|
+
index = itofin.Euribor.six_months(curve, s)
|
|
147
|
+
|
|
148
|
+
# (option tenor, swap tenor, Black vol); the full co-terminal matrix is in the tests.
|
|
149
|
+
swaptions = [(1, 5, 0.1148), (2, 4, 0.1108), (3, 3, 0.1070), (4, 2, 0.1021), (5, 1, 0.1000)]
|
|
150
|
+
helpers = [
|
|
151
|
+
itofin.SwaptionHelper(
|
|
152
|
+
itofin.Period(maturity, "Years"),
|
|
153
|
+
itofin.Period(length, "Years"),
|
|
154
|
+
vol,
|
|
155
|
+
index,
|
|
156
|
+
itofin.Period(1, "Years"),
|
|
157
|
+
itofin.DayCounter.thirty360_bond_basis(),
|
|
158
|
+
itofin.DayCounter.actual360(),
|
|
159
|
+
curve,
|
|
160
|
+
itofin.CalibrationErrorType.RelativePriceError,
|
|
161
|
+
1.0,
|
|
162
|
+
)
|
|
163
|
+
for maturity, length, vol in swaptions
|
|
164
|
+
]
|
|
165
|
+
|
|
166
|
+
method = itofin.LevenbergMarquardt(1e-8, 1e-8, 1e-8, False)
|
|
167
|
+
end_criteria = itofin.EndCriteria(10000, 100, 1e-6, 1e-8, 1e-8)
|
|
168
|
+
model.calibrate(helpers, method, end_criteria, False) # fix_reversion=False, fit a and sigma
|
|
169
|
+
|
|
170
|
+
print(f"a {model.a():.7f}")
|
|
171
|
+
print(f"sigma {model.sigma():.7f}")
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
a 0.0464113
|
|
176
|
+
sigma 0.0057992
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Price a European swaption with the Jamshidian engine
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
import itofin
|
|
183
|
+
|
|
184
|
+
s = itofin.Settings()
|
|
185
|
+
s.set_evaluation_date(itofin.Date(15, 1, 2026))
|
|
186
|
+
curve = itofin.FlatForward(itofin.Date(15, 1, 2026), 0.03, itofin.DayCounter.actual365_fixed())
|
|
187
|
+
|
|
188
|
+
fixed = itofin.Schedule(
|
|
189
|
+
itofin.Date(15, 1, 2028), itofin.Date(15, 1, 2033),
|
|
190
|
+
itofin.Frequency.Annual, itofin.Calendar.target(),
|
|
191
|
+
itofin.BusinessDayConvention.Unadjusted,
|
|
192
|
+
)
|
|
193
|
+
floating = itofin.Schedule(
|
|
194
|
+
itofin.Date(15, 1, 2028), itofin.Date(15, 1, 2033),
|
|
195
|
+
itofin.Frequency.Semiannual, itofin.Calendar.target(),
|
|
196
|
+
itofin.BusinessDayConvention.Unadjusted,
|
|
197
|
+
)
|
|
198
|
+
index = itofin.Euribor.six_months(curve, s)
|
|
199
|
+
|
|
200
|
+
swap = itofin.VanillaSwap(
|
|
201
|
+
itofin.SwapType.Payer, 100.0,
|
|
202
|
+
fixed, 0.03, itofin.DayCounter.thirty360_bond_basis(),
|
|
203
|
+
floating, index, 0.0, itofin.DayCounter.actual360(), s,
|
|
204
|
+
)
|
|
205
|
+
swaption = itofin.Swaption(
|
|
206
|
+
swap, itofin.EuropeanExercise(itofin.Date(15, 1, 2027)),
|
|
207
|
+
itofin.SettlementType.Physical, itofin.SettlementMethod.PhysicalOTC, s,
|
|
208
|
+
)
|
|
209
|
+
swaption.set_jamshidian_engine(itofin.HullWhite(curve, 0.05, 0.01))
|
|
210
|
+
|
|
211
|
+
print(f"payer swaption NPV {swaption.npv():.10f}")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
payer swaption NPV 1.5666103956
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## License
|
|
219
|
+
|
|
220
|
+
BSD-3-Clause, matching the `libitofin` core. See the [repository](https://github.com/benbenbang/libitofin) for the layer status table, the divergences-from-QuantLib catalogue, and the Rust test oracles behind the numbers above.
|
|
221
|
+
|
itofin-0.6.1/README.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# itofin
|
|
2
|
+
|
|
3
|
+
Idiomatic Python bindings over the [`libitofin`](https://github.com/benbenbang/libitofin) Rust core, a ground-up port of [QuantLib](https://github.com/lballabio/QuantLib) for pricing, risk, and calibration. The heavy numerics run in Rust; Python drives them. The pricing snippets below reproduce the cached Rust test oracles exactly; the abbreviated calibration snippets converge to the same targets within the tests' calibration tolerance (the full matrices live in `tests/`).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install itofin
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires Python >= 3.13.
|
|
12
|
+
|
|
13
|
+
## Price a European option and its greeks
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
import itofin
|
|
17
|
+
|
|
18
|
+
s = itofin.Settings()
|
|
19
|
+
s.set_evaluation_date(itofin.Date(15, 6, 2026))
|
|
20
|
+
dc = itofin.DayCounter.actual360()
|
|
21
|
+
|
|
22
|
+
process = itofin.BlackScholesProcess(60.0, 0.08, 0.0, 0.30, itofin.Date(15, 6, 2026), dc)
|
|
23
|
+
option = itofin.VanillaOption(itofin.OptionType.Call, 65.0, itofin.Date(15, 6, 2026) + 90, s)
|
|
24
|
+
option.set_engine(process)
|
|
25
|
+
|
|
26
|
+
print(f"NPV {option.npv():.10f}")
|
|
27
|
+
print(f"delta {option.delta():.10f}")
|
|
28
|
+
print(f"vega {option.vega():.10f}")
|
|
29
|
+
print(f"rho {option.rho():.10f}")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
NPV 2.1333684449
|
|
34
|
+
delta 0.3724827980
|
|
35
|
+
vega 11.3515440535
|
|
36
|
+
rho 5.0538998582
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Price under Heston and calibrate to a flat-vol surface
|
|
40
|
+
|
|
41
|
+
Semi-analytic Heston pricing:
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
import itofin
|
|
45
|
+
|
|
46
|
+
s = itofin.Settings()
|
|
47
|
+
s.set_evaluation_date(itofin.Date(27, 12, 2004))
|
|
48
|
+
dc = itofin.DayCounter.actual_actual_isda()
|
|
49
|
+
|
|
50
|
+
# HestonProcess(risk_free, dividend, spot, v0, kappa, theta, sigma, rho, reference_date, day_counter)
|
|
51
|
+
process = itofin.HestonProcess(
|
|
52
|
+
0.0225, 0.02, 1.0, 0.1, 3.16, 0.09, 0.4, -0.2, itofin.Date(27, 12, 2004), dc
|
|
53
|
+
)
|
|
54
|
+
model = itofin.HestonModel(process)
|
|
55
|
+
option = itofin.VanillaOption(itofin.OptionType.Call, 1.05, itofin.Date(28, 3, 2005), s)
|
|
56
|
+
option.set_heston_engine(model, 64)
|
|
57
|
+
|
|
58
|
+
print(f"Heston NPV {option.npv():.10f}")
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Heston NPV 0.0404774515
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Calibrating the model to a flat 10% vol surface drives the vol-of-vol `sigma` toward zero and both `v0` and `theta` toward the flat variance (0.10 squared = 0.01). The snippet below fits a 3-maturity by 3-strike grid; the full 21-helper matrix and its tighter tolerances live in `tests/test_heston_calibration.py`.
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
import math
|
|
69
|
+
import itofin
|
|
70
|
+
|
|
71
|
+
s = itofin.Settings()
|
|
72
|
+
s.set_evaluation_date(itofin.Date(15, 1, 2026))
|
|
73
|
+
dc = itofin.DayCounter.actual360()
|
|
74
|
+
ref = itofin.Date(15, 1, 2026)
|
|
75
|
+
risk_free = itofin.FlatForward(ref, 0.04, dc)
|
|
76
|
+
dividend = itofin.FlatForward(ref, 0.50, dc)
|
|
77
|
+
VOL = 0.10
|
|
78
|
+
|
|
79
|
+
helpers = []
|
|
80
|
+
for n in (1, 2, 3):
|
|
81
|
+
tau = float(n)
|
|
82
|
+
forward = dividend.discount(tau) / risk_free.discount(tau) # spot = 1.0
|
|
83
|
+
for moneyness in (-1.0, 0.0, 1.0):
|
|
84
|
+
strike = forward * math.exp(-moneyness * VOL * math.sqrt(tau))
|
|
85
|
+
helpers.append(itofin.HestonModelHelper(
|
|
86
|
+
itofin.Period(n, "Years"),
|
|
87
|
+
itofin.Calendar.null_calendar(),
|
|
88
|
+
1.0, # spot
|
|
89
|
+
strike,
|
|
90
|
+
VOL, # 10% flat vol
|
|
91
|
+
0.04, # risk-free
|
|
92
|
+
0.50, # dividend yield
|
|
93
|
+
itofin.CalibrationErrorType.RelativePriceError,
|
|
94
|
+
ref,
|
|
95
|
+
dc,
|
|
96
|
+
s,
|
|
97
|
+
))
|
|
98
|
+
|
|
99
|
+
process = itofin.HestonProcess(0.04, 0.50, 1.0, 0.01, 0.2, 0.02, 0.5, -0.75, ref, dc)
|
|
100
|
+
model = itofin.HestonModel(process)
|
|
101
|
+
method = itofin.LevenbergMarquardt(1e-8, 1e-8, 1e-8, False)
|
|
102
|
+
end_criteria = itofin.EndCriteria(400, 40, 1e-8, 1e-8, 1e-8)
|
|
103
|
+
model.calibrate(helpers, method, end_criteria, 96)
|
|
104
|
+
|
|
105
|
+
print(f"sigma {model.sigma():.6f}")
|
|
106
|
+
print(f"v0 {model.v0():.6f}")
|
|
107
|
+
print(f"theta {model.theta():.6f}")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
sigma 0.000216
|
|
112
|
+
v0 0.010000
|
|
113
|
+
theta 0.010000
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Calibrate Hull-White to a swaption matrix
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
import itofin
|
|
120
|
+
|
|
121
|
+
s = itofin.Settings()
|
|
122
|
+
s.set_evaluation_date(itofin.Date(15, 2, 2002))
|
|
123
|
+
curve = itofin.FlatForward(itofin.Date(19, 2, 2002), 0.04875825, itofin.DayCounter.actual365_fixed())
|
|
124
|
+
|
|
125
|
+
model = itofin.HullWhite(curve, 0.1, 0.01)
|
|
126
|
+
index = itofin.Euribor.six_months(curve, s)
|
|
127
|
+
|
|
128
|
+
# (option tenor, swap tenor, Black vol); the full co-terminal matrix is in the tests.
|
|
129
|
+
swaptions = [(1, 5, 0.1148), (2, 4, 0.1108), (3, 3, 0.1070), (4, 2, 0.1021), (5, 1, 0.1000)]
|
|
130
|
+
helpers = [
|
|
131
|
+
itofin.SwaptionHelper(
|
|
132
|
+
itofin.Period(maturity, "Years"),
|
|
133
|
+
itofin.Period(length, "Years"),
|
|
134
|
+
vol,
|
|
135
|
+
index,
|
|
136
|
+
itofin.Period(1, "Years"),
|
|
137
|
+
itofin.DayCounter.thirty360_bond_basis(),
|
|
138
|
+
itofin.DayCounter.actual360(),
|
|
139
|
+
curve,
|
|
140
|
+
itofin.CalibrationErrorType.RelativePriceError,
|
|
141
|
+
1.0,
|
|
142
|
+
)
|
|
143
|
+
for maturity, length, vol in swaptions
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
method = itofin.LevenbergMarquardt(1e-8, 1e-8, 1e-8, False)
|
|
147
|
+
end_criteria = itofin.EndCriteria(10000, 100, 1e-6, 1e-8, 1e-8)
|
|
148
|
+
model.calibrate(helpers, method, end_criteria, False) # fix_reversion=False, fit a and sigma
|
|
149
|
+
|
|
150
|
+
print(f"a {model.a():.7f}")
|
|
151
|
+
print(f"sigma {model.sigma():.7f}")
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
a 0.0464113
|
|
156
|
+
sigma 0.0057992
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Price a European swaption with the Jamshidian engine
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
import itofin
|
|
163
|
+
|
|
164
|
+
s = itofin.Settings()
|
|
165
|
+
s.set_evaluation_date(itofin.Date(15, 1, 2026))
|
|
166
|
+
curve = itofin.FlatForward(itofin.Date(15, 1, 2026), 0.03, itofin.DayCounter.actual365_fixed())
|
|
167
|
+
|
|
168
|
+
fixed = itofin.Schedule(
|
|
169
|
+
itofin.Date(15, 1, 2028), itofin.Date(15, 1, 2033),
|
|
170
|
+
itofin.Frequency.Annual, itofin.Calendar.target(),
|
|
171
|
+
itofin.BusinessDayConvention.Unadjusted,
|
|
172
|
+
)
|
|
173
|
+
floating = itofin.Schedule(
|
|
174
|
+
itofin.Date(15, 1, 2028), itofin.Date(15, 1, 2033),
|
|
175
|
+
itofin.Frequency.Semiannual, itofin.Calendar.target(),
|
|
176
|
+
itofin.BusinessDayConvention.Unadjusted,
|
|
177
|
+
)
|
|
178
|
+
index = itofin.Euribor.six_months(curve, s)
|
|
179
|
+
|
|
180
|
+
swap = itofin.VanillaSwap(
|
|
181
|
+
itofin.SwapType.Payer, 100.0,
|
|
182
|
+
fixed, 0.03, itofin.DayCounter.thirty360_bond_basis(),
|
|
183
|
+
floating, index, 0.0, itofin.DayCounter.actual360(), s,
|
|
184
|
+
)
|
|
185
|
+
swaption = itofin.Swaption(
|
|
186
|
+
swap, itofin.EuropeanExercise(itofin.Date(15, 1, 2027)),
|
|
187
|
+
itofin.SettlementType.Physical, itofin.SettlementMethod.PhysicalOTC, s,
|
|
188
|
+
)
|
|
189
|
+
swaption.set_jamshidian_engine(itofin.HullWhite(curve, 0.05, 0.01))
|
|
190
|
+
|
|
191
|
+
print(f"payer swaption NPV {swaption.npv():.10f}")
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
payer swaption NPV 1.5666103956
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## License
|
|
199
|
+
|
|
200
|
+
BSD-3-Clause, matching the `libitofin` core. See the [repository](https://github.com/benbenbang/libitofin) for the layer status table, the divergences-from-QuantLib catalogue, and the Rust test oracles behind the numbers above.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "itofin-py"
|
|
3
|
+
version.workspace = true
|
|
4
|
+
edition.workspace = true
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
|
|
7
|
+
[lib]
|
|
8
|
+
name = "itofin"
|
|
9
|
+
crate-type = ["cdylib"]
|
|
10
|
+
|
|
11
|
+
[features]
|
|
12
|
+
extension-module = ["pyo3/extension-module"]
|
|
13
|
+
|
|
14
|
+
[dependencies]
|
|
15
|
+
libitofin = { path = "../libitofin" }
|
|
16
|
+
pyo3 = { version = "0.29", features = ["abi3-py313"] }
|