Spaces:
Sleeping
Sleeping
| import os | |
| # Pin thread counts BEFORE any numeric library import to ensure deterministic | |
| # BLAS operations in scikit-learn's ElasticNetCV and XGBoost. | |
| os.environ.setdefault("OMP_NUM_THREADS", "1") | |
| os.environ.setdefault("OPENBLAS_NUM_THREADS", "1") | |
| os.environ.setdefault("MKL_NUM_THREADS", "1") | |
| import copy | |
| import numpy as np | |
| import pandas as pd | |
| import pytest | |
| from core_types import PortfolioState | |
| from solver import build_and_optimize | |
| from config import DEFAULT_CONFIG | |
| def test_xgboost_determinism_across_5_runs(): | |
| """ | |
| Runs 5 complete ML-Stacking (Model 5) optimizations using the exact same inputs | |
| and ensures the weights and returns are absolutely identical. | |
| This protects against XGBoost thread-ordering drift. | |
| """ | |
| rng = np.random.default_rng(42) | |
| dates = pd.date_range("2020-01-01", periods=252*3, freq="B") | |
| tickers = ["AAPL", "TLT", "JPM"] | |
| returns_df = pd.DataFrame( | |
| rng.normal(0.0004, 0.015, size=(len(dates), len(tickers))), | |
| index=dates, columns=tickers | |
| ) | |
| bench_rets = pd.Series(rng.normal(0.0003, 0.012, size=len(dates)), index=dates) | |
| cfg = copy.deepcopy(DEFAULT_CONFIG) | |
| cfg.update({ | |
| "garch_enabled": False, | |
| "cvar_enabled": False, | |
| "tax_enabled": False, | |
| "dynamic_risk": False, | |
| "hmm_regime": False, | |
| "sector_map": {t: "Other" for t in tickers}, | |
| "sector_limit": 1.0, | |
| "single_asset_min": 0.0, | |
| "single_asset_max": 0.60, | |
| }) | |
| runs = 5 | |
| results = [] | |
| for i in range(runs): | |
| opt_res = build_and_optimize( | |
| returns_df=returns_df, | |
| benchmark_rets=bench_rets, | |
| risk_input=5, | |
| risk_factor=3.0, | |
| state=PortfolioState.empty(tickers), | |
| cfg=copy.deepcopy(cfg), | |
| model=5, # Global Pooled Panel Machine Learning | |
| allocation_engine=1, | |
| ff_df=None, | |
| spread_map={t: 0.0005 for t in tickers}, | |
| silent=True, | |
| ) | |
| results.append((opt_res.weights.values, opt_res.expected_returns.values, opt_res.covariance_matrix.values)) | |
| # Assert exact match across all 5 runs | |
| base_w, base_r, base_c = results[0] | |
| for i in range(1, runs): | |
| curr_w, curr_r, curr_c = results[i] | |
| # Max acceptable drift is extremely tight (float rounding tolerance only) | |
| assert np.allclose(base_w, curr_w, atol=1e-8, rtol=1e-8), f"Weight drift detected on run {i}" | |
| assert np.allclose(base_r, curr_r, atol=1e-8, rtol=1e-8), f"Return drift detected on run {i}" | |
| assert np.allclose(base_c, curr_c, atol=1e-8, rtol=1e-8), f"Covariance drift detected on run {i}" | |