{"record":{"id":"80aa8ac075f7a603","repo":"HKUDS/Vibe-Trading","slug":"specific-variances-contains-non-finite-values","errorCode":null,"errorMessage":"specific_variances contains non-finite values","messagePattern":"specific_variances contains non-finite values","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/factormodel.py","lineNumber":679,"sourceCode":"    if factors.empty:\n        raise ValueError(\n            f\"No matching factors between exposures ({sorted(X.columns)}) and factor_cov ({sorted(factor_cov.index)})\"\n        )\n\n    X = X[factors]\n    F = factor_cov.loc[factors, factors]\n    F_mat = F.to_numpy(dtype=float)\n    if not np.allclose(F_mat, F_mat.T, atol=1e-8):\n        raise ValueError(\"factor_cov matrix must be symmetric\")\n    eigvals = np.linalg.eigvalsh(F_mat)\n    if np.min(eigvals) < -1e-8:\n        raise ValueError(\"factor_cov matrix must be positive semi-definite\")\n\n    # Align specific variances\n    if specific_variances is not None:\n        spec_var_s = pd.Series(specific_variances, dtype=float)\n        if not np.isfinite(spec_var_s.values).all():\n            raise ValueError(\"specific_variances contains non-finite values\")\n        d = spec_var_s.reindex(assets, fill_value=0.0).clip(lower=0.0)\n    else:\n        d = pd.Series(0.0, index=assets, dtype=float)\n\n    # Portfolio factor exposure: x_p = X^T w (K x 1)\n    x_p = X.T.dot(w)\n\n    # Factor variance: x_p^T F x_p\n    F_x_p = F.dot(x_p)\n    factor_var = float(np.maximum(0.0, x_p.dot(F_x_p)))\n    factor_vol = float(np.sqrt(factor_var))\n\n    # Specific variance: sum(w_i^2 * d_i)\n    spec_var = float(np.maximum(0.0, (w**2 * d).sum()))\n    spec_vol = float(np.sqrt(spec_var))\n\n    total_var = float(np.maximum(0.0, factor_var + spec_var))\n    total_vol = float(np.sqrt(total_var))","sourceCodeStart":661,"sourceCodeEnd":697,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/factormodel.py#L661-L697","documentation":"Optional specific_variances (idiosyncratic variances per asset) must be finite; a NaN/inf entry would corrupt the specific-risk component total_var = factor_var + wᵀDw.","triggerScenarios":"specific_variances containing NaN for some tickers or inf from a volatility divided by zero.","commonSituations":"Idio variances estimated for a different asset set with missing reindex; zero residual degrees of freedom producing inf.","solutions":["Find bad entries: s[~np.isfinite(s)] and fix or fill","Fill missing assets with 0.0 (matching the internal reindex default) after review","Fix the residual-variance estimator (dropna, min periods)"],"exampleFix":"# before\nrisk = factor_risk_decomposition(w, X, F, specific_variances=d)\n# after\nd = d.replace([np.inf, -np.inf], np.nan).fillna(0.0)\nrisk = factor_risk_decomposition(w, X, F, specific_variances=d)","handlingStrategy":"validation","validationCode":"assert np.isfinite(pd.Series(specific_variances, dtype=float).values).all()","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reindex idio variances onto the asset universe with fill 0.0 deliberately","Sanitize estimator outputs before passing optional args"],"tags":["quantlib","factormodel","nan","inf","specific-risk"],"backgroundTag":"non-finite-values","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}