{"record":{"id":"8a80f8a00f25c317","repo":"HKUDS/Vibe-Trading","slug":"asset-correlation-must-be-in-0-0-1-0-got-asse","errorCode":null,"errorMessage":"asset_correlation must be in [0.0, 1.0), got {asset_correlation}","messagePattern":"asset_correlation must be in \\[0\\.0, 1\\.0\\), got (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/credit.py","lineNumber":938,"sourceCode":"            * ``unexpected_loss`` (float): Economic capital / Credit VaR (WCL - EL).\n            * ``capital_ratio`` (float): Capital required as decimal fraction of EAD.\n\n    Raises:\n        ValueError: If parameters violate domain constraints.\n    \"\"\"\n    ead = _require_finite(ead, \"ead\")\n    pd = _require_finite(pd, \"pd\")\n    lgd = _require_finite(lgd, \"lgd\")\n    asset_correlation = _require_finite(asset_correlation, \"asset_correlation\")\n    confidence = _require_finite(confidence, \"confidence\")\n    if ead <= 0.0:\n        raise ValueError(f\"ead must be strictly positive, got {ead}\")\n    if not (0.0 < pd < 1.0):\n        raise ValueError(f\"pd must be in (0.0, 1.0), got {pd}\")\n    if not (0.0 <= lgd <= 1.0):\n        raise ValueError(f\"lgd must be in [0.0, 1.0], got {lgd}\")\n    if not (0.0 <= asset_correlation < 1.0):\n        raise ValueError(f\"asset_correlation must be in [0.0, 1.0), got {asset_correlation}\")\n    if not (0.0 < confidence < 1.0):\n        raise ValueError(f\"confidence must be in (0.0, 1.0), got {confidence}\")\n\n    rho = asset_correlation\n    inv_pd = float(norm.ppf(pd))\n    inv_conf = float(norm.ppf(confidence))\n\n    numerator = inv_pd + np.sqrt(rho) * inv_conf\n    denominator = np.sqrt(1.0 - rho)\n    wcdr = float(norm.cdf(numerator / denominator))\n\n    el = expected_loss(ead, pd, lgd)\n    wcl = float(ead * lgd * wcdr)\n    ul = float(max(0.0, wcl - el))\n    capital_ratio = float(ul / ead) if ead > 0 else 0.0\n\n    return {\n        \"expected_loss\": el,","sourceCodeStart":920,"sourceCodeEnd":956,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/credit.py#L920-L956","documentation":"vasicek_credit_var uses asset_correlation as rho in sqrt(rho) within the single-factor model, so it must be in [0.0, 1.0): 1.0 would make the portfolio a single perfectly correlated obligor and sqrt/expression degenerate; negatives are not valid correlations.","triggerScenarios":"Calling vasicek_credit_var with asset_correlation = 1.0, -0.1, or a percent like 20 instead of 0.20.","commonSituations":"Basel-style correlations often quoted in percent; hitting exactly 1.0 with rho modeled as 1 - 1/n for small n; negative correlations from mis-estimated copulas.","solutions":["Pass a decimal in [0.0, 1.0), e.g. 0.20","Cap at 0.999 if your model approaches 1","Convert percent inputs: rho = pct / 100"],"exampleFix":"# before\nvar = vasicek_credit_var(1e6, 0.02, 0.6, asset_correlation=20, confidence=0.999)\n\n# after\nvar = vasicek_credit_var(1e6, 0.02, 0.6, asset_correlation=0.20, confidence=0.999)","handlingStrategy":"validation","validationCode":"asset_correlation = min(max(asset_correlation, 0.0), 0.999)\nvar = vasicek_credit_var(ead, pd, lgd, asset_correlation, confidence)","typeGuard":"def is_valid_correlation(r: float) -> bool:\n    return isinstance(r, (int, float)) and 0.0 <= float(r) < 1.0","tryCatchPattern":"try:\n    var = vasicek_credit_var(ead, pd, lgd, rho, conf)\nexcept ValueError as e:\n    if 'asset_correlation' in str(e):\n        var = vasicek_credit_var(ead, pd, lgd, 0.20, conf)  # Basel default\n    else:\n        raise","preventionTips":["Convert Basel rho percentages to decimals","Cap correlations below 1.0 in estimation code","Validate 0 <= rho < 1 in config schemas"],"tags":["credit-var","vasicek","correlation","input-validation","python"],"backgroundTag":"argument-out-of-range","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}