Stats Methodology
How Catalysm calculates win rate, trade counts, and performance metrics.
Performance stats on the Bots page are derived from each bot's bet log — a JSONL file recording every signal and outcome.
What counts as a trade
A row is included in stats when all of the following are true:
- Mode is LIVE — paper trades and backtests are excluded.
- Side is not NO_TRADE — the bot actually picked UP or DOWN.
- Executed on-chain — when the
executedfield is present, onlyexecuted: truerows count. Older logs without this field count all qualifying LIVE trades.
This means a signal that fired but failed to fill does not inflate trade counts or distort win rate.
Win rate
win rate = wins / (wins + losses) × 100Only resolved trades (outcome: WIN or outcome: LOSS) contribute. Pending or unresolved markets are excluded.
Time periods
Period stats (24h, 7d, 30d) filter trades by timestamp relative to sync time. "All time" includes every qualifying trade in the log.
Syncing stats
Stats are generated locally by the sync script:
npm run sync:statsThis reads bet logs from the bot repositories and writes data/bot-stats.json, which the site renders on /bots.
Limitations
- Stats reflect logged data, not a live blockchain indexer.
- Bots without
executedtracking may include failed fills until their logging is updated. - Past performance does not guarantee future results.
