HKUDS/Vibe-Trading · error · ValueError

specific_variances contains non-finite values

Error message

specific_variances contains non-finite values

What it means

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.

Source

Thrown at agent/src/quantlib/factormodel.py:679

    if factors.empty:
        raise ValueError(
            f"No matching factors between exposures ({sorted(X.columns)}) and factor_cov ({sorted(factor_cov.index)})"
        )

    X = X[factors]
    F = factor_cov.loc[factors, factors]
    F_mat = F.to_numpy(dtype=float)
    if not np.allclose(F_mat, F_mat.T, atol=1e-8):
        raise ValueError("factor_cov matrix must be symmetric")
    eigvals = np.linalg.eigvalsh(F_mat)
    if np.min(eigvals) < -1e-8:
        raise ValueError("factor_cov matrix must be positive semi-definite")

    # Align specific variances
    if specific_variances is not None:
        spec_var_s = pd.Series(specific_variances, dtype=float)
        if not np.isfinite(spec_var_s.values).all():
            raise ValueError("specific_variances contains non-finite values")
        d = spec_var_s.reindex(assets, fill_value=0.0).clip(lower=0.0)
    else:
        d = pd.Series(0.0, index=assets, dtype=float)

    # Portfolio factor exposure: x_p = X^T w (K x 1)
    x_p = X.T.dot(w)

    # Factor variance: x_p^T F x_p
    F_x_p = F.dot(x_p)
    factor_var = float(np.maximum(0.0, x_p.dot(F_x_p)))
    factor_vol = float(np.sqrt(factor_var))

    # Specific variance: sum(w_i^2 * d_i)
    spec_var = float(np.maximum(0.0, (w**2 * d).sum()))
    spec_vol = float(np.sqrt(spec_var))

    total_var = float(np.maximum(0.0, factor_var + spec_var))
    total_vol = float(np.sqrt(total_var))

View on GitHub (pinned to 80ffdda44c)

Solutions

  1. Find bad entries: s[~np.isfinite(s)] and fix or fill
  2. Fill missing assets with 0.0 (matching the internal reindex default) after review
  3. Fix the residual-variance estimator (dropna, min periods)

Example fix

# before
risk = factor_risk_decomposition(w, X, F, specific_variances=d)
# after
d = d.replace([np.inf, -np.inf], np.nan).fillna(0.0)
risk = factor_risk_decomposition(w, X, F, specific_variances=d)
Defensive patterns

Strategy: validation

Validate before calling

assert np.isfinite(pd.Series(specific_variances, dtype=float).values).all()

Prevention

When it happens

Trigger: specific_variances containing NaN for some tickers or inf from a volatility divided by zero.

Common situations: Idio variances estimated for a different asset set with missing reindex; zero residual degrees of freedom producing inf.

Related errors


AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28). Data as JSON: /api/errors/80aa8ac075f7a603. Report an issue: GitHub.