OpenBB-finance/OpenBB · error · OpenBBError

Error: Not enough information to complete the operation. Lik

Error message

Error: Not enough information to complete the operation. Likely due to zero values in the IV field.

What it means

Raised by OptionsChainsData.skew() in the by-strike mode (moneyness=None): after iterating expirations and appending per-expiration call and put frames with 'ATM IV' and 'Skew' columns, either call_skew or put_skew is empty. Unlike the date mode, this branch computes skew across strikes for each expiration and needs both sides populated.

Source

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

            atm_put_strike = self._get_nearest_strike(
                "put", day, force_otm=False
            )  # noqa:F841
            _puts = puts[puts["dte"] == day][
                ["expiration", "option_type", "strike", "implied_volatility"]
            ]

            if len(_puts) > 0:
                put = _puts.set_index("expiration").copy()  # type: ignore
                put_atm_iv = put.query("`strike` == @atm_put_strike")[
                    "implied_volatility"
                ]
                if len(put_atm_iv) > 0:
                    put["ATM IV"] = put_atm_iv.iloc[0]
                    put["Skew"] = put["implied_volatility"] - put["ATM IV"]
                    put_skew = concat([put_skew, put])
        if call_skew.empty or put_skew.empty:
            raise OpenBBError(
                "Error: Not enough information to complete the operation. Likely due to zero values in the IV field."
            )
        call_skew = call_skew.set_index(["strike", "option_type"], append=True)
        put_skew = put_skew.set_index(["strike", "option_type"], append=True)
        skew_df = concat([call_skew, put_skew]).sort_index().reset_index()
        cols = ["Expiration", "Strike", "Option Type", "IV", "ATM IV", "Skew"]
        skew_df.columns = cols
        skew_df["Expiration"] = skew_df["Expiration"].astype(str)

        return skew_df

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Check per-side IV coverage: df.groupby('option_type').implied_volatility.apply(lambda s: (s > 0).sum()).
  2. Switch to a provider/date with two-sided IV surfaces.
  3. Populate or repair zero IVs before calling (e.g. recompute from option prices) if you own the data pipeline.
  4. As a diagnostic, run skew(moneyness=..., date=...) mode which surfaces which side is missing via the sibling error.

Example fix

# before
skew_df = chains.skew()  # all put IV zero -> put_skew empty

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

Strategy: validation

Validate before calling

df = chains.dataframe
pos_iv = df[df.implied_volatility > 0]
assert (pos_iv.option_type == 'call').any(), 'no call IV'
assert (pos_iv.option_type == 'put').any(), 'no put IV'

Type guard

def two_sided_iv(df) -> bool:
    pos = df[df.implied_volatility > 0]
    return set(pos.option_type) >= {'call', 'put'}

Try / catch

try:
    chains.skew()
except OpenBBError as e:
    if 'Not enough information' in str(e):
        chains.skew(moneyness=95, date=30)  # fall back to moneyness-date mode for diagnosis

Prevention

When it happens

Trigger: Calling chains.skew() (default strike-mode) where no expiration produced both a call frame and put frame with valid IV - e.g. all put IVs are zero so put_skew never gets appended (the append only happens when len(put_atm_iv) > 0).

Common situations: Providers with one-sided IV coverage (puts quoted, calls IV=0, or vice versa); symbols with very few listed expirations where the single expiration lacks ATM IV; IV columns containing NaN cast to 0 upstream.

Related errors


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