Method, and what did not work
Bitget lists more than two and a half thousand tokenised shares. Their home markets are open 32.5 hours of every 168, so for about four fifths of the week these things trade with nothing real setting the price. Almanac answers one question about those hours: when a move happens in the dark, how often does it survive the bell?
It never predicts direction, and it never advises. It states how often moves like the one in front of you were undone, and it publishes how often those statements turned out to be true.
How a night is measured
One night is one measurement. The reference is the 16:00 ET close of the session the night belongs to; the move is read at 09:15 ET, fifteen minutes before the bell — not at 09:29, because a fifteen-minute candle closing at 09:30 already contains the first real trades and would smuggle the answer into the question. The outcome is read an hour after the open, at 10:30 ET.
The unit is kept: 1.0 means the move was still exactly there an hour after the bell, 0 means it was entirely undone, above 1.0 means the real market carried it further. A move stood if half of it survived. Both moments shift with daylight saving, so they are computed through the New York zone rather than a fixed offset.
The thing that predicts survival
It is not how big the move is. It is how big the move is for that name — the move divided by what the token covers in an ordinary session, taken as the median high-to-low range of its last ten completed sessions, all of them strictly before the night in question.
Three percent is nothing on a token that ranges eight percent a day. On one that ranges one percent, three percent is news. The ratio was chosen on the first 60% of the record and the band edges fixed there before the rest was looked at.
Measured twice, on two different instruments
Bitget carries these stocks two ways, and they are not the same thing. An rToken is the tokenised share itself, traded spot. A perpetual is a contract written against the stock's price — a position, not a holding. Different venue, different order books, different participants, different base rate.
The same measurement was run on both, from the same code. If the ladder only appeared on one of them it would be a fact about that venue rather than about the dark hours.
| Band | Nights | Undone | Median kept |
|---|---|---|---|
| under 0.3 | 292 | 50.7% | 0.43 |
| 0.3 – 0.5 | 337 | 40.1% | 0.67 |
| 0.5 – 0.8 | 307 | 27.7% | 0.90 |
| 0.8 – 1.3 | 207 | 21.3% | 0.99 |
| over 1.3 | 94 | 7.4% | 0.97 |
| any night | 1,237 | 33.9% | — |
| Band | Nights | Undone | Median kept |
|---|---|---|---|
| under 0.3 | 346 | 48.3% | 0.57 |
| 0.3 – 0.5 | 334 | 35.0% | 0.87 |
| 0.5 – 0.8 | 376 | 23.7% | 1.00 |
| 0.8 – 1.3 | 322 | 10.9% | 1.01 |
| over 1.3 | 281 | 1.8% | 0.98 |
| any night | 1,659 | 24.9% | — |
The base rates differ — a third against a quarter — and the ladder runs the same way down both. Almanac reads whichever instrument you have selected, against that instrument's own table, never against the other one's.
How it grades itself
Two records, and they are not the same thing
The tables below are a replay: ninety days of real nights re-run in order, the desk seeing only what had already happened at each step. That is how you test whether a set of odds is honest — but every call in it was made after the fact, and this page will not pretend otherwise.
Alongside it there is a live record. Each weekday before the bell, a scheduled
job locks tonight's calls into a committed file and settles them after the open, so each night's
call carries a git timestamp that cannot be moved. It is a small record and it will stay small.
It is on the front page, and at /api/live.
Every night in the replay is taken in order. At each one the desk sees only the nights that had already happened, states the chance the move gets undone, and then the morning settles it. The table is rebuilt as history accrues — every 25 nights rather than every night, which can only make the desk look worse, since it is deciding on a table slightly out of date.
It is graded on whether its odds are true, not on how often it was "right". A desk that says one in twenty should be wrong about one time in twenty.
| Band | n | It said | It happened | Gap |
|---|---|---|---|---|
| under 0.3 | 217 | 49.2% | 53.9% | +4.7 |
| 0.3 – 0.5 | 260 | 40.8% | 41.5% | +0.8 |
| 0.5 – 0.8 | 233 | 28.2% | 29.6% | +1.4 |
| 0.8 – 1.3 | 148 | 27.0% | 18.2% | −8.7 |
| over 1.3 | 68 | 11.5% | 2.9% | −8.5 |
BRIER 0.2101 · KNOWING NOTHING 0.2289 · SKILL +8.2%
| Band | n | It said | It happened | Gap |
|---|---|---|---|---|
| under 0.3 | 287 | 48.1% | 49.8% | +1.8 |
| 0.3 – 0.5 | 275 | 34.6% | 36.7% | +2.1 |
| 0.5 – 0.8 | 310 | 23.3% | 25.2% | +1.9 |
| 0.8 – 1.3 | 245 | 12.9% | 9.8% | −3.1 |
| over 1.3 | 242 | 1.7% | 1.7% | −0.1 |
BRIER 0.1647 · KNOWING NOTHING 0.1926 · SKILL +14.5%
Where it is worst: the top two rToken bands
On rTokens the two highest bands are conservative by roughly 8.5 points — the desk said 27.0% and 11.5% where 18.2% and 2.9% happened. It is wrong in the safer direction, warning about moves that turned out to be solid, but it is wrong.
Those are the thinnest samples in the whole record: 148 and 68 graded nights, against 245 and 242 on the perpetual side, where the same bands land within 3.1 points. The likeliest reading is that the rToken table has not yet seen enough large moves to price them, and that the gap narrows as it does. That is a prediction this page will be held to.
Brier score is the mean squared error of those probabilities against what happened; lower is better. The benchmark is a desk that quotes the overall base rate and knows nothing else. Skill above zero means the bands carry information the base rate does not. Had skill come out at or below zero, this page would say so and the bands would be gone.
What did not work
Three things were built and measured and did not earn their place. They are here because a method is only worth reading next to the things it beat.
1. Per-name history. It lost to doing nothing.
The first version answered from each name's own record: this one gives its overnight moves back, that one extends them, so quote the name's own survival rate. Measured backwards it looked excellent — median kept ran from 35% on one name to 154% on another.
Graded walk-forward, it scored 74.0% where always saying "it stands" scored 81.5% on the same nights. It was 7.6 points worse than knowing nothing. Its "unwinds" call was right 31% of the time — worse than a coin flip, so it was actively harmful.
The per-name pattern was real in the past and carried no information about the next night. Only the walk-forward test exposed it; the backward-looking table never would have.
2. Five other predictors. Four were noise.
Overnight volume against normal, realised volatility through the night, how early in the night the move arrived, how many dead candles it traded through, and the name's turnover — each split into quintiles on the training half and tested on data it had never seen.
None beat the benchmark. Only the move-against-normal-day ratio was monotonic on both halves, and only it separated within every raw size bucket — which is what ruled out its being "small moves get erased" wearing a disguise.
3. Earnings nights. Tested, and we cannot tell.
The obvious explanation for a real overnight move is that the company reported. Bitget's data server carries the earnings calendar, so every measured night was tagged with whether a disclosure actually landed in those dark hours — the real dated report, never the forecast date, which would put a result on a night it may never have happened on.
Raw, it looks like a finding: on the perpetual side earnings nights were undone 8.7% of the time against 27.1% for ordinary nights. But earnings nights carry bigger moves — median ratio 0.60 against 0.49 — and bigger moves already survive more often, so the comparison has to be made inside each band.
Done that way it falls apart. On rTokens, Fisher's exact test gives p = 0.59 — no evidence of any difference, and in the 0.8–1.3 band earnings nights were undone more often. On perpetuals p = 0.056, which is borderline on 23 nights with two undone: one different outcome would move it either way.
And the two instruments disagree. Everything else here had to replicate on both before it was believed; this does not, so it is not believed. The earnings date stays on the page as context a reader can weigh, and stays out of the odds.
Two findings that survived, and surprised us
- Weekend gaps are calmer, not wilder. 29.4% undone against 34.9% on weeknights for rTokens; 21.3% against 25.8% for perpetuals. More unwatched hours did not mean more nonsense, on either instrument.
- Some names have no home market at all. On the perpetual side the universe includes OPENAI, ANTHROPIC and SHEIN — private companies. Nothing ever arrives at a bell to correct them, and their moves are undone just 11.6% of the time against 27.3% for names with a real listing behind them.
Limits, stated plainly
- About ninety days. July to September 2026. One quarter, one market regime. A different regime may move these numbers.
- The busiest names only — 35 rTokens and 39 perpetuals, taken by turnover, so the record leans liquid. Bitget lists far more.
- Not all of them are single stocks. The universes caught index, sector and leveraged products, and on the perpetual side some commodities. They are measured the same way, and the ratio judges each on its own terms, but it is worth knowing.
- One hour. Survival is read at 10:30 ET. A move undone at 14:00 counts as having stood.
- The top rToken bands are thin — 94 nights in the highest band against 281 on the perpetual side. Treat those two rows as the least settled thing on this page.
- Direction is not modelled. Almanac has no view on which way a price goes, and will not be given one.
- No account, no orders, no advice. Public market endpoints only. Nothing here is a recommendation to buy or sell anything.
Where the numbers come from
Bitget's public market API. For rTokens: /api/v2/spot/public/symbols for the universe
(a name counts when its base coin is an r-prefixed share), /spot/market/history-candles
at 15 minutes for every night, /spot/market/tickers to order the rail. For perpetuals
the same three under /api/v2/mix/, with Bitget's own isRwa flag naming
the universe. No key, no account, no private data.
The company behind each token — its real share price, its earnings calendar, its dividends and
splits — comes from Bitget's bitget-mcp-server, a read-only data
service that needs no key. It is shown beside the reading and marked as context. None of
it feeds the bands or the odds. An earnings date is an explanation a reader can weigh;
it is not something this desk has measured, and quietly folding it into a probability would undo
everything else on this page.
Qwen writes the answer in the question box and nothing else. It is handed a block of figures the desk computed — already formatted, so there is nothing to round or convert — told it may not do arithmetic or predict direction, and every number it returns is checked against the ones it was given. If a figure appears that nobody handed it, its answer is discarded, the desk's own wording is served instead, and the page says that is what happened. The same is true when the model times out.
ALL CODE WRITTEN DURING THE BITGET AI BASE CAMP HACKATHON S2 · NO DEPENDENCIES · MIT