{"record":{"id":"68de7ebbd7dc79f8","repo":"HKUDS/Vibe-Trading","slug":"var-must-be-1-d-or-scalar-got-shape-var-values-s","errorCode":null,"errorMessage":"var must be 1-D or scalar, got shape {var_values.shape}","messagePattern":"var must be 1-D or scalar, got shape (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/var_backtest.py","lineNumber":282,"sourceCode":"            raise ValueError(\n                \"returns and var must cover exactly the same labels; \"\n                f\"{len(only_ret)} label(s) only in returns and \"\n                f\"{len(only_var)} only in var. Align them explicitly -- a \"\n                \"partial join silently compares each day against another day's \"\n                \"forecast.\"\n            )\n\n    ret_values = np.asarray(returns, dtype=float)\n    if ret_values.ndim > 1:\n        raise ValueError(f\"returns must be 1-D, got shape {ret_values.shape}\")\n    ret_values = ret_values.ravel()\n\n    var_values = np.asarray(var, dtype=float)\n    if var_values.ndim == 0:\n        var_values = np.full(ret_values.shape, float(var_values))\n    else:\n        if var_values.ndim > 1:\n            raise ValueError(f\"var must be 1-D or scalar, got shape {var_values.shape}\")\n        var_values = var_values.ravel()\n\n    if ret_values.size != var_values.size:\n        raise ValueError(\n            f\"returns and var must be the same length, got {ret_values.size} \"\n            f\"and {var_values.size}\"\n        )\n    if ret_values.size == 0:\n        raise ValueError(\"returns is empty\")\n\n    keep = np.isfinite(ret_values) & np.isfinite(var_values)\n    dropped = int((~keep).sum())\n    if not keep.any():\n        raise ValueError(\"no observation has a finite return and a finite var\")\n\n    index = ret_index if ret_index is not None else var_index\n    kept_index = index[keep] if index is not None else None\n    return ret_values[keep], var_values[keep], kept_index, dropped","sourceCodeStart":264,"sourceCodeEnd":300,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/var_backtest.py#L264-L300","documentation":"_align accepts var as either a scalar (broadcast across all returns) or a 1-D array. A var with ndim > 1 — a DataFrame, a (n,1) column, or a (n,k) matrix of quantiles — raises ValueError with its shape, because there is no unambiguous mapping to the single returns vector.","triggerScenarios":"Passing VaR as a DataFrame column pair (e.g. 1% and 5% quantiles side by side), a numpy (n,1) array from a GARCH forecast's .reshape(-1,1), or selecting with double brackets var_df[['var_99']].","commonSituations":"GARCH/EWMA libraries whose .forecast() returns 2-D arrays; VaR reported at multiple confidence levels in one frame; batch model outputs stacked column-wise.","solutions":["Extract one level: var_df['var_99'] or var_arr[:, 0] / var_arr.ravel().","Call var_backtest once per confidence level rather than passing all columns.","Convert model output with np.asarray(var).ravel() before passing."],"exampleFix":"# before\nvar_backtest(rets, var_matrix)  # shape (500, 2)\n# after\nfor col in var_matrix.columns:\n    var_backtest(rets, var_matrix[col])","handlingStrategy":"type-guard","validationCode":"import numpy as np\nv = np.asarray(var)\nassert v.ndim == 0 or v.ndim == 1","typeGuard":"def var_is_scalar_or_1d(var) -> bool:\n    import numpy as np\n    n = np.asarray(var).ndim\n    return n <= 1","tryCatchPattern":"except ValueError as e:\n    if 'var must be 1-D or scalar' in str(e): var = np.asarray(var)[:, 0]","preventionTips":["Backtest one confidence level per call","Convert GARCH forecast frames to Series before passing"],"tags":["var-backtest","numpy","shape-mismatch"],"backgroundTag":"dimensionality-mismatch","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}