Releases: ArturSepp/StochVolModels
Releases · ArturSepp/StochVolModels
Release list
v1.2.2
1.2.1
Changelog
Entries start at 1.2.0. For earlier releases see the git log.
[1.2.1] - 2026-07-21
Fixed
- The 1.2.0 release shipped without any of the changes to modules inside
stochvolmodels/; only
new files and renames reached the commit.import stochvolmodelstherefore failed with
ModuleNotFoundError: No module named 'qis'unless theresearchextra was installed, because
pricers/hawkes_jd_pricer.pystill importedqisfor@qis.timer. 1.2.0 is yanked on PyPI.
Everything listed under 1.2.0 below is in this release.
[1.2.0] - 2026-07-20
Added
stochvolmodels.__version__, resolved from installed package metadata.__init__.pyforstochvolmodels.examples,stochvolmodels.pricers.factor_hjmand
stochvolmodels.pricers.rough_logsv. These shipped only through setuptools namespace-package
discovery..gitattributesstoring*.pyas LF and*.pdfas binary.AGENTS.mdandCLAUDE.mdat the repository root: layout, commands, conventions and
constraints for coding agents.papers/local_path.py, resolving the output and resource directories for the reproduction code.
get_output_path()andget_resource_path()readpapers/settings.yamlwhen it exists and
otherwise fall back todocs/figuresandresourcesunder the repository root, both of which are
gitignored.papers/settings.yaml.exampleis the committed template;papers/settings.yamlis
gitignored.yamlis imported only when that file exists, so PyYAML is not a dependency.papers/logsv_model_with_quadratic_drift/paper/andpapers/sv_for_factor_hjm/paper/, each
holding the published article, its LaTeX source and a README recording which of the two the
docstring equation references follow.- NumPy-style docstrings across the package: 524 of 602 module members, up from 235. Every module
outsidepricers/rough_logsv/now carries a header. Docstrings forpricers/logsv/,
logsv_pricer.pyandpricers/factor_hjm/cite equation numbers from the published articles. - This file.
Changed
stochvolmodels.data.test_option_chainis nowstochvolmodels.data.sample_option_chains.
get_btc_test_chain_data,get_gld_test_chain_data,get_gld_test_chain_data_6m,
get_qv_options_test_chain_data,get_spy_test_chain_data,get_sqqq_test_chain_dataand
get_vix_test_chain_datakeep their names and stay exported fromstochvolmodels. There is no
compatibility shim: import them from the top-level package or from the new module path.stochvolmodels.pricers.factor_hjm.rate_coreis nowstochvolmodels.utils.rate_core. This
removes thedatatopricersimport cycle:data/option_chain.pycalls
get_default_swap_term_structureandswap_rate.rough_logsv_mc_chain_pricer_fixed_randomstakesdebug: bool = False. It printed per-slice
path diagnostics on every call.stochvolmodels/tests/bsm_mgf_pricer.pymoves tostochvolmodels/examples/run_bsm_mgf_pricer.py,
stochvolmodels/tests/qv_pricer.pytostochvolmodels/examples/run_qvar_analytics.py, and
stochvolmodels/pricers/rough_logsv/test_kernel_approx.pyto
stochvolmodels/examples/run_rough_kernel_approx.py.stochvolmodels/tests/now holds the pytest
suite andrough_logsv_perf.py.examples/{run_heston,run_heston_sv_pricer,run_hawkes_pricer,run_pricing_options_on_qvar, quick_run_lognormal_sv_pricer}.pyexecute underrun_local_testbehind
if __name__ == '__main__':. They ran their demo, includingplt.show(), on import.requires-pythonis>=3.10and the 3.9 classifier is removed. CI tests 3.10, 3.11 and 3.12.- CI installs
.[dev]instead of.[dev,research], so the import check fails if a library module
starts importingqisagain. my_papers/is nowpapers/, matchingfactorlassoandtrendfollowing, and
logsv_model_wtih_quadratic_driftis spelledlogsv_model_with_quadratic_drift.- The 23 hardcoded absolute paths across 9 modules in
papers/calllp.get_output_path()or
lp.get_resource_path(). None of them ran on another machine without editing. - The
stochvolmodels.pricers.hawkes_jd_pricermodule docstring cites Liu, Packham and Sepp (2025),
arXiv:2510.21297, the bivariate Hawkes specification the pricer implements. papers/README.mdlinks each directory to its localpaper/folder, publisher DOI and SSRN entry
where those exist.
Fixed
func_rhs_jacinpricers/logsv/affine_expansion.pyand in
pricers/factor_hjm/rate_affine_expansion.pyreturns2 M A + L. Both returned
2 M A + A0, adding the state instead of the linear matrix. Both are passed to
solve_ivp(method='BDF', jac=...)whenis_stiff_solver=True. Prices move by
about 1e-5 relative, since BDF uses the Jacobian only to drive its Newton
iteration; the gain is convergence robustness, not accuracy.simulate_vol_pathsruns again. It was decorated@njit(cache=False, fastmath=False)with abrownians: np.ndarray = Nonedefault, which numba 0.60+
cannot type, so every call raisedTypingError. The decorator is removed; the
body is vectorised across paths and loops only over time steps, andfastmath
was already off, so results are unchanged where the function previously ran.simulate_vol_pathssizes its output array fromnb_steps, not from
nb_steps_per_year. The returnedsigma_tnow hasnb_steps + 1rows, matching
grid_t. Atttm = 1.0the old sizing indexed out of bounds; below 1.0 it
returned trailing all-zero rows; above 1.0 it raised.LogSvParams.etareturns2 (kappa2 theta - kappa1) / vartheta^2 - 1, the
exponent of the generalized inverse Gaussian steady state in Eq. (3.38) of Sepp
and Rakhmonov (2024). It returnedkappa1 theta / vartheta^2 - 1, which is not
that exponent. No caller in the repository reads the property.compute_analytic_vol_momentsno longer branches onis_qvarto assign the same
value torhs[-1]twice. Behaviour is unchanged.import stochvolmodelsno longer requiresqis.pricers/hawkes_jd_pricer.pyimportedqisat
module level for one@qis.timerdecorator and is exported from__init__.py, so
pip install stochvolmodelsfollowed byimport stochvolmodelsraisedModuleNotFoundError. It
now usesstochvolmodels.utils.funcs.timer.- The
ndarrays_regressionbaseline
stochvolmodels/tests/test_rough_logsv_pricer_regression/test_rough_logsv_pricer_pricing_regression.npz
is committed. The fixture changed fromdata_regressiontondarrays_regressionwithout it, so
pytest stochvolmodels/tests/failed on every run and every Python version. [tool.pytest.ini_options] testpathspoints atstochvolmodels/tests. It pointed at atests
directory that does not exist, which raisedPytestConfigWarning.stochvolmodels.data.fetch_option_chainraisesImportErrornamingqisand
option-chain-analyticsrather than failing on a bare import of a package in no dependency group.MANIFEST.inincludes*.npzso the regression baseline reaches the sdist, and drops
stochvolmodels/templates,stochvolmodels/staticandstochvolmodels/my_papers/figures, none of
which exist.- README dependency floors match
pyproject.toml, and the project tree matches the repository.
Removed
- The superseded
data_regressionbaseline
test_rough_logsv_pricer_pricing_regression.yml. Its values are carried over unchanged into the
.npz. - Duplicate
VariableType,compute_logsv_a_mgf_grid,solve_a_ode_gridandsolve_ode_for_a
entries in thestochvolmodels/__init__.pyre-export ofaffine_expansion. Each named the same
object twice, so the export list is unchanged.
1.2.0
Changelog
Entries start at 1.2.0. For earlier releases see the git log.
[1.2.0] - 2026-07-20
Added
stochvolmodels.__version__, resolved from installed package metadata.__init__.pyforstochvolmodels.examples,stochvolmodels.pricers.factor_hjmand
stochvolmodels.pricers.rough_logsv. These shipped only through setuptools namespace-package
discovery..gitattributesstoring*.pyas LF and*.pdfas binary.AGENTS.mdandCLAUDE.mdat the repository root: layout, commands, conventions and
constraints for coding agents.papers/local_path.py, resolving the output and resource directories for the reproduction code.
get_output_path()andget_resource_path()readpapers/settings.yamlwhen it exists and
otherwise fall back todocs/figuresandresourcesunder the repository root, both of which are
gitignored.papers/settings.yaml.exampleis the committed template;papers/settings.yamlis
gitignored.yamlis imported only when that file exists, so PyYAML is not a dependency.papers/logsv_model_with_quadratic_drift/paper/andpapers/sv_for_factor_hjm/paper/, each
holding the published article, its LaTeX source and a README recording which of the two the
docstring equation references follow.- NumPy-style docstrings across the package: 524 of 602 module members, up from 235. Every module
outsidepricers/rough_logsv/now carries a header. Docstrings forpricers/logsv/,
logsv_pricer.pyandpricers/factor_hjm/cite equation numbers from the published articles. - This file.
Changed
stochvolmodels.data.test_option_chainis nowstochvolmodels.data.sample_option_chains.
get_btc_test_chain_data,get_gld_test_chain_data,get_gld_test_chain_data_6m,
get_qv_options_test_chain_data,get_spy_test_chain_data,get_sqqq_test_chain_dataand
get_vix_test_chain_datakeep their names and stay exported fromstochvolmodels. There is no
compatibility shim: import them from the top-level package or from the new module path.stochvolmodels.pricers.factor_hjm.rate_coreis nowstochvolmodels.utils.rate_core. This
removes thedatatopricersimport cycle:data/option_chain.pycalls
get_default_swap_term_structureandswap_rate.rough_logsv_mc_chain_pricer_fixed_randomstakesdebug: bool = False. It printed per-slice
path diagnostics on every call.stochvolmodels/tests/bsm_mgf_pricer.pymoves tostochvolmodels/examples/run_bsm_mgf_pricer.py,
stochvolmodels/tests/qv_pricer.pytostochvolmodels/examples/run_qvar_analytics.py, and
stochvolmodels/pricers/rough_logsv/test_kernel_approx.pyto
stochvolmodels/examples/run_rough_kernel_approx.py.stochvolmodels/tests/now holds the pytest
suite andrough_logsv_perf.py.examples/{run_heston,run_heston_sv_pricer,run_hawkes_pricer,run_pricing_options_on_qvar, quick_run_lognormal_sv_pricer}.pyexecute underrun_local_testbehind
if __name__ == '__main__':. They ran their demo, includingplt.show(), on import.requires-pythonis>=3.10and the 3.9 classifier is removed. CI tests 3.10, 3.11 and 3.12.- CI installs
.[dev]instead of.[dev,research], so the import check fails if a library module
starts importingqisagain. my_papers/is nowpapers/, matchingfactorlassoandtrendfollowing, and
logsv_model_wtih_quadratic_driftis spelledlogsv_model_with_quadratic_drift.- The 23 hardcoded absolute paths across 9 modules in
papers/calllp.get_output_path()or
lp.get_resource_path(). None of them ran on another machine without editing. - The
stochvolmodels.pricers.hawkes_jd_pricermodule docstring cites Liu, Packham and Sepp (2025),
arXiv:2510.21297, the bivariate Hawkes specification the pricer implements. papers/README.mdlinks each directory to its localpaper/folder, publisher DOI and SSRN entry
where those exist.
Fixed
func_rhs_jacinpricers/logsv/affine_expansion.pyand in
pricers/factor_hjm/rate_affine_expansion.pyreturns2 M A + L. Both returned
2 M A + A0, adding the state instead of the linear matrix. Both are passed to
solve_ivp(method='BDF', jac=...)whenis_stiff_solver=True. Prices move by
about 1e-5 relative, since BDF uses the Jacobian only to drive its Newton
iteration; the gain is convergence robustness, not accuracy.simulate_vol_pathsruns again. It was decorated@njit(cache=False, fastmath=False)with abrownians: np.ndarray = Nonedefault, which numba 0.60+
cannot type, so every call raisedTypingError. The decorator is removed; the
body is vectorised across paths and loops only over time steps, andfastmath
was already off, so results are unchanged where the function previously ran.simulate_vol_pathssizes its output array fromnb_steps, not from
nb_steps_per_year. The returnedsigma_tnow hasnb_steps + 1rows, matching
grid_t. Atttm = 1.0the old sizing indexed out of bounds; below 1.0 it
returned trailing all-zero rows; above 1.0 it raised.LogSvParams.etareturns2 (kappa2 theta - kappa1) / vartheta^2 - 1, the
exponent of the generalized inverse Gaussian steady state in Eq. (3.38) of Sepp
and Rakhmonov (2024). It returnedkappa1 theta / vartheta^2 - 1, which is not
that exponent. No caller in the repository reads the property.compute_analytic_vol_momentsno longer branches onis_qvarto assign the same
value torhs[-1]twice. Behaviour is unchanged.import stochvolmodelsno longer requiresqis.pricers/hawkes_jd_pricer.pyimportedqisat
module level for one@qis.timerdecorator and is exported from__init__.py, so
pip install stochvolmodelsfollowed byimport stochvolmodelsraisedModuleNotFoundError. It
now usesstochvolmodels.utils.funcs.timer.- The
ndarrays_regressionbaseline
stochvolmodels/tests/test_rough_logsv_pricer_regression/test_rough_logsv_pricer_pricing_regression.npz
is committed. The fixture changed fromdata_regressiontondarrays_regressionwithout it, so
pytest stochvolmodels/tests/failed on every run and every Python version. [tool.pytest.ini_options] testpathspoints atstochvolmodels/tests. It pointed at atests
directory that does not exist, which raisedPytestConfigWarning.stochvolmodels.data.fetch_option_chainraisesImportErrornamingqisand
option-chain-analyticsrather than failing on a bare import of a package in no dependency group.MANIFEST.inincludes*.npzso the regression baseline reaches the sdist, and drops
stochvolmodels/templates,stochvolmodels/staticandstochvolmodels/my_papers/figures, none of
which exist.- README dependency floors match
pyproject.toml, and the project tree matches the repository.
Removed
- The superseded
data_regressionbaseline
test_rough_logsv_pricer_pricing_regression.yml. Its values are carried over unchanged into the
.npz. - Duplicate
VariableType,compute_logsv_a_mgf_grid,solve_a_ode_gridandsolve_ode_for_a
entries in thestochvolmodels/__init__.pyre-export ofaffine_expansion. Each named the same
object twice, so the export list is unchanged.