FutureSearch Logofuturesearch
  • Pricing
  • Research
  • Docs
  • Evals
  • Markets
  • Blog
  • Company
  • Try it for free
FutureSearch Logo

General inquiry? You can reach us at hello@futuresearch.ai.

Company

TeamCareersPressPrivacy PolicyTerms of Service

Developers

SDK DocsAPI ReferenceCase StudiesGitHubSupport

Integrations

Claude CodeCursorChatGPT CodexClaude.ai

Track Record

Trading ResultsAccuracy EvalsTournament Standings

Follow Us

X (Twitter)@dschwarz26LinkedIn
FutureSearchdocs
Frontier forecasting
Installation
  • All install methods
  • Claude.ai
  • Claude Code
  • Web App
  • Python SDK
  • Skill
Reference
  • API Key
  • forecast
  • decision
  • multi_agent
  • agent_map
  • World Modeling
  • Published Forecasts
  • MCP Server
  • Progress Monitoring
Guides
  • Turn Claude into an Accurate Forecaster
  • Forecast Outcomes for a List of Entities
  • Forecast Conditional Scenarios
  • Forecast Categorical and Threshold Questions
  • Find Profitable Prediction Market Trades
  • Research a Question with a Team of Agents
  • Add a Column via Web Research
  • Error Handling in FutureSearch: Failed Rows and Partial Results
Case Studies
  • Forecast a Decision: Grant Funding at Three Levels
  • Forecast a Decision: Which CEO Replacement Maximizes Share Price
  • Forecast a Binary Question End to End
  • Forecast a Date, Then Grade It
  • Forecast Categorical Outcomes for Two Stealth Labs
  • Forecast Conditional Scenarios for OpenAI's IPO
  • Forecast Anthropic and OpenAI IPOs: Dates and Valuations
  • Forecast a Sum-of-the-Parts SpaceX IPO Valuation
  • Forecast Founder Seed Valuations for AI Researchers
  • Find Startups Selling to Frontier AI Labs
  • Run 10,000 LLM Web Research Agents
FutureSearchby futuresearch
by futuresearch

Forecast Conditional Scenarios

A single probability often hides the interesting part. "When will the ban be lifted?" gets a wide, mushy distribution, because the answer depends almost entirely on why the ban happened in the first place. Split it by cause and each branch becomes tight and defensible.

That is what a conditional forecast does. You supply a condition, and the outcome is forecast twice: once in the world where the condition holds, once in the world where it does not. Both branches are forecast jointly, so they stay coherent with each other rather than drifting apart the way two separate runs would.

Conditional forecasting is a modifier, not a forecast type. It stacks on top of binary, numeric, date, categorical or thresholded. The forecast_type still describes the outcome; the condition describes the world it happens in.

Two ways to supply the condition

ParameterUse when
conditionOne condition, shared by every row. Map a list of companies against the same macro assumption.
condition_fieldEach row carries its own condition, in a named input column.

The two are mutually exclusive. Conditional forecasts require effort_level="HIGH", which is also the default.

See it in production

We forecast the same date under three different assumed causes, alongside the unconditional forecast:

  • Restoration date, unconditional
  • Restoration date, assuming a sincere but mistaken determination
  • Restoration date, assuming a genuine foreign access risk

The unconditional forecast is a blend of the branches. On its own it tells you less than the branches do, which is the whole argument for running the conditional version.

OpenAI post-IPO market cap, conditional on a step-change model shipping first shows the same idea on a numeric question.

Add FutureSearch to Claude Code if you haven't already:

claude mcp add futuresearch --scope project --transport http https://mcp.futuresearch.ai/mcp

State the outcome and the condition separately:

Forecast when the US restriction on this model will be lifted,
conditional on the restriction having been driven by a genuine
foreign access risk rather than a policy error.

Claude calls the forecast tool with a condition:

Tool: futuresearch_forecast
├─ data: [{"question": "When will the US restriction be lifted?"}]
├─ forecast_type: "date"
├─ output_field: "restoration_date"
├─ condition: "The restriction was driven by a genuine foreign access risk"
└─ effort_level: "HIGH"

→ Submitted: 1 row, conditional date forecast.

The output carries both branches side by side, so you can read off how much the condition moves the answer.

Add the FutureSearch connector if you haven't already. Then ask for the outcome and the condition in one sentence:

Forecast when the restriction will be lifted, conditional on it having been driven by a genuine foreign access risk.

Go to futuresearch.ai/app and phrase the request with the condition spelled out:

For each of these five labs, forecast 2027 revenue conditional on compute export controls tightening further in 2026.

pip install futuresearch
export FUTURESEARCH_API_KEY=your_key_here  # Get one at futuresearch.ai/app/api-key

One condition across a list. Every row is forecast under the same assumption:

import asyncio
import pandas as pd
from futuresearch.ops import forecast

labs = pd.DataFrame([
    {"question": "What will Lab A's 2027 revenue be, in billions USD?"},
    {"question": "What will Lab B's 2027 revenue be, in billions USD?"},
    {"question": "What will Lab C's 2027 revenue be, in billions USD?"},
])

async def main():
    result = await forecast(
        input=labs,
        forecast_type="numeric",
        output_field="revenue",
        units="billions USD",
        condition="US compute export controls tighten further during 2026",
        effort_level="HIGH",
    )
    print(result.data[[
        "question",
        "revenue_p50_given_condition",
        "revenue_p50_given_not_condition",
    ]])

asyncio.run(main())

A condition per row. Point at a column instead:

scenarios = pd.DataFrame([
    {
        "question": "When will the restriction be lifted?",
        "cause": "The restriction was a sincere but mistaken determination",
    },
    {
        "question": "When will the restriction be lifted?",
        "cause": "The restriction was driven by a genuine foreign access risk",
    },
])

result = await forecast(
    input=scenarios,
    forecast_type="date",
    output_field="restoration_date",
    condition_field="cause",
    effort_level="HIGH",
)

Reading the output

A conditional forecast replaces the normal forecast columns with a _given_condition and a _given_not_condition copy, plus one shared rationale covering both branches.

Forecast typeColumns
binaryprobability_given_condition, probability_given_not_condition
numeric{output_field}_p10_given_condition through _p90_given_condition, the matching _given_not_condition set, and a shared units
datethe same p10 to p90 pairs, as YYYY-MM-DD strings
categorical, thresholdedprobabilities_given_condition, probabilities_given_not_condition

If the two branches come back nearly identical, the condition does not actually bear on the outcome. That is a real finding, and it is worth more than a confident single number.

When to use decision() instead

Conditional forecasting answers "what happens if the world turns out this way". If the condition is something you control, such as how much to fund a project or which vendor to pick, use decision(). It forecasts the outcome under each alternative of the choice, under explicit intervention assumptions, which is a causal question rather than a correlational one.


Built with FutureSearch. See the forecast documentation for all parameters and output formats. Related guides: Forecast Categorical and Threshold Questions, Turn Claude into an Accurate Forecaster, Forecast Outcomes for a List of Entities.