OpenBB-finance/OpenBB · warning · EmptyDataError
No data was returned.
Error message
No data was returned.
What it means
EmptyDataError raised in IntrinioEtfPricePerformanceFetcher after asyncio.gather over all symbols: none of the get_one tasks appended to 'results', meaning every symbol's analytics/price-performance lookup yielded nothing (individual failures typically warn or silently skip).
Source
Thrown at openbb_platform/providers/intrinio/openbb_intrinio/models/etf_price_performance.py:210
f"Symbol Error: {analytics['messages']}" # type: ignore
+ f"for {etf.get('ticker')}" # type: ignore
)
return
# Remove the duplicate data from the analytics response.
_ = analytics.pop("messages", None) # type: ignore
_ = analytics.pop("etf", None) # type: ignore
_ = analytics.pop("date", None) # type: ignore
data.update(analytics) # type: ignore
results.append(data)
tasks = [get_one(symbol, **kwargs) for symbol in symbols]
await asyncio.gather(*tasks)
if not results:
raise EmptyDataError("No data was returned.")
# Undo any formatting changes made to the symbols before sorting.
symbols = query.symbol.replace(":US", "").split(",")
return sorted(
results,
key=(lambda item: (symbols.index(item.get("symbol", len(symbols))))),
)
@staticmethod
def transform_data(
query: IntrinioEtfPricePerformanceQueryParams,
data: list[dict],
**kwargs: Any,
) -> list[IntrinioEtfPricePerformanceData]:
"""Transform data."""
return [IntrinioEtfPricePerformanceData.model_validate(d) for d in data]
View on GitHub (pinned to 3e071fcc2c)
Solutions
- Use real ETF tickers (SPY, QQQ) — verify with obb.etf.search(provider='intrinio', query='...')
- Try a subset of symbols to isolate which ones are the problem, since partial failures only warn
- Catch EmptyDataError and fall back to computing performance from obb.etf.historical prices
Example fix
# before res = obb.etf.price_performance(provider="intrinio", symbol="SPX") # after res = obb.etf.price_performance(provider="intrinio", symbol="SPY")
Defensive patterns
Strategy: fallback
Validate before calling
def etf_symbols_have_analytics(symbols: list[str]) -> bool:
return bool(symbols) and all(s.upper().replace(":US", "").isalpha() for s in symbols) Type guard
from openbb_core.provider.utils.errors import EmptyDataError
Try / catch
from openbb_core.provider.utils.errors import EmptyDataError
try:
perf = await obb.etf.price_performance(provider="intrinio", symbol=sym)
except EmptyDataError:
# compute performance from historical prices instead
hist = await obb.etf.historical(provider="intrinio", symbol=sym)
perf = compute_performance(hist.to_df()) Prevention
- Reserve this endpoint for known ETFs with analytics coverage
- Keep a price-based performance fallback for uncovered tickers
- Batch-test symbols; partial failures warn while only total failure raises
When it happens
Trigger: Calling etf.price_performance(provider='intrinio', symbol=...) where every requested symbol is invalid, not an ETF, or lacks analytics data on Intrinio. Symbols are normalized (':US' handling appears nearby), so malformed input can also end up querying an unrecognizable identifier.
Common situations: Passing indices or non-ETF tickers (e.g. 'SPX'); tickers missing from Intrinio's analytics universe; batch pipelines with outdated ETF lists where every entry fails.
Related errors
- No holdings were found for {query.symbol}, and the response
- No data was returned.
- No data found.
- No data was found in the DataFrame.
- No data found for the given symbols.
AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14).
Data as JSON: /api/errors/5de70bc7e4d9dfa2.
Report an issue: GitHub.