How forecasts are calculated and checked

Method and data

This page explains where the forecasts come from, which data the process uses, and which checks keep the score honest. When something fails, we show it instead of filling the gap.

Closed candles onlyNo model inside the webPublic price every 10 sUTC timestamped snapshots

Data path

01Binanceclosed 4h and 1d candles
02Pythonfeatures, models and calibration
03JSONversioned snapshot with UTC time
04Next.jsstatic render, no model inside
05Browserlive price only while tab is visible

The site does not run the model or touch parquet. If the process fails, you see the last snapshot with its timestamp and expiry; the client does not fill anything in by itself.

3 yrs
of history per asset
547
out-of-sample test days
23
features per bar (max)
2,000
bootstrap resamples
0.24%
friction in simulation
30 min
update cadence

Method parts

Data

Binance spot OHLCV via CCXT. The in-progress candle is never used. Every run checks duplicates and gaps before computing; if data fails the checks, no new snapshot is published.

BTC/USDT · ETH/USDT · XRP/USDT · incremental parquet

Features

Returns over 1-12 bars, RSI, ATR, realized volatility, distance to the 20/50/200 EMAs, volume z-score, position in the 20-bar channel, UTC calendar, and BTC returns as context for ETH and XRP. No imputation: warm-up rows are dropped.

23 features · + funding rate & taker flow (v2) · available at t, never t+1

Models

LightGBM and logistic regression are compared with five baselines: persistence, reversion, momentum, base rate and chance. A model only counts if it clears the best baseline.

LGBM: 31 leaves · lr 0.05 · early stopping · fixed seed

Calibration

Raw probabilities are adjusted with isotonic regression on a reserved train segment. A published 60% should be read literally: across similar cases, we expect it to happen about 6 times out of 10.

isotonic on final 20% of train · ECE tracked

Walk-forward evaluation

Train on 12+ months, predict the next month, roll forward and repeat. Each of the 547 test days was calculated using strictly prior data, with a purge between train and test. The hit rate compares the probability's implied direction with the period's actual close; we also publish accuracy on the confident subset (p ≥ 55% or ≤ 45%), which is what the pre-registered test tracks. On the home page, public conviction is low inside 45-55%, medium at 55-60% or 40-45%, and high at p ≥ 60% or ≤ 40%.

train ≥ 12m → test 1m → roll · purge = horizon · conviction 45/55 and 40/60

Anti-cheating controls

Three tests run inside the harness itself: shifting targets must sink accuracy to ~50%; adding new candles cannot change the past; and a synthetic series with a known pattern must be flagged viable. If any check fails, publication waits.

shift-test · immutability · positive control

Statistics

Consecutive days are not independent: intervals and p-values use block bootstrap. Success criteria were written before looking at results.

blocks n^⅓ · 2,000 resamples · pre-registered criteria

Economic simulation

The simulation applies a fixed rule defined before looking at results and subtracts fees and slippage. It is used only to measure whether a forecast would have survived real frictions.

fixed rule · 0.24% friction · historical evaluation only

Support & resistance

2-2 fractals on two timeframes (90 days of 4h + 1 year of daily), clustered by ATR distance and weighted by touches and recency. The dashboard reclassifies them against the live price: if price moves through a zone, its reading changes.

cluster 0.2·ATR · strength = touches × 0.97^days × TF weight

Operations

The local process can re-run every 30 minutes: new candles, forecast, levels and verification. Publication stays an explicit step, separated from data refresh.

launchd 30 min · export · verify · publish gate

Change discipline

Any change that affects data, features, models, calibration, ranges, thresholds, cadence or evaluation must update this page in the same deployment. If this page does not describe the active process, the deployment is not considered closed.

How reliability can improve

  • Freshness guard: block publication when the snapshot lags the expected latest closed candle or a critical parquet is missing.
  • Exchange cross-check: compare Binance close against Kraken before publication and mark degradation when divergence clears the documented threshold.
  • Calibrated ranges: evaluate coverage and sharpness against an ATR baseline; improve expected volatility before claiming more directional skill.
  • Drift monitor: track Brier, ECE and recent feature distributions; when they move out of band, publish degraded mode.
  • Change ledger: each pipeline version keeps a code hash, features version, deployment date and public summary of the change.

The scoreboard, today

Three rounds run so far (technicals; + calendar; + derivatives: funding and taker flow): overall accuracy still sits around 50% and no cell clears the pre-registered criteria. One lead is under validation: when the model is confident (p ≥ 60%), ETH/XRP accuracy has run 54–59% on small samples. It is being validated with a pre-registered 90-day test — same judge, no moving goalposts.