OpenBB-finance/OpenBB · error · OpenBBError

Error: 'implied_volatility' field not found.

Error message

Error: 'implied_volatility' field not found.

What it means

Raised by OptionsChainsData.skew() when the has_iv property reports that no implied_volatility field exists anywhere in the chains data. Skew is computed from the IV surface, so chains without IV cannot be processed. has_iv checks for an implied_volatility column with usable values.

Source

Thrown at openbb_platform/core/openbb_core/provider/utils/options_chains_properties.py:1668

            The expiration date, or days until expiry, to use. Enter -1 for all expirations.
            Large chains (SPY, SPX, etc.) may take a few seconds to process when using -1.
        moneyness: float
            The moneyness to target for calculating horizontal skew.
        underlying_price: Optional[float]
            Only supply this is if the underlying price is not a returned field.

        Returns
        --------
        DataFrame
            Pandas DataFrame with the results.
        """
        # pylint: disable=import-outside-toplevel
        from pandas import DataFrame, concat

        data = self.dataframe
        expiration: str = ""
        if self.has_iv is False:
            raise OpenBBError("Error: 'implied_volatility' field not found.")

        data = DataFrame(data[data.implied_volatility > 0])  # type: ignore
        call_price_col = self._identify_price_col(data, "call", "ask")
        put_price_col = self._identify_price_col(data, "put", "ask")

        if not hasattr(data, "underlying_price") and underlying_price is None:
            raise OpenBBError(
                "Error: underlying_price must be provided if underlying_price is not available"
            )

        if moneyness is not None and date is None:
            date = -1

        if moneyness is None and date is None:
            date = 30
            moneyness = 20

        if date is None:

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Switch to a provider that supplies implied_volatility (e.g. cboe, deribit) for the symbol.
  2. Verify before calling: 'implied_volatility' in chains.dataframe.columns and chains.dataframe.implied_volatility.notna().any().
  3. If you have your own IV model, populate the column first: df['implied_volatility'] = computed_iv.
  4. For historical analysis, choose a provider/date combination with EOD IV data.

Example fix

# before
skew_df = chains.skew()  # provider has no IV

# after
data = obb.derivatives.options.chains('SPY', provider='cboe')
chains = data.to_chains()
skew_df = chains.skew()
Defensive patterns

Strategy: type-guard

Validate before calling

if not chains.has_iv:
    raise ValueError('provider returned no implied_volatility; switch provider')

Type guard

def has_iv(chains) -> bool:
    return chains.has_iv  # True only when an implied_volatility column with usable values exists

Prevention

When it happens

Trigger: Calling chains.skew() on chains loaded from a provider that does not return implied_volatility (e.g. basic/quote-only providers), or after stripping the column via custom DataFrame manipulation.

Common situations: Using yfinance or thin crypto providers that omit IV; requesting historical dates for which IV was not computed; mixing manually built DataFrames into OptionsChainsData.

Related errors


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