{"record":{"id":"f286959e2641f462","repo":"HKUDS/Vibe-Trading","slug":"btc-usdt-is-single-asset-cross-sectional-ic-needs","errorCode":null,"errorMessage":"btc-usdt is single-asset; cross-sectional IC needs >=2 instruments. Use a multi-symbol crypto basket (e.g. multiple OKX pairs) for meaningful results.","messagePattern":"btc-usdt is single-asset; cross-sectional IC needs >=2 instruments\\. Use a multi-symbol crypto basket \\(e\\.g\\. multiple OKX pairs\\) for meaningful results\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/tools/alpha_bench_tool.py","lineNumber":155,"sourceCode":"    elif universe == \"sp500\":\n        panel = _load_sp500_panel(start, end)\n    elif universe == \"btc-usdt\":\n        panel = _load_btc_panel(start, end)\n    else:  # pragma: no cover — guarded above\n        raise ValueError(f\"unhandled universe {universe!r}\")\n\n    if not panel or \"close\" not in panel or panel[\"close\"].empty:\n        raise RuntimeError(\n            f\"universe {universe!r} produced empty panel for {start}..{end}; \"\n            \"check network / token / date range\"\n        )\n\n    # btc-usdt loader returns a single-column close (one instrument). Cross-\n    # sectional IC needs >= 2 instruments — short-circuit with a clean error\n    # that propagates to API (400) and CLI.\n    close_df = panel[\"close\"]\n    if universe == \"btc-usdt\" and close_df.shape[1] < 2:\n        raise ValueError(\n            \"btc-usdt is single-asset; cross-sectional IC needs >=2 instruments. \"\n            \"Use a multi-symbol crypto basket (e.g. multiple OKX pairs) for \"\n            \"meaningful results.\"\n        )\n\n    if use_cache:\n        _write_pickle_cache(cache_dir, cache_path, panel)\n\n    return panel\n\n\ndef _sha256_path(cache_path: Path) -> Path:\n    return cache_path.with_suffix(cache_path.suffix + \".sha256\")\n\n\ndef _cache_hmac_key(cache_dir: Path) -> bytes:\n    \"\"\"Return the secret backing the cache sidecar HMAC.\n","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/tools/alpha_bench_tool.py#L137-L173","documentation":"The btc-usdt loader yields a single instrument, but cross-sectional IC requires at least two. The tool short-circuits with this clean ValueError (surfacing as API 400 / CLI error) rather than computing a meaningless single-name IC.","triggerScenarios":"Calling run_alpha_bench / run_bench with universe='btc-usdt' (whose close frame has exactly 1 column).","commonSituations":"Users testing the bench with the simplest crypto symbol available; assuming a single asset can produce rank-IC statistics.","solutions":["Use a multi-symbol basket universe instead of the single-asset btc-usdt","Register or request a multi-pair crypto universe (e.g. several OKX pairs)","If single-asset analysis is the goal, use a time-series metric tool rather than the cross-sectional bench"],"exampleFix":"// before\nrun_alpha_bench(universe='btc-usdt', period='2023')\n// after\nrun_alpha_bench(universe='<multi-symbol-basket>', period='2023')","handlingStrategy":"validation","validationCode":"if universe == 'btc-usdt':\n    raise SystemExit('btc-usdt is single-asset; choose a multi-symbol universe')","typeGuard":"def supports_cross_sectional(u: str) -> bool:\n    return u != 'btc-usdt'","tryCatchPattern":null,"preventionTips":["Reserve single assets for time-series tools","Document that the bench is cross-sectional by construction"],"tags":["validation","crypto","alpha-bench"],"backgroundTag":"insufficient-data-for-computation","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}