HKUDS/Vibe-Trading · error · ValueError
no close prices returned for any requested symbol
Error message
no close prices returned for any requested symbol
What it means
Raised by PortfolioRiskTool._closes_frame after shaping the market-data fetch envelope: if not a single requested symbol produced a close-price series, an empty frame would make downstream risk math meaningless, so it aborts. This means the fetch returned bars for none of the symbols (or the payload had no usable close/date fields for any of them).
Solutions
- Verify each requested symbol is a valid, currently listed ticker
- Inspect the raw fetch envelope to confirm the loader actually returned bars (check for auth/entitlement errors surfacing as empty data)
- Test with a single well-known symbol like AAPL to isolate basket-wide vs symbol-specific issues
- If the envelope shape changed, update _closes_frame's shaping logic to match the new schema
Defensive patterns
Strategy: try-catch
Try / catch
try:
frame = tool._closes_frame(raw_payload, symbols)
except ValueError as e:
if "no close prices" in str(e):
raise RuntimeError(f"market data unavailable for {symbols}; check tickers/API access") from e Prevention
- Validate tickers exist (e.g. via a symbol lookup endpoint) before requesting the full basket
- Log the raw fetch envelope on empty results to distinguish bad symbols from API/auth failures
- Request a small canary basket first to verify data availability
When it happens
Trigger: Requesting a basket where every symbol ticker is invalid/delisted/renamed; the upstream market-data API returning an envelope with empty or missing 'bars'/'prices' arrays for all symbols; a payload schema change so the close-price extraction finds nothing.
Common situations: Typo'd or delisted tickers across the whole basket; API key or entitlement issues causing the loader to return empty results instead of an error; upstream API version changes altering the response envelope shape.
Understand the failure class
Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.
Related errors
- feed must be 'iex' or 'sip'
- instrument type catalog returned no rows
- market exposes no CLOB outcome tokens
- start_date must be before end_date
- symbols must be a non-empty list of strings
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/f9c30702f54ad64b.
Report an issue: GitHub.
Appendix: source
Thrown at agent/src/tools/portfolio_risk_tool.py:193
if not isinstance(record, Mapping) or "close" not in record:
continue
when = next((record[k] for k in _DATE_KEYS if k in record), None)
try:
price = float(record["close"])
except (TypeError, ValueError):
continue
times.append(when)
prices.append(price)
if not prices:
continue
# Mixed typed/untyped timestamps can't be sorted together; when any
# bar lacks a date, trust loader order (chronological) instead.
if any(when is None for when in times):
series[sym] = pd.Series(prices, name=sym)
else:
series[sym] = pd.Series(prices, index=times, name=sym).sort_index()
if not series:
raise ValueError("no close prices returned for any requested symbol")
return pd.DataFrame(series)
View on GitHub (pinned to 80ffdda44c)