{"record":{"id":"c603eff23cd44424","repo":"HKUDS/Vibe-Trading","slug":"breaches-needs-at-least-2-observations-to-hold-a-t","errorCode":null,"errorMessage":"breaches needs at least 2 observations to hold a transition, got {flags.size}","messagePattern":"breaches needs at least 2 observations to hold a transition, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/var_backtest.py","lineNumber":432,"sourceCode":"\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\n    pi = (n01 + n11) / total if total else 0.0\n","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/var_backtest.py#L414-L450","documentation":"The Christoffersen independence test is based on lag-1 transitions between consecutive breach flags, which requires at least two observations to form even one transition. With zero or one flag there is nothing to test, so the function refuses to compute.","triggerScenarios":"Calling christoffersen_independence([]) or christoffersen_independence([1]), or calling var_backtest on a returns/var pair that aligns to fewer than two finite observations (var_backtest has its own guard, but direct calls hit this one).","commonSituations":"Backtesting a brand-new strategy with a single day of data, or filtering a series down (dropping NaNs, date slicing) until fewer than two points remain before calling the test.","solutions":["Provide at least two breach observations; for a meaningful test use hundreds.","Check the length of your aligned, finite returns/VaR series before testing.","If data is genuinely short-cadence, skip independence testing and report only Kupiec POF."],"exampleFix":"# before\nchristoffersen_independence(breaches[:1])\n# after\nchristoffersen_independence(breaches)  # len(breaches) >= 2","handlingStrategy":"validation","validationCode":"if len(breaches) < 2:\n    raise ValueError('need >= 2 breach observations')\nchristoffersen_independence(breaches, significance=0.05)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check series length after any NaN filtering or date slicing.","Short samples: report only Kupiec POF."],"tags":["python","validation","insufficient-data","statistics"],"backgroundTag":"insufficient-sample-size","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}