Generated by python -m evals.harness on the deterministic synthetic market (no API keys, no model downloads). The market embeds a known sentiment -> next-day-return signal, so these numbers have ground truth.
Config: lexical sentiment, synthetic data, 12 assets x 756 days, 8347 headlines, 10 bps cost/turn. Smoothing search grid [1, 2, 3, 5, 8, 13, 21] -> selected window 8.
| Metric | Value | Reads as |
|---|---|---|
| Sentiment recovery corr | 0.840 | lexical model vs. latent truth |
| Information coefficient (rank IC) | 0.052 | signal vs. next-day return |
| Annualised return | 13.60% | net of costs |
| Annualised volatility | 7.05% | |
| Sharpe (annualised) | 1.93 | in-sample, selected config |
| Sortino | 2.03 | |
| Max drawdown | -8.21% | |
| Walk-forward OOS Sharpe | 2.10 | purged + embargoed |
| Metric | Value | Reads as |
|---|---|---|
| Probabilistic Sharpe (PSR) | 1.000 | P(true Sharpe > 0) |
| Deflated Sharpe (DSR) | 0.997 | PSR vs. expected max of 7 trials |
| Min track-record length | 185 days | to confirm at 95% |
Across 3391 high-conviction news events, the positive-minus-negative cumulative abnormal return at +5 days is +0.0130 with t = 8.45.
| Metric | Real signal | Scrambled (null) |
|---|---|---|
| Sharpe (annualised) | 1.93 | -1.42 |
| Deflated Sharpe | 0.997 | 0.000 |
The Deflated Sharpe collapses on the scrambled signal: the same search that produced a 'winner' is correctly recognised as luck once the real alpha is removed. That gap is the whole point.