{"record":{"id":"51dab5b80878daa0","repo":"HKUDS/Vibe-Trading","slug":"returns-is-empty","errorCode":null,"errorMessage":"returns is empty","messagePattern":"returns is empty","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/var_backtest.py","lineNumber":291,"sourceCode":"    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\n\n\ndef violation_indicator(\n    returns: pd.Series | np.ndarray | Sequence[float],\n    var: pd.Series | np.ndarray | Sequence[float] | float,\n) -> np.ndarray:\n    \"\"\"Flag the days on which the realised loss exceeded the VaR forecast.\n\n    Args:","sourceCodeStart":273,"sourceCodeEnd":309,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/var_backtest.py#L273-L309","documentation":"_align refuses empty input: if the (1-D) returns array has zero elements it raises ValueError('returns is empty'). An empty backtest would otherwise produce division-by-zero statistics and empty reports that look like success.","triggerScenarios":"Passing [] or an empty Series/array for returns — e.g. a date filter that selects nothing, an empty CSV read, or a test fixture that failed to populate data.","commonSituations":"Date-range parameters that exclude all rows; upstream API returning an empty payload; empty DataFrame .iloc[:,0] column selection after a bad filter.","solutions":["Debug why the returns array is empty (print its length and index range before the call).","Fix date filters / data loading so at least one observation survives.","Guard with a length check and skip the backtest when there is no data."],"exampleFix":"# before\nvar_backtest(returns[returns.index > '2030-01-01'], var)\n# after\nsub = returns.loc['2024-01-01':'2024-12-31']\nif len(sub):\n    var_backtest(sub, var.reindex(sub.index))","handlingStrategy":"validation","validationCode":"assert len(returns) > 0, 'no returns in backtest window'","typeGuard":"def non_empty(x) -> bool:\n    try:\n        return len(x) > 0\n    except TypeError:\n        return False","tryCatchPattern":"except ValueError as e:\n    if str(e) == 'returns is empty': skip_or_raise_data_error(e)","preventionTips":["Assert non-empty windows after date filtering","Log row counts at each ETL stage"],"tags":["var-backtest","empty-input"],"backgroundTag":"empty-input","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}