QuantConnect/Lean · error · RegressionTestException
Expected at least one option contract for {}
Error message
Expected at least one option contract for {} What it means
FutureOptionWithFutureFilterRegressionAlgorithm.validate_option_chains inspects each future contract that has an option chain in the slice and asserts the chain is non-empty. An empty option chain (len(chain) == 0) for a contract that should have options raises RegressionTestException — it signals the option data is missing or the filter excluded everything.
Source
Thrown at Algorithm.Python/FutureOptionWithFutureFilterRegressionAlgorithm.py:35
### <summary>
### Regression algorithm that validates that when using a Future with filter
### the option chains are correctly populated and are unique
### </summary>
class FutureOptionWithFutureFilterRegressionAlgorithm(FutureOptionContinuousFutureRegressionAlgorithm):
def set_filter(self):
"""Set future filter for specific contracts"""
self.future.set_filter(0, 368)
def validate_option_chains(self, slice: Slice):
future_contracts_with_option_chains = 0
for future_chain in slice.future_chains.values():
for future_contract in future_chain:
# Not all future contracts have option chains, so we need to check if the contract is in the option chain
if future_contract.symbol in slice.option_chains:
chain = slice.option_chains[future_contract.symbol]
if len(chain) == 0:
raise RegressionTestException("Expected at least one option contract for {}".format(chain.symbol))
future_contracts_with_option_chains += 1
if future_contracts_with_option_chains < 1:
raise RegressionTestException("Expected at least two future contracts with option chains, but found {}".format(future_contracts_with_option_chains))View on GitHub (pinned to d2c3659f87)
Solutions
- Verify the test data set includes option chains for every future contract the filter selects.
- Tighten set_filter so it only returns futures that actually have listed options.
- If running locally, confirm the future-option data files are present and correctly keyed.
Defensive patterns
Strategy: validation
Validate before calling
def validate_option_chains(self, slice):
for future_contract in (fc for fc_chain in slice.future_chains.values() for fc in fc_chain):
chain = slice.option_chains.get(future_contract.symbol)
if chain is None:
continue # contract has no option chain — allowed
if len(chain) == 0:
self.Debug(f'Skipping empty option chain for {chain.symbol}') # tolerate instead of raising Type guard
def chain_has_contracts(chain) -> bool:
return chain is not None and len(chain) > 0 Prevention
- Constrain set_filter to futures that actually list options.
- When running locally, confirm option-chain data files exist for every selected future.
- If an empty chain is acceptable for some contracts, skip them rather than asserting non-emptiness.
When it happens
Trigger: A future_contract.symbol exists in slice.option_chains, but the corresponding OptionChain has zero contracts, so len(chain) == 0 trips the check.
Common situations: Option data for that future is missing from the data set, the future filter (set_filter 0–368 days) selected a contract with no listed options, or a data-provider/regional change dropped option chain entries.
Related errors
- We expected some FOP trading to happen
- Expected at least two future contracts with option chains, b
- Future contracts did not work up as expected: {addedSecurity
- Empty history at {Time}
- Future contracts did not work up as expected: {addedSecurity
AI-assisted analysis of QuantConnect/Lean@d2c3659f87 (2026-08-13).
Data as JSON: /api/errors/8f18c339fff9a8c4.
Report an issue: GitHub.