All notable changes to this project are documented in this file. The format is based on Keep a Changelog, and the project follows Semantic Versioning.
- Documentation pages other than the homepage are titled
<page title> - goal-based-allocationrather than ending with the full site title, which search results cut off. - The former
user-guide/pages, which redirect to their chapters, carry anoindex, followrobots tag and are left out of the sitemap with the noindex search page and the general index. - Documentation pages built for the
stableversion name theirlatestaddress as canonical, so search engines no longer see each page twice. Numbered versions keep their own canonical address. No signature or computed value changes.
Documentation release: no package code changed.
- Added the goal-based allocation handbook to the documentation: eleven methodology chapters in
the layout of the qis and optimalportfolios handbooks, each with a convention card, concise
proofs, Insight and Pitfall callouts, and worked examples executed by
tests/test_documentation_examples.py, plus a single bibliography, a notation page, a documentation standard and an API reference generated from the docstrings. The formeruser-guide/pages redirect to their chapters.
- The README quickstart no longer describes the
target_returnoffind_ellas a target return: it fixes the present value of the policy's target, not the expected terminal wealth. - Corrected README references: the buy-and-hold moments are Proposition A.1 of the manuscript, and Lipton's "Assets with jumps" appeared in Risk in 2002, volume 15.
-
Added explicit stack dependency and optional-import boundary checks, including isolated maintainer adapters, plus a fresh Python 3.10 lowest-direct dependency CI lane.
-
Added tag-driven PyPI Trusted Publishing with release-identity and distribution validation; creating a GitHub Release remains optional.
-
Raised the minimum supported NumPy version from 1.24 to 2.0.
-
Aligned package summaries, software citations, README navigation, and documentation landing pages with the canonical package identity and Read the Docs documentation.
-
Replaced the legacy GitHub Pages documentation build with redirects to Read the Docs.
-
Declared pytest 7.0 as the minimum test-tool version so the fresh lowest-dependency job does not select an incompatible legacy pytest release.
- Retired the contributor-facing
devextra in favor of PEP 735 dependency groups:testfor pytest andlintfor Black and Ruff. Thedocsextra remains available.
-
Raised the Matplotlib runtime floor to 3.8.4: the previously allowed 3.7 wheels fail to import with the minimum supported NumPy 2.0, while 3.8.4 wheels support its ABI.
-
Explicitly included
LICENSEin distribution license metadata.
- Separated source development runners from production and pytest code under the source-only
goal_based_allocation/run/*_local.pyconvention, usingLocalsandrun_local(local=...).
- Moved the installable package from
goal_based_allocation/tosrc/goal_based_allocation/without changing the import name or numerical code. - Renamed the repository-only research root from
paper_code/topapers/. Existing GitHub source and image URLs containingpaper_code/must use the new path. - Added an output-free installed-wheel quickstart, artifact-provenance CI, and a gated Sphinx/MyST documentation site with task guides and a checked public API catalogue.
- Adopted SPDX license metadata and raised the build-backend floor to setuptools 77; runtime dependencies are unchanged.
- Published task-oriented Sphinx documentation on GitHub Pages and added its canonical project URL to package metadata.
vanilla_option_pricermodule: Laplace-transform European vanilla option pricing under the regime-switching jump-diffusion. ExposesRiskNeutralParams,price_vanilla,implied_vol,OptionType, andRegimefrom the package top level. All strikes are priced jointly by a single Abate-Whitt inversion in maturity, reusing the degree-6 characteristic roots of the wealth-floor machinery.examples/folder with minimal, self-contained illustrations:wealth_process_simulation.py(Figure 1),terminal_wealth_distribution.py(Figure 2),investment_opportunity_set.py(Figure 4), andregime_switch_smile.py(implied-volatility smile with Carr-Madan Fourier and Monte Carlo reference pricers).tests/suite (pytest): option-pricer properties (put-call parity, Black-Scholes limit, monotonicity in strike, scalar/array consistency, input validation), Fourier and Monte Carlo cross-checks, and core-framework smoke tests.- GitHub Actions CI: runs the test suite on Python 3.10, 3.11, and 3.12.
- Repository reorganised: the core library remains in
goal_based_allocation/; the 2026 paper (LaTeX source, compiled PDF, figures, andgenerate_paper_figures.py) is now self-contained underpapers/goal_based_allocation_2026/. generate_paper_figures.pynow defaults its output directory to the paper's ownfigures/folder, independent of the working directory.- The
regime_switch_smileexample draws its parameters from the paper's equity regime process instead of a standalone base case. - README updated for the new layout, the option pricer, and the examples.
- Paper title standardised to "Dynamic Mean-Variance Portfolio Allocation under Regime-Switching Jump-Diffusions with Absorbing Barriers and Distribution Matching" across code docstrings, README, and the citation.
- Reconciled the package version, which was out of sync between
__init__.py(0.1.0) andpyproject.toml(0.1.1).
Initial packaged release of the analytical framework: Riccati ODE solver for the MV-optimal policy, Laplace-domain density / survival / overshoot computations, buy-and-hold moments via matrix exponential, and the investment opportunity-set framework.