Methodology
Backtests & event studies
Point in time (no lookahead, no leakage)
- Event time vs knowledge time. Theses count from when they were posted; market data from its timestamp. A snapshot at T uses only theses with
posted_at ≤ Tand market points withts ≤ T. - Author history as of T. Early Quality and author metrics at T use only calls whose outcome had resolved by T (72h after posting).
- Cohorts as of T. Algorithmic cohort membership comes from the daily snapshot taken on or before T — never today's membership.
- Immutable history. Score snapshots are stored and never rewritten; editing a profile or handle today cannot change a historical score.
Events, entry and exit
- Event — the rule set matches a token's snapshot at T, and it is the token's first match or at least one
cooldownafter its previous event. The default cooldown equals the horizon, so samples do not overlap. - Entry — the first price at or after T, within 15 minutes. Never a price before the event.
- Exit — the last price at or before T + horizon. Maximum return, maximum drawdown and time to peak are measured over (entry, exit].
- Unresolved — events whose horizon ends after now are counted and reported, but excluded from statistics.
- Horizons — 15m · 1h · 6h · 24h · 3d · 7d, depending on the history available.
Dead tokens (survivorship)
Tokens that die (no price, or liquidity near zero for about a day) stay in every historical query. You choose how a death inside the horizon is valued:
| Policy | Return used |
|---|---|
last_price (default) | Return to the last observed price. |
total_loss | −100%. |
exclude | Removed from the statistics — but counted and flagged in the warnings, so the exclusion is never silent. |
Statistics
- N resolved events, unique tokens, dead-token events and unresolved events.
- Hit rate (share with a positive return at the horizon) with a 95% Wilson interval.
- Median return with a bootstrap 95% interval (deterministic seed), 10% trimmed mean and mean.
- Median max drawdown, median time to peak, best and worst outcome.
- Distributions of returns and drawdowns: histogram, box plot and p5 … p95.
- Every event, with its entry, exit, return, drawdown and the rule-field values at T.
Warnings & confidence
| Warning | When |
|---|---|
| Small sample | N < 30 |
| Concentrated | ≥ 50% of events come from ≤ 3 tokens |
| Short history | The data range is shorter than 7 days |
| Capped events | More than 2,000 events (the oldest are dropped from the event list) |
Confidence: N < 10 INSUFFICIENT, < 30 LOW, < 100 MEDIUM, otherwise HIGH. A “90% hit rate” from 10 samples is shown as exactly that — with its interval and the warning.
Leakage checks
Every result carries leakage_checks — assertions evaluated on the actual events, each with a pass flag and detail:
- every feature snapshot used has a timestamp ≤ the event time;
- every entry is at or after the event time;
- no price before the entry is used for returns;
- the feature vector's own timestamp is ≤ the event time.
Event studies
Pre-defined questions refreshed hourly over point-in-time history, with per-horizon return and drawdown distributions. They use a 1-day cooldown per token. Event studies are available on every plan; custom backtests need Pro or Team.
| Study | Event |
|---|---|
What happens after thesis velocity triples?velocity-3x | Thesis velocity > 3× baselineThesis velocity 1h > +200% AND Theses 1h ≥ 3 · horizons 1h, 6h, 24h, 3d |
What happens after 5 high-quality authors converge?hq-authors-converge | 5+ high-quality authors in 24hHigh-quality authors ≥ 5 · horizons 1h, 6h, 24h, 3d |
What happens when social activity rises but price does not?social-up-price-flat | Social rising, price flatDivergence ≥ +25 AND Price change 1h ≤ +2% AND Price change 1h ≥ -2% · horizons 1h, 6h, 24h, 3d |
What happens when a few accounts dominate the attention?crowding-spike | Crowding above 75Crowding > 75 AND Theses 24h ≥ 10 · horizons 1h, 6h, 24h, 3d |
What happens when attention gets broad?broad-attention | 40+ unique authors in 24hUnique authors 24h ≥ 40 · horizons 1h, 6h, 24h, 3d |
What happens after thesis activity drops more than 60% hour-on-hour?cooling | Attention cooling sharplyAttention acceleration < -60% AND Theses 24h ≥ 10 · horizons 1h, 6h, 24h, 3d |
Browse results in Event studies or run your own in Backtests.
Endpoints
Example responses use illustrative values ($XYZ, example_rhea, a placeholder address) — not real tokens or authors; every field name and shape is exactly what the API returns. Long sections are collapsed as { … }.
/v1/quant/backtestsQueue a strict point-in-time backtest (Pro / Team).
Returns 202 with a queued run and a Location header; poll GET /v1/quant/backtests/{id} or use the SDK's backtests.wait. Without a plan that includes backtests the API answers 402 PLAN_REQUIRED.
Parameters
| Name | Description |
|---|---|
rulesrequiredbody · { field, op, value }[] 1–12 | Entry conditions (AND). |
horizonrequiredbody · 15m | 1h | 6h | 24h | 3d | 7d | Holding horizon. |
namebody · string ≤ 80 | Label for the run. |
frombody · ISO-8601 | unix | Start of the test window (default: all history). |
tobody · ISO-8601 | unix | End of the test window. |
cooldownbody · horizon | Minimum spacing between two events of the same token. Default = horizon (non-overlapping samples). |
dead_token_policybody · last_price | total_loss | exclude | How tokens that died inside the horizon are valued. Dead tokens are always included unless excluded explicitly (then counted and warned).Default last_price |
universebody · { chains?, min_liquidity_usd? } | Restrict the universe. |
rulesbody · { field, op, value }[] 1–12requiredEntry conditions (AND).horizonbody · 15m | 1h | 6h | 24h | 3d | 7drequiredHolding horizon.namebody · string ≤ 80Label for the run.frombody · ISO-8601 | unixStart of the test window (default: all history).tobody · ISO-8601 | unixEnd of the test window.cooldownbody · horizonMinimum spacing between two events of the same token. Default = horizon (non-overlapping samples).dead_token_policybody · last_price | total_loss | excludeHow tokens that died inside the horizon are valued. Dead tokens are always included unless excluded explicitly (then counted and warned).Defaultlast_priceuniversebody · { chains?, min_liquidity_usd? }Restrict the universe.
curl -X POST "https://fomoquant.app/v1/quant/backtests" \
-H "Authorization: Bearer $FOMOQUANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"rules":[{"field":"momentum","op":">","value":80},{"field":"early_quality","op":">","value":70},{"field":"crowding","op":"<","value":30}],"horizon":"24h"}'/v1/quant/backtests/{id}A backtest run — poll until status is done or failed.
Result: N, hit rate (+ Wilson CI), median, mean and 10% trimmed mean return, median max drawdown, median time to peak, best/worst, return and drawdown distributions, warnings, every event and the leakage checks.
Parameters
| Name | Description |
|---|---|
idrequiredpath · btr_… | Backtest run id. |
idpath · btr_…requiredBacktest run id.
curl "https://fomoquant.app/v1/quant/backtests/btr_6b5n0h3k8m2q9x4v7c1d" \
-H "Authorization: Bearer $FOMOQUANT_API_KEY"/v1/quant/event-studiesEvent studies refreshed hourly over point-in-time history.
curl "https://fomoquant.app/v1/quant/event-studies" \
-H "Authorization: Bearer $FOMOQUANT_API_KEY"/v1/quant/event-studies/{slug}One event study with per-horizon distributions.
Parameters
| Name | Description |
|---|---|
slugrequiredpath · slug | velocity-3x, hq-authors-converge, social-up-price-flat, crowding-spike, broad-attention or cooling. |
slugpath · slugrequiredvelocity-3x, hq-authors-converge, social-up-price-flat, crowding-spike, broad-attention or cooling.
curl "https://fomoquant.app/v1/quant/event-studies/velocity-3x" \
-H "Authorization: Bearer $FOMOQUANT_API_KEY"FomoQuant provides analytics and historical/statistical context, not financial advice or guaranteed predictions.