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

  1. Use real ETF tickers (SPY, QQQ) — verify with obb.etf.search(provider='intrinio', query='...')
  2. Try a subset of symbols to isolate which ones are the problem, since partial failures only warn
  3. 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

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


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/5de70bc7e4d9dfa2. Report an issue: GitHub.