Quantitative FIRE analysis for European markets
This repository contains the code, processed data (when allowed), and statistical analyses developed for the thesis "Retirement-oriented wealth management: the 4% rule and the FIRE (Financial Independence, Retire Early) movement. A European and Italian case study."
The goal is to assess the sustainability of withdrawal rate strategiesβespecially the 4% ruleβusing historical simulations, stochastic modelling, and risk metrics applied to European markets.
Summary of Monte Carlo simulation results (100,000 runs, 30-year horizon, block bootstrap):
| Equity Index | 3% WR | 3.5% WR | 4% WR |
|---|---|---|---|
| MSCI World | 95.8% | 89.1% | 78.3% |
| MSCI ACWI | 95.3% | 88.1% | 77.0% |
| MSCI Europe | 90.1% | 79.2% | 65.0% |
| MSCI EMU | 86.2% | 74.7% | 60.9% |
| Bond Type | MSCI World | MSCI Europe | Advantage |
|---|---|---|---|
| Bund | 78.3% | 65.0% | Baseline |
| BTP | 80.5% | 67.9% | +2% |
| Bund+BTP Mix | 79.9% | 66.8% | +1.5% |
Key findings:
- The 4% rule doesn't work well in Europe - success rates are 65-80% vs US ~95%
- 3-3.5% WR is more appropriate for European investors
- Global diversification matters - World/ACWI outperform Europe/EMU by 10-15%
- BTP outperforms Bund at higher WRs due to yield advantage (+2%)
- Allocation matters less than WR - 60/40 to 80/20 have similar outcomes
- Home bias is costly - European-only portfolios have significantly lower success rates
For complete results, see ANALYSIS_REGISTRY.md.
| Document | Description |
|---|---|
| src/README.md | Complete list of Jupyter notebooks with descriptions and naming conventions |
| ANALYSIS_REGISTRY.md | Summary table of simulation results (success rates, final values, depletion years) |
| ANALYSIS_REGISTRY.csv | Same data in CSV format for further analysis |
| plots/README.md | Documentation for 34 analysis plots with key insights |
fire-eu-analysis/
β
βββ data/ # Raw and processed datasets
β βββ msci/ # MSCI index data
β βββ bdi/ # Banca d'Italia (BTP yields)
β βββ bund/ # Bundesbank (Bund yields)
β βββ oat/ # French OAT yields
β βββ eurostat/ # HICP inflation data
β βββ istat/ # Italian inflation (FOI, NIC)
β βββ stoxx/ # STOXX Europe 600 data
β
βββ src/ # Jupyter notebooks
β βββ 00xx_*.ipynb # Data extraction and preprocessing
β βββ 01xx_*.ipynb # MSCI World simulations (4% WR)
β βββ 02xx_*.ipynb # MSCI ACWI simulations (4% WR)
β βββ 03xx_*.ipynb # STOXX Europe 600 simulations (4% WR)
β βββ 04xx_*.ipynb # MSCI Europe simulations (4% WR)
β βββ 05xx_*.ipynb # MSCI EMU simulations (4% WR)
β βββ 06xx_*.ipynb # MSCI World simulations (3% WR)
β βββ 07xx_*.ipynb # MSCI World simulations (3.5% WR)
β βββ 08xx_*.ipynb # MSCI ACWI simulations (3% WR)
β βββ 09xx_*.ipynb # MSCI ACWI simulations (3.5% WR)
β βββ 10xx_*.ipynb # MSCI Europe simulations (3% WR)
β βββ 11xx_*.ipynb # MSCI Europe simulations (3.5% WR)
β βββ 12xx_*.ipynb # MSCI EMU simulations (3% WR)
β βββ 13xx_*.ipynb # MSCI EMU simulations (3.5% WR)
β βββ tools/ # Utility scripts
β βββ buildtable.py # Generate ANALYSIS_REGISTRY.md/.csv
β βββ plots.py # Generate 34 analysis plots
β
βββ plots/ # 34 generated analysis plots
β βββ 01-08_*.png # General analysis (success rates, heatmaps)
β βββ 09-14_*.png # Depletion analysis (when portfolios fail)
β βββ 15-20_*.png # 4% WR specific analysis
β βββ 21-26_*.png # 3% WR specific analysis
β βββ 27-32_*.png # 3.5% WR specific analysis
β βββ 33-34_*.png # Optimal bond strategy analysis
β
βββ fire.sh # Podman container management script
βββ ANALYSIS_REGISTRY.md # Auto-generated results summary
βββ ANALYSIS_REGISTRY.csv # Results in CSV format
βββ README.md
The recommended way to start the analysis environment is through the Podman-based script:
- Podman installed on the host
- Optional: GPU support (the script auto-detects it)
./fire.sh start # Auto-detect GPU/CPU
./fire.sh start --gpu # Force GPU mode
./fire.sh start --cpu # Force CPU mode
./fire.sh stop # Stop containerThe script will:
- Detect whether the host supports GPU
- Start the appropriate container (GPU-enabled or CPU-only)
- Launch Jupyter Lab inside the container
- Expose the notebook environment on localhost
Run inside the container or via podman exec:
# Generate ANALYSIS_REGISTRY.md and .csv from notebook outputs
python src/tools/buildtable.py
# Generate analysis plots
python src/tools/plots.pyThe simulations use block bootstrap methodology which preserves temporal structure and correlations in financial data:
- Sample consecutive blocks of historical data (6-month blocks)
- Randomly concatenate blocks to create simulated 30-year scenarios
- Maintain serial correlation and regime persistence
| Parameter | Value |
|---|---|
| Number of simulations | 100,000 |
| Time horizon | 30 years |
| Block size | 6 months |
| Historical data | 2000-2025 |
| Withdrawal rates tested | 3%, 3.5%, 4% |
| Inflation adjustment | HICP Euro Area (lagged) |
| Rebalancing | Annual |
- Equity indices: MSCI World, MSCI ACWI, MSCI Europe, MSCI EMU
- Bond instruments: German Bund 10Y, Italian BTP 10Y, mixed portfolios
- Allocations: 60/40, 70/30, 80/20, 90/10, 100/0
The project uses:
- MSCI β equity indices (World, ACWI, Europe, EMU)
- Eurostat β HICP inflation data
- ISTAT β Italian inflation (FOI, NIC)
- Bundesbank β German Bund 10Y yields
- Banca d'Italia β Italian BTP 10Y yields
- Banque de France β French OAT 10Y yields
Note: Some datasets cannot be included due to licensing restrictions. Only scripts and derived data (when permitted) are stored in the repository.
- Python 3.12+
- Main dependencies:
pandas,numpy,scipyβ data manipulation and statisticsmatplotlib,seabornβ visualizationstatsmodelsβ statistical modelsjoblibβ parallel processingnbformatβ notebook parsing
- Podman for reproducible execution environment
- Optional GPU acceleration for simulations
Contributions are welcome, especially improvements to clarity, structure, reproducibility, or data pipelines.
This project is released under the MIT License, a permissive and widely used open-source license. It allows reuse, modification, distribution, and commercial usage with minimal restrictions.
Amedeo Salvati Universitas Mercatorum β BSc in Statistics and Big Data