{"record":{"id":"a195e4572eef77d2","repo":"HKUDS/Vibe-Trading","slug":"breaches-must-be-1-d-got-shape-flags-shape","errorCode":null,"errorMessage":"breaches must be 1-D, got shape {flags.shape}","messagePattern":"breaches must be 1-D, got shape (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/var_backtest.py","lineNumber":430,"sourceCode":"        breaches: Boolean sequence in chronological order, True on breach days.\n        significance: Level at which ``rejected`` is decided.\n\n    Returns:\n        An :class:`IndependenceResult`. When the sample holds no breach, or\n        holds breaches only in its final position, the transition probabilities\n        are not separately identified; the statistic is then 0 with\n        ``identified=False`` rather than an arbitrary number.\n\n    Raises:\n        ValueError: If ``breaches`` holds fewer than two observations or is not\n            1-D, or if ``significance`` is not strictly between 0 and 1.\n    \"\"\"\n    if not 0.0 < significance < 1.0:\n        raise ValueError(f\"significance must be in (0, 1), got {significance}\")\n\n    flags = np.asarray(breaches)\n    if flags.ndim != 1:\n        raise ValueError(f\"breaches must be 1-D, got shape {flags.shape}\")\n    if flags.size < 2:\n        raise ValueError(\n            f\"breaches needs at least 2 observations to hold a transition, got {flags.size}\"\n        )\n    flags = flags.astype(bool)\n\n    prev, curr = flags[:-1], flags[1:]\n    n00 = int(np.sum(~prev & ~curr))\n    n01 = int(np.sum(~prev & curr))\n    n10 = int(np.sum(prev & ~curr))\n    n11 = int(np.sum(prev & curr))\n\n    from_calm = n00 + n01\n    from_breach = n10 + n11\n    total = from_calm + from_breach\n\n    pi01 = n01 / from_calm if from_calm else 0.0\n    pi11 = n11 / from_breach if from_breach else 0.0","sourceCodeStart":412,"sourceCodeEnd":448,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/var_backtest.py#L412-L448","documentation":"christoffersen_independence requires breaches to be a 1-D sequence of boolean breach flags because it computes lag-1 transition counts between consecutive observations. A 2-D array (e.g. shape (n, 1) from a DataFrame column reshape) has no well-defined 'previous' element, so it is rejected.","triggerScenarios":"Passing np.array([[0],[1],[0]]), a 2-D array, or a pandas DataFrame (which converts to a 2-D ndarray) to christoffersen_independence, or to christoffersen_conditional_coverage/var_backtest which forward it.","commonSituations":"Feeding a single-column pandas DataFrame instead of a Series, or forgetting .ravel()/.flatten() after reshaping model output. Also passing a matrix of breach flags for multiple VaR levels at once.","solutions":["Pass a 1-D array or pandas Series: breaches = flags.ravel().","Use df['breach'].to_numpy() (Series) rather than df[['breach']].to_numpy() (2-D).","Loop over columns if you have breach flags for multiple VaR quantiles."],"exampleFix":"# before\nchristoffersen_independence(df[['breach']].to_numpy())\n# after\nchristoffersen_independence(df['breach'].to_numpy())","handlingStrategy":"validation","validationCode":"import numpy as np\nflags = np.asarray(breaches)\nif flags.ndim != 1:\n    flags = flags.ravel()\nchristoffersen_independence(flags, significance=0.05)","typeGuard":"def is_1d_flags(x) -> bool:\n    import numpy as np\n    return np.asarray(x).ndim == 1","tryCatchPattern":null,"preventionTips":["Use Series/single-bracket column selection, not double brackets.","Ravel reshaped model output before testing."],"tags":["python","numpy","argument-validation","shape-mismatch"],"backgroundTag":"array-dimension-mismatch","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}