About
A battery trader that shows its working.
Great Britain prices electricity in 48 half-hour blocks a day. Prices crash overnight when the wind blows and spike at 6pm when everyone gets home. A grid battery profits from that gap, but only if it buys and sells at the right moments.
Tempo makes that call every half hour, explains each one, and lets anyone check the timing afterwards.
48 prices a day
Every half-hour settles at its own price, sometimes below zero.
2 MWh · 1 MW · 90%
Real limits: capacity, power, and about 10% lost on every round trip.
Hold is a decision
When the spread doesn't cover the losses, Tempo waits and says why.
Built to be checked
No look-ahead, honest baselines, and every decision can be replayed.
Three jobs, every half hour
Forecast
Predict the next 24 hours of prices as a range, not a single guess.
Decide
Charge, sell or hold, only when the spread beats the losses. Every choice comes with a reason.
Prove
Replay any decision earlier and later to show, in pounds, whether the timing was right.
66%
of perfect-foresight profit
2×
the fixed-hours baseline
100
unseen test weeks
30 min
between live decisions
How it works
Grid data in, a proven decision out, every 30 minutes.
01
Elexon
6 datasets, polled
02
Tiger Data
hypertables
03
Features
point-in-time
04
LightGBM
p10 · p50 · p90
05
Optimiser
charge · sell · hold
06
Audit
Tiger fork + Vultr
01
Live ingest: Elexon → Tiger Data
- Six Elexon datasets: prices, wind and demand forecasts, generation mix
- A metadata-driven poller fetches only datasets that changed
- Every row stamped with
available_at: when Tempo could first have seen it - Stored in Tiger Data hypertables, rolled up by continuous aggregates
02
Point-in-time features, zero leakage
- Features use only rows with
available_at ≤ decision_time - Price lags, rolling spreads, wind and demand forecasts, UK calendar
- Each filter is tagged
-- pit; a test removes each one and must fail
03
Quantile forecast: p10 · p50 · p90
- Three LightGBM quantile models predict the next 48 half-hourly prices
- The band shows uncertainty, not just a best guess
- Deterministic training: same rows, same model
- Re-run every 30 min on a Vultr box in London
04
Cost-gated battery optimiser
- Greedy pairing: cheapest buy period with the dearest later sell
- LP alternative (cvxpy) over all 48 periods with full battery physics
- Trades only when the spread beats round-trip loss plus wear
- Hold is a decision too: every row logs its reason
05
Timing audit: one fork, five replays
- Click any decision; Tempo replays it 1 h early to 1 h late
- One Tiger zero-copy fork, five timelines on five Vultr workers in parallel
- Shows in pounds what rushing or hesitating would have cost
- The fork is deleted afterwards; only the results are kept
06
Walk-forward backtest: 66% of perfect
- Retrained every week, tested only on weeks it never saw
- £58,711 earned vs £29,265 for a fixed-hours rule: 2× the baseline
- Scored against perfect foresight on the same weeks