OpenBB-finance/OpenBB · warning · OpenBBError

No strategies found for the given parameters.

Error message

No strategies found for the given parameters.

What it means

Raised by OptionsChainsData.strategies() after it builds and concatenates the straddle, strangle, synthetic long/short, call spread and put spread DataFrames for the requested expirations - if the concatenated result is empty, none of the strategy builders produced a single row for the given parameters. It is an aggregate 'nothing matched' error, meaning the input filters (or data quality) excluded every strategy.

Source

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

                            [_synthetic_shorts, _synthetic_short]
                        )

            if not _synthetic_shorts.empty:
                synthetic_shorts_df = concat([synthetic_shorts_df, _synthetic_shorts])

        strategies = concat(
            [
                straddles,
                strangles,
                synthetic_longs_df,
                synthetic_shorts_df,
                call_spreads,
                put_spreads,
            ]
        )

        if strategies.empty:
            raise OpenBBError("No strategies found for the given parameters.")

        strategies = strategies.reset_index().rename(columns={"index": "Strategy"})
        strategies = (
            strategies.set_index(["Expiration", "DTE"])
            .sort_index()
            .drop(columns=["Symbol"])
        )
        return strategies.reset_index()

    def skew(
        self,
        date: str | int | None = None,
        moneyness: float | None = None,
        underlying_price: float | None = None,
    ) -> "DataFrame":
        """Return skewness of the options, either vertical or horizontal.

        The vertical skew for each expiry and option is calculated by subtracting the IV of the ATM call or put.

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Relax the filters: widen the moneyness range, extend dte_min/dte_max, disable oi/volume filters.
  2. Confirm the underlying chain is usable first: chains.dataframe has both calls and puts with non-empty bid/ask for several expirations.
  3. Retry during market hours or with a provider that returns fuller chains.
  4. If you need partial results, call the individual builders (straddle(), strangle(), ...) and skip failing ones.

Example fix

# before
res = chains.strategies(dte_min=25, dte_max=35, min_moneyness=98, max_moneyness=102, oi=True)

# after
res = chains.strategies(dte_min=25, dte_max=35)  # relax moneyness and oi filters
Defensive patterns

Strategy: try-catch

Validate before calling

df = chains.dataframe
calls = df[df.option_type == 'call']
puts = df[df.option_type == 'put']
if calls.empty or puts.empty or not (df.get('bid') is not None or df.get('ask') is not None or 'last_price' in df.columns):
    raise ValueError('chains cannot support strategies()')

Try / catch

try:
    res = chains.strategies(**params)
except OpenBBError as e:
    if 'No strategies found' in str(e):
        params.pop('min_moneyness', None); params.pop('max_moneyness', None)
        params.pop('oi', None); params.pop('volume', None)
        res = chains.strategies(**params)

Prevention

When it happens

Trigger: Calling chains.strategies(...) where every per-expiration strategy build returned empty - e.g. moneyness/strike filters outside the listed range, no usable bid/ask premiums anywhere, or an empty/one-sided chain loaded from the provider.

Common situations: Passing a min_moneyness/max_moneyness or dte window that excludes all rows; loading a symbol with an expired or nearly empty chain; weekend/holiday snapshots where volume/oi filters (volume=True, oi=True) remove everything.

Related errors


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