File size: 4,260 Bytes
9765dc7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ebcba2
9765dc7
9ebcba2
9765dc7
9ebcba2
9765dc7
9ebcba2
9765dc7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ebcba2
9765dc7
 
9ebcba2
 
 
 
 
 
 
 
9765dc7
9ebcba2
 
9765dc7
9ebcba2
 
 
 
 
9765dc7
 
 
 
8ddcd6f
9765dc7
8ddcd6f
 
 
 
 
 
 
 
9765dc7
8ddcd6f
9765dc7
8ddcd6f
9765dc7
8ddcd6f
9765dc7
8ddcd6f
9765dc7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
---
language:
  - en
license: cc-by-nc-4.0
pipeline_tag: text-generation
tags:
  - forecasting
  - calibration
  - election-forecasting
  - decision-model
---

# yarrow-forecast

**yarrow-forecast** forecasts U.S. party primary and nomination outcomes. Given a question, its resolution criteria, and the evidence available as of a stated date, one forward pass returns a calibrated probability in [0, 1].

The model does not write an answer and does not abstain. It reads the probability from the next-token distribution. There is nothing to parse. The weights run locally: 27B parameters, 256K context, no hosted API in the loop.

## Why use it

**The marginal cost is about zero.** The weights sit on your own GPU. A forward pass does not incur a per-call fee.

**One forward pass, no generated text.** Measured batch inference is 0.12–1.6 seconds per question. There is no sampling and no token-by-token decode. The probability is read from the next-token distribution.

**No third-party service.** Scoring does not depend on an outside API, a proxy, or a rate limit. The model answered every item in the evaluation.

**The weights can be trained further.** A LoRA update followed by a merge left yes/no calibration error at 0.001–0.003. On 15 other checked items, the answers were unchanged after the merge.

## Model details

| | |
|---|---|
| **Model** | yarrow-forecast |
| **Parameters** | 27B |
| **Context length** | 256K tokens |
| **Task** | P(the event resolves YES) |
| **Validated domain** | U.S. party primary and nomination elections |
| **Output** | One probability in [0, 1] |
| **Inference** | One forward pass, deterministic, 0% abstention |
| **License** | [CC BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/) |

### Input and output

| | |
|---|---|
| **Question** | The event to forecast |
| **Resolution criteria** | How a YES or NO outcome is decided |
| **Evidence** | News, polls, and other material available at prediction time |
| **As-of date** | The date the forecast is conditioned on |
| **Output** | `p` ∈ [0, 1] |

## Usage

`forecast.py` loads the weights once. Each call returns only the calibrated probability.

```python
from forecast import Forecaster

model = Forecaster("YarrowLab/yarrow-forecast")
p = model.forecast(
    title="Will candidate X win the nomination?",
    rules="Resolves YES if candidate X is declared the nominee.",
    evidence="[E1] ...",
    as_of="2026-09-05",
)
print(p)  # 0.71
```

```python
ps = model.forecast_batch([
    {"title": "...", "rules": "...", "evidence": "...", "as_of": "2026-09-05"},
    {"title": "...", "rules": "...", "evidence": "...", "as_of": "2026-09-05"},
])
```

## Evaluation

Validated domain: U.S. party primary and nomination questions with settled outcomes. Same questions, same evidence, same outcomes. Each model answered in its own setup. yarrow-forecast answered all 150.

| Model | Brier ↓ | AUC ↑ | Directional accuracy | Answered |
|---|---:|---:|---:|---:|
| **yarrow-forecast** | **0.175** | **0.81** | **76.0%** | **150** |
| Claude Sonnet 4.6 | 0.171 | 0.84 | 70.1% | 117 |
| GPT-5.5 | 0.185 | 0.87 | 65.5% | 148 |
| Historical base rate | 0.239 | 0.51 | 62.7% | 150 |
| GPT-5.4-mini | 0.242 | 0.51 | 62.4% | 149 |
| OpenForecaster-8B | 0.265 | 0.72 | 61.3% | 93 |

Directional accuracy on the full set is **76.0%**, above Claude Sonnet 4.6 (70.1%) and GPT-5.5 (65.5%). Brier is **0.175**, below GPT-5.5 (0.185), GPT-5.4-mini (0.242), and OpenForecaster-8B (0.265), and about 24% lower than the historical base rate (0.239). Across five out-of-sample fold splits the Brier stays in **0.175–0.185** and directional accuracy in **72.7–76.0%**. Abstention is 0%.

Claude Sonnet 4.6 scores 0.171 Brier on the 117 questions it returned. OpenForecaster-8B's 93 questions are the ones it returned. Unanswered items were left unanswered.

A later set of 166 settled questions from the same category scores **0.1653** Brier (95% interval 0.136–0.200, clustered by election night).

With the question and the resolution rule alone, AUC is about 0.51. With the evidence supplied, AUC is **0.808**.

## License

[CC BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/). Attribution is required. Commercial use is not permitted.