{
  "study": "bootstrap-vs-rolling-windows",
  "content_version": "1.0",
  "measured_on": "2026-09-11",
  "publication_status": "published",
  "publication_review": {
    "reviewer_id": "tom-brancato",
    "reviewed_at": "2026-09-07",
    "approval": "Factual review complete and publication approved by Tom Brancato in the WMA-135 task conversation.",
    "study_content_version": "0.4"
  },
  "engine_version": "0.15.0",
  "schema_version": "m16.0",
  "source_commit": "661bc7ffcdf3d0997dd473f4e48faea63fb31939",
  "runtime": {
    "python": "3.13.3",
    "numpy": "2.4.6",
    "pydantic": "2.13.5"
  },
  "dataset": {
    "path": "data/montecarlo/historical_annual_returns.csv",
    "sha256": "e31b8dd2cd3730e88e3819facffb4860e048a6233d46aaccf0c14ba1ed9d2a5b",
    "rows": 98,
    "first_year": 1928,
    "last_year": 2025
  },
  "config_sha256": "c5d2d478c795072a8584ce8a04067b1d3568d38d5d1cb30d649992fb94d0ea9a",
  "script_sha256": "9473275b446e69d22536bd6ad3e02e4bbf96e573dc7e5d3e7bffdcddf1159fe4",
  "app_market_source": {
    "path": "services/whatify-api/src/domains/scenarios/when-you-stop/payload.ts",
    "sha256": "b5a8dc1b480fcc449c3bb0e6c0b32c6a0728607820c68d32388e1e4e20f8e21e",
    "settings": {
      "annual_fee_rate": 0.004,
      "type": "parametric",
      "mode": "normal",
      "equity_mean_real_return": 0.05,
      "equity_return_volatility": 0.18,
      "bond_mean_real_return": 0.02,
      "bond_return_volatility": 0.06,
      "annual_mean_inflation": 0.025,
      "annual_inflation_volatility": 0.01,
      "equity_bond_correlation": 0
    },
    "benchmark_override": {
      "annual_fee_rate": 0
    }
  },
  "simulation_seeds": [
    20260530,
    1,
    2,
    3,
    424242
  ],
  "trial_runs_per_seed": 1000,
  "common_inputs": {
    "scenario_label": "Canonical 4% rule benchmark",
    "starting_balances": {
      "taxable": 1000000,
      "tax_deferred": 0,
      "roth": 0,
      "taxable_cost_basis": null
    },
    "allocation": {
      "equity_pct": 0.6,
      "bond_pct": 0.4,
      "rebalance_annually": true
    },
    "withdrawal_strategy": {
      "type": "fixed_real",
      "annual_amount_real": 40000
    },
    "withdrawal_timing": "start_of_year",
    "withdrawal_order": {
      "type": "conventional",
      "account_order": [],
      "target_federal_marginal_rate": null,
      "irmaa_tier_ceiling": null
    },
    "tax_payment_order": null,
    "tax_model": {
      "type": "disabled"
    },
    "healthcare_policy": null,
    "roth_conversions": [],
    "social_security_benefits": [],
    "social_security_benefit_stream": null,
    "social_security": null,
    "longevity": null,
    "rmd_policy": null,
    "retirement_year": 0,
    "member_retirement_years": null,
    "mixed_period": null,
    "annual_contributions": null,
    "earned_income": null,
    "pensions": null,
    "accumulation_income_policy": null,
    "payroll_config_year": 2026,
    "pre_medicare_annual_cost_real": 0,
    "spending_plan": null,
    "spending_schedule": null,
    "spending_goals": [],
    "survivor_income_floor_real": null,
    "projection_anchor_year": null,
    "policy": null,
    "filing_status": "single",
    "tax_config_year": 2026,
    "horizon_years": 30
  },
  "return_models": {
    "historical": {
      "annual_fee_rate": 0,
      "type": "historical_bootstrap",
      "dataset_id": "us-annual-1928-2025",
      "dataset_version": "damodaran-histretSP-1928-2025",
      "sampling_method": "iid",
      "mean_block_years": null
    },
    "parametric": {
      "annual_fee_rate": 0,
      "type": "parametric",
      "mode": "normal",
      "equity_mean_real_return": 0.05,
      "equity_return_volatility": 0.18,
      "bond_mean_real_return": 0.02,
      "bond_return_volatility": 0.06,
      "annual_mean_inflation": 0.025,
      "annual_inflation_volatility": 0.01,
      "equity_bond_correlation": 0
    }
  },
  "summary": [
    {
      "method": "rolling",
      "successful_paths": 65,
      "total_paths": 69,
      "success_percent": 94.202899,
      "run_count": 1,
      "min_run_success_percent": 94.202899,
      "max_run_success_percent": 94.202899
    },
    {
      "method": "bootstrap",
      "successful_paths": 4558,
      "total_paths": 5000,
      "success_percent": 91.16,
      "run_count": 5,
      "min_run_success_percent": 90.5,
      "max_run_success_percent": 92.2
    },
    {
      "method": "parametric",
      "successful_paths": 3869,
      "total_paths": 5000,
      "success_percent": 77.38,
      "run_count": 5,
      "min_run_success_percent": 75.7,
      "max_run_success_percent": 79.4
    }
  ],
  "results": [
    {
      "method": "rolling",
      "seed": null,
      "successful_paths": 65,
      "total_paths": 69,
      "success_percent": 94.202899
    },
    {
      "method": "bootstrap",
      "seed": 20260530,
      "successful_paths": 905,
      "total_paths": 1000,
      "success_percent": 90.5
    },
    {
      "method": "bootstrap",
      "seed": 1,
      "successful_paths": 905,
      "total_paths": 1000,
      "success_percent": 90.5
    },
    {
      "method": "bootstrap",
      "seed": 2,
      "successful_paths": 922,
      "total_paths": 1000,
      "success_percent": 92.2
    },
    {
      "method": "bootstrap",
      "seed": 3,
      "successful_paths": 916,
      "total_paths": 1000,
      "success_percent": 91.6
    },
    {
      "method": "bootstrap",
      "seed": 424242,
      "successful_paths": 910,
      "total_paths": 1000,
      "success_percent": 91
    },
    {
      "method": "parametric",
      "seed": 20260530,
      "successful_paths": 768,
      "total_paths": 1000,
      "success_percent": 76.8
    },
    {
      "method": "parametric",
      "seed": 1,
      "successful_paths": 775,
      "total_paths": 1000,
      "success_percent": 77.5
    },
    {
      "method": "parametric",
      "seed": 2,
      "successful_paths": 794,
      "total_paths": 1000,
      "success_percent": 79.4
    },
    {
      "method": "parametric",
      "seed": 3,
      "successful_paths": 775,
      "total_paths": 1000,
      "success_percent": 77.5
    },
    {
      "method": "parametric",
      "seed": 424242,
      "successful_paths": 757,
      "total_paths": 1000,
      "success_percent": 75.7
    }
  ],
  "assumption_diagnostic": {
    "seed": 20260905,
    "trials_per_random_case": 10000,
    "common_inputs": {
      "scenario_label": "Canonical 4% rule benchmark",
      "starting_balances": {
        "taxable": 1000000,
        "tax_deferred": 0,
        "roth": 0,
        "taxable_cost_basis": null
      },
      "allocation": {
        "equity_pct": 0.6,
        "bond_pct": 0.4,
        "rebalance_annually": true
      },
      "withdrawal_strategy": {
        "type": "fixed_real",
        "annual_amount_real": 40000
      },
      "withdrawal_timing": "start_of_year",
      "withdrawal_order": {
        "type": "conventional",
        "account_order": [],
        "target_federal_marginal_rate": null,
        "irmaa_tier_ceiling": null
      },
      "tax_payment_order": null,
      "tax_model": {
        "type": "disabled"
      },
      "healthcare_policy": null,
      "roth_conversions": [],
      "social_security_benefits": [],
      "social_security_benefit_stream": null,
      "social_security": null,
      "longevity": null,
      "rmd_policy": null,
      "retirement_year": 0,
      "member_retirement_years": null,
      "mixed_period": null,
      "annual_contributions": null,
      "earned_income": null,
      "pensions": null,
      "accumulation_income_policy": null,
      "payroll_config_year": 2026,
      "pre_medicare_annual_cost_real": 0,
      "spending_plan": null,
      "spending_schedule": null,
      "spending_goals": [],
      "survivor_income_floor_real": null,
      "projection_anchor_year": null,
      "policy": null,
      "filing_status": "single",
      "tax_config_year": 2026,
      "horizon_years": 30
    },
    "historical_assumptions": {
      "assumption_id": "historical-empirical-real-moments",
      "version": "1",
      "calibration_status": "historical_reference",
      "mean_convention": "annual_arithmetic_real_before_fees",
      "volatility_convention": "annual_real_standard_deviation",
      "parameters": {
        "annual_fee_rate": 0,
        "type": "parametric",
        "mode": "normal",
        "equity_mean_real_return": 0.08608527595185428,
        "equity_return_volatility": 0.19204905860879812,
        "bond_mean_real_return": 0.018335899051605854,
        "bond_return_volatility": 0.08813889094258526,
        "annual_mean_inflation": 0.031083377551020405,
        "annual_inflation_volatility": 0.03875330813542358,
        "equity_bond_correlation": 0.09094780494299401
      },
      "provenance": {
        "dataset_file": "historical_annual_returns.csv",
        "dataset_id": "annual-stock-bond-inflation",
        "dataset_version": "sha256-e31b8dd2cd3730e8",
        "sha256": "e31b8dd2cd3730e88e3819facffb4860e048a6233d46aaccf0c14ba1ed9d2a5b",
        "start_year": 1928,
        "end_year": 2025,
        "observation_count": 98,
        "row_sources": [
          "NYU Stern (Damodaran) histretSP: S&P 500 total return, 10-yr US T.Bond total return, CPI-U inflation"
        ],
        "source_notes": "data/montecarlo/README.md (for the bundled dataset)",
        "real_return_conversion": "(1 + nominal_total_return) / (1 + inflation_rate) - 1",
        "moment_ddof": 0,
        "real_covariance_equity_bond": [
          [
            0.03688284091252558,
            0.001539472678681706
          ],
          [
            0.001539472678681706,
            0.007768464096588938
          ]
        ],
        "interpretation": "Empirical reference only; not a forward-looking forecast.",
        "gaussian_limitation": "Matches annual real asset moments and correlation, not tails, serial dependence, or return/inflation dependence. Inflation draws remain independent."
      }
    },
    "house_assumptions": {
      "assumption_id": "whatify-money-house-baseline",
      "version": "1",
      "calibration_status": "provisional_not_independently_calibrated",
      "mean_convention": "annual_arithmetic_real_before_fees",
      "volatility_convention": "annual_real_standard_deviation",
      "parameters": {
        "annual_fee_rate": 0.004,
        "type": "parametric",
        "mode": "normal",
        "equity_mean_real_return": 0.05,
        "equity_return_volatility": 0.18,
        "bond_mean_real_return": 0.02,
        "bond_return_volatility": 0.06,
        "annual_mean_inflation": 0.025,
        "annual_inflation_volatility": 0.01,
        "equity_bond_correlation": 0
      },
      "provenance": {
        "recorded_date": "2026-09-05",
        "source_kind": "performance_test_fixture",
        "source_contract": "docs/product/when-you-stop-contract.md",
        "product_mapping": "services/whatify-api/src/domains/scenarios/when-you-stop/payload.ts",
        "calibration_evidence": "None independently established. Documents existing product assumptions; does not endorse them as a forward-looking forecast.",
        "units": "Decimal annual rates. Means are arithmetic, not compounded/geometric growth rates. Inflation is an annual price-change rate, not an additional real return.",
        "annual_dependence": "Independent annual Gaussian draws; same-year equity/bond correlation zero in this baseline. Inflation is independently drawn.",
        "fee_convention": "Separate annual asset fee applied by the engine; not deducted from the stated return means.",
        "change_policy": "New production defaults require sourced forward-looking assumptions and scenario-matrix review, not fitting a target success rate. This record does not replace product defaults."
      }
    },
    "adjustment_targets": {
      "means_only": {
        "annual_fee_rate": 0,
        "type": "parametric",
        "mode": "normal",
        "equity_mean_real_return": 0.05,
        "equity_return_volatility": 0.19204905860879812,
        "bond_mean_real_return": 0.02,
        "bond_return_volatility": 0.08813889094258526,
        "annual_mean_inflation": 0.031083377551020405,
        "annual_inflation_volatility": 0.03875330813542358,
        "equity_bond_correlation": 0.09094780494299401
      },
      "means_and_spreads": {
        "annual_fee_rate": 0,
        "type": "parametric",
        "mode": "normal",
        "equity_mean_real_return": 0.05,
        "equity_return_volatility": 0.18,
        "bond_mean_real_return": 0.02,
        "bond_return_volatility": 0.06,
        "annual_mean_inflation": 0.025,
        "annual_inflation_volatility": 0.01,
        "equity_bond_correlation": 0
      }
    },
    "source_hashes": {
      "configs/returns/house-baseline-v1.json": "3a489a48e823d1ac1ee90bc3862304892e3f3bae6c875d61235ceff4bc32aba6",
      "scripts/compare-correlated-persistence.py": "4c20f9396895b286d29c46f143e7979fbc9461eb681abeaf6d03bb98d349764a",
      "src/whatify_mc/calibration.py": "2603e9e214cc1ff73b3e1880b5d557fa01de2600aabb082805a084f0efb0c993"
    },
    "transformation": "For each year and series: (value - historical mean) / historical standard deviation * target standard deviation + target mean. Real returns use (1+nominal)/(1+inflation)-1; population std uses ddof=0. Convert adjusted real asset returns back to nominal with adjusted inflation.",
    "controls": [
      "means_only changes only real stock and bond means; original spreads and inflation remain.",
      "means_and_spreads matches means and spreads of real stocks, real bonds, and inflation.",
      "Both adjustments preserve standardized annual shapes, row order and correlations.",
      "All cases use the identical fee-free plan and production engine accounting.",
      "block_5 uses random-length blocks averaging five years, with circular wraparound.",
      "IID and block_5 use the same seed across adjustments to retain the same year-index paths."
    ],
    "limitations": [
      "Synthetic adjusted history is not observed history or a forecast.",
      "The means-and-spreads test does not isolate the effect of mean returns alone.",
      "Five-year blocks are a sensitivity choice, not a fitted model of future dependence.",
      "Rolling windows overlap; 69 windows are not 69 independent observations.",
      "One seed per 10000-path case; no test of equality or forecast validation is claimed.",
      "Inflation cancels for this fixed-real-spending tax-free case, not all household models."
    ],
    "results": [
      {
        "method": "parametric",
        "adjustment": "house",
        "seed": 20260905,
        "successful_paths": 7750,
        "total_paths": 10000,
        "success_percent": 77.5
      },
      {
        "method": "iid",
        "adjustment": "raw",
        "seed": 20260905,
        "successful_paths": 9078,
        "total_paths": 10000,
        "success_percent": 90.78
      },
      {
        "method": "iid",
        "adjustment": "means_only",
        "seed": 20260905,
        "successful_paths": 7186,
        "total_paths": 10000,
        "success_percent": 71.86
      },
      {
        "method": "iid",
        "adjustment": "means_and_spreads",
        "seed": 20260905,
        "successful_paths": 7522,
        "total_paths": 10000,
        "success_percent": 75.22
      },
      {
        "method": "block_5",
        "adjustment": "raw",
        "seed": 20260905,
        "successful_paths": 9280,
        "total_paths": 10000,
        "success_percent": 92.8
      },
      {
        "method": "block_5",
        "adjustment": "means_only",
        "seed": 20260905,
        "successful_paths": 7421,
        "total_paths": 10000,
        "success_percent": 74.21
      },
      {
        "method": "block_5",
        "adjustment": "means_and_spreads",
        "seed": 20260905,
        "successful_paths": 7809,
        "total_paths": 10000,
        "success_percent": 78.09
      },
      {
        "method": "rolling",
        "adjustment": "raw",
        "seed": null,
        "successful_paths": 65,
        "total_paths": 69,
        "success_percent": 94.202899
      },
      {
        "method": "rolling",
        "adjustment": "means_only",
        "seed": null,
        "successful_paths": 48,
        "total_paths": 69,
        "success_percent": 69.565217
      },
      {
        "method": "rolling",
        "adjustment": "means_and_spreads",
        "seed": null,
        "successful_paths": 50,
        "total_paths": 69,
        "success_percent": 72.463768
      }
    ]
  },
  "rolling_windows": [
    {
      "start_year": 1928,
      "end_year": 1957,
      "success": true
    },
    {
      "start_year": 1929,
      "end_year": 1958,
      "success": true
    },
    {
      "start_year": 1930,
      "end_year": 1959,
      "success": true
    },
    {
      "start_year": 1931,
      "end_year": 1960,
      "success": true
    },
    {
      "start_year": 1932,
      "end_year": 1961,
      "success": true
    },
    {
      "start_year": 1933,
      "end_year": 1962,
      "success": true
    },
    {
      "start_year": 1934,
      "end_year": 1963,
      "success": true
    },
    {
      "start_year": 1935,
      "end_year": 1964,
      "success": true
    },
    {
      "start_year": 1936,
      "end_year": 1965,
      "success": true
    },
    {
      "start_year": 1937,
      "end_year": 1966,
      "success": true
    },
    {
      "start_year": 1938,
      "end_year": 1967,
      "success": true
    },
    {
      "start_year": 1939,
      "end_year": 1968,
      "success": true
    },
    {
      "start_year": 1940,
      "end_year": 1969,
      "success": true
    },
    {
      "start_year": 1941,
      "end_year": 1970,
      "success": true
    },
    {
      "start_year": 1942,
      "end_year": 1971,
      "success": true
    },
    {
      "start_year": 1943,
      "end_year": 1972,
      "success": true
    },
    {
      "start_year": 1944,
      "end_year": 1973,
      "success": true
    },
    {
      "start_year": 1945,
      "end_year": 1974,
      "success": true
    },
    {
      "start_year": 1946,
      "end_year": 1975,
      "success": true
    },
    {
      "start_year": 1947,
      "end_year": 1976,
      "success": true
    },
    {
      "start_year": 1948,
      "end_year": 1977,
      "success": true
    },
    {
      "start_year": 1949,
      "end_year": 1978,
      "success": true
    },
    {
      "start_year": 1950,
      "end_year": 1979,
      "success": true
    },
    {
      "start_year": 1951,
      "end_year": 1980,
      "success": true
    },
    {
      "start_year": 1952,
      "end_year": 1981,
      "success": true
    },
    {
      "start_year": 1953,
      "end_year": 1982,
      "success": true
    },
    {
      "start_year": 1954,
      "end_year": 1983,
      "success": true
    },
    {
      "start_year": 1955,
      "end_year": 1984,
      "success": true
    },
    {
      "start_year": 1956,
      "end_year": 1985,
      "success": true
    },
    {
      "start_year": 1957,
      "end_year": 1986,
      "success": true
    },
    {
      "start_year": 1958,
      "end_year": 1987,
      "success": true
    },
    {
      "start_year": 1959,
      "end_year": 1988,
      "success": true
    },
    {
      "start_year": 1960,
      "end_year": 1989,
      "success": true
    },
    {
      "start_year": 1961,
      "end_year": 1990,
      "success": true
    },
    {
      "start_year": 1962,
      "end_year": 1991,
      "success": true
    },
    {
      "start_year": 1963,
      "end_year": 1992,
      "success": true
    },
    {
      "start_year": 1964,
      "end_year": 1993,
      "success": true
    },
    {
      "start_year": 1965,
      "end_year": 1994,
      "success": false
    },
    {
      "start_year": 1966,
      "end_year": 1995,
      "success": false
    },
    {
      "start_year": 1967,
      "end_year": 1996,
      "success": true
    },
    {
      "start_year": 1968,
      "end_year": 1997,
      "success": false
    },
    {
      "start_year": 1969,
      "end_year": 1998,
      "success": false
    },
    {
      "start_year": 1970,
      "end_year": 1999,
      "success": true
    },
    {
      "start_year": 1971,
      "end_year": 2000,
      "success": true
    },
    {
      "start_year": 1972,
      "end_year": 2001,
      "success": true
    },
    {
      "start_year": 1973,
      "end_year": 2002,
      "success": true
    },
    {
      "start_year": 1974,
      "end_year": 2003,
      "success": true
    },
    {
      "start_year": 1975,
      "end_year": 2004,
      "success": true
    },
    {
      "start_year": 1976,
      "end_year": 2005,
      "success": true
    },
    {
      "start_year": 1977,
      "end_year": 2006,
      "success": true
    },
    {
      "start_year": 1978,
      "end_year": 2007,
      "success": true
    },
    {
      "start_year": 1979,
      "end_year": 2008,
      "success": true
    },
    {
      "start_year": 1980,
      "end_year": 2009,
      "success": true
    },
    {
      "start_year": 1981,
      "end_year": 2010,
      "success": true
    },
    {
      "start_year": 1982,
      "end_year": 2011,
      "success": true
    },
    {
      "start_year": 1983,
      "end_year": 2012,
      "success": true
    },
    {
      "start_year": 1984,
      "end_year": 2013,
      "success": true
    },
    {
      "start_year": 1985,
      "end_year": 2014,
      "success": true
    },
    {
      "start_year": 1986,
      "end_year": 2015,
      "success": true
    },
    {
      "start_year": 1987,
      "end_year": 2016,
      "success": true
    },
    {
      "start_year": 1988,
      "end_year": 2017,
      "success": true
    },
    {
      "start_year": 1989,
      "end_year": 2018,
      "success": true
    },
    {
      "start_year": 1990,
      "end_year": 2019,
      "success": true
    },
    {
      "start_year": 1991,
      "end_year": 2020,
      "success": true
    },
    {
      "start_year": 1992,
      "end_year": 2021,
      "success": true
    },
    {
      "start_year": 1993,
      "end_year": 2022,
      "success": true
    },
    {
      "start_year": 1994,
      "end_year": 2023,
      "success": true
    },
    {
      "start_year": 1995,
      "end_year": 2024,
      "success": true
    },
    {
      "start_year": 1996,
      "end_year": 2025,
      "success": true
    }
  ],
  "limitations": [
    "Descriptive model results, not personal odds or a forecast.",
    "Overlapping historical windows are not independent observations.",
    "Five fixed seeds are examples, not a confidence interval or exhaustive sensitivity study.",
    "No taxes, benefits, fees, healthcare, or changing lifespans in this comparison.",
    "The parametric test uses the app's market settings but removes its 0.4% fee to match the other two fee-free tests. This is not a full product run.",
    "Parametric assumptions are not fitted to this historical dataset; differences include return assumptions, not just sequence generation.",
    "Matching seed IDs do not mean matching market paths across model types.",
    "Pooled random-path rates combine five runs and are not forecast probabilities.",
    "Full engine reproduction requires repository access; the engine is not public."
  ],
  "reproduce": "PYTHONPATH=src python3 scripts/research/bootstrap_vs_rolling.py"
}
