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
| Parameter | Use when |
|---|---|
condition | One condition, shared by every row. Map a list of companies against the same macro assumption. |
condition_field | Each 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 type | Columns |
|---|---|
binary | probability_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 |
date | the same p10 to p90 pairs, as YYYY-MM-DD strings |
categorical, thresholded | probabilities_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: Write Resolution Criteria That Hold Up, Forecast Categorical and Threshold Questions, Value a Private Company.