Show your work
Transparency
A site that predicts the stock market is only worth anything if its mistakes stay visible. Here is what gets published, and what stops anyone from quietly rewriting it later.
Analyses published
45
Latest session analysed
2026-10-16
Current production version
v0.6.0
Producing today's signal
Latest published signal (2026-10-16) was produced by algorithm v0.6.0
Which rules produced which call
Every analysis page names the version that produced it, and that version is sealed inside the fingerprinted snapshot. So a call published in an earlier version keeps saying so, even once the rules have moved on — which is why you will sometimes see an older version on an analysis than the one running today. Reading it as an inconsistency would be reasonable; it is the opposite. Rewriting old calls to carry the current version number is exactly what an honest track record must not do.
v0.6.0
in productionintroduced 2026-09-08 · first market session 2026-09-08 · 29 published in totalDeterministic quantitative scoring plus an equal-weight consensus of three AI models. The models now run at 7:30 AM New York and the shortlist is scored on the morning's actual pre-market trading, not on the previous day's opening gap.
- The morning run moved from 6:30 to 7:30 AM New York. Delivery moved with it: paying subscribers at 8:30, the free list and the public page together at 9:00, all before the 9:30 open.
- The factor previously labelled pre-market gap measured yesterday's open against the close before it — the last daily bar available before the open is yesterday's. For the roughly hundred finalists it is now the last pre-market trade of the morning against yesterday's close, with pre-market volume passed to the models. When no pre-market trade can be read for a stock, the factor is dropped from its score rather than filled with yesterday's number.
- The wider screen over the listed market is unchanged and still reads only completed daily bars; this is stated on the methodology page.
v0.5.0
introduced 2026-08-26 · first market session 2026-08-26 · 8 published in totalDeterministic quantitative scoring plus an equal-weight consensus of three AI models. A call judged by fewer models than were asked can no longer be published at high conviction, and says so on its face.
- How many models answered on the published stock is recorded and shown. A pick decided by two models used to look exactly like one decided by three; the gap existed only in a log line no reader ever saw.
- An incomplete jury costs one conviction notch and is named among the shortfalls. Two models remain enough to publish a stock and one has never been — but two models agreeing is not three models agreeing.
- In the reasoned list sold with the private plans, a model that never answered is shown as silent rather than dropped from the table, where its absence read as a full jury.
v0.4.0
introduced 2026-08-24 · first market session 2026-08-24 · 2 published in totalDeterministic quantitative scoring plus an equal-weight consensus of three AI models. The scanned universe now holds shares only: warrants, subscription rights and blank-cheque units are read off the exchange's own listing files rather than guessed at from the ticker, and dropped.
- Warrants and subscription rights are excluded from the scanned universe. They are not shares, we would never publish one, and around four hundred and fifty of them per session were being asked for and coming back empty.
- Blank-cheque units are excluded too, while partnership and depositary units — which trade normally — are kept. The exchange states the instrument type in its listing files; we were reading that column for the company name and discarding the rest.
- The evening measurement therefore covers fewer names and finishes sooner. The population it drops was never investable, so the graded universe gets cleaner rather than smaller in any way that matters.
v0.3.0
superseded before it published a signalDeterministic quantitative scoring plus an equal-weight consensus of three AI models. The scanned universe now excludes preferred shares and correctly resolves multi-class tickers, and every session is graded across the whole universe after the close, not only on the published pick.
- Preferred shares are excluded from the scanned universe. They are not tradable equities for our purposes, and asking for them burned roughly four hundred quote requests per session on empty answers.
- Multi-class tickers such as BRK.B are now resolved correctly. They were previously dropped in silence, since nothing distinguishes a misspelled symbol from a delisted one.
- Every session is graded after the close across the entire universe, not only the published pick: rank correlation, decile spread and shortlist recall are recorded whether the pick was right or wrong.
- The screening thresholds on price and average volume moved to a single configuration, so the morning filter and the evening grading measure the same investable population.
v0.2.0
introduced 2026-08-16 · first market session 2026-08-17 · 5 published in totalThe best candidate is published every session with a stated conviction level, instead of being withheld when it falls short of the publication bar.
- A pick is published every trading day. Below the bar it is labelled low conviction and the shortfalls are named, rather than the session going silent — a silent day is indistinguishable from a hidden bad call.
- Conviction and the unmet criteria are sealed into the snapshot, so the caveat cannot be quietly dropped from a call that aged badly.
v0.1.0
introduced 2026-07-04 · first market session 2026-08-14 · 1 published in totalFirst published rules: deterministic quantitative scoring, an equal-weight consensus of three AI models, and publication only above a fixed bar.
- Quantitative pre-screen over the listed US market, narrowed to about a hundred finalists on price, volume and recent news.
- GPT-4.1, Claude and Perplexity each score the finalists with equal weight. No single model can carry a pick on its own.
- Each published signal is sealed with a SHA-256 hash over its snapshot.
A fingerprint on every publication
The moment a call goes out, its full content — the stock, the scores, the catalysts, the risks — is sealed with a SHA-256 fingerprint. That fingerprint is printed on the page of every analysis. Change a single character afterwards and it no longer matches.
A fingerprint you cannot check is just a claim, so we publish the sealed bytes themselves. Every analysis page carries the one-line command that recomputes the fingerprint on your own machine. You are not asked to trust us; you are handed the means to check.
Sealing a call an hour and a half before anyone can read it creates a second question, and it is fair: what stops the people who hold it during that window from buying first? A written policy forbids it, and it was published before the audience was large enough for the temptation to be worth anything.
One gap remains: we run the server, so we could in principle rewrite an analysis and its fingerprint together. That is why each fingerprint is also submitted to OpenTimestamps and written into the Bitcoin blockchain, usually within hours of publication. The block that contains it is beyond our reach, and it fixes the date. Every analysis page carries the commands to verify that anchor with the reference client, which never talks to us.
The day our own fingerprint check was wrong
Until 25 August 2026, the call of 14 August failed its own verification. Anyone who ran the command on that page got a different fingerprint from the one stored beside it, and our verification endpoint said so.
The snapshot had not been touched. The check had. Both the verification endpoint and the page that serves the sealed bytes rebuilt the snapshot through the current data model before hashing it, so any field added to that model since publication quietly appeared in the reconstruction of an older call. August 14 predates several such additions, which is why it broke first and alone. A fingerprint that depends on today's code is not sealing anything, and ours did.
Both endpoints now hash the bytes exactly as stored, with no model in the path. Every published session verifies, 14 August included, and the fingerprints themselves were never recomputed — had we repaired them instead, the pages would look identical and the promise would be worthless. What found this was the verification script below, on its first run against production.
Check us with our own script, or with GitHub's
Everything on this page can be recomputed from the open data, and we publish a script that does it: it re-hashes every sealed snapshot, rebuilds the track record from one row per session, recomputes what each entry queue returned, and compares all of it against what the site reports. Roughly a minute, no account, no API key, no dependencies beyond Python itself.
github.com/tickbird/verify-tickbird
It also runs there every weekday evening after the close, on GitHub's machines rather than ours. That distinction is the point. A check we run on ourselves is a claim, and we would be free to publish only the days it suited us; that log is dated, public, and beyond our reach, and a failure stays visible whether we like it or not. One is on the record already — the fingerprint fault described just above was found by the script's first run, not by our tests.
What never gets deleted
- Losing calls stay in the track record, exactly like the winning ones.
- Days with no pick are counted and shown. A day where the models named nothing has no call to win or lose, so it cannot enter a hit rate — but the number of them is published next to the number of sessions, on the numbers page and in the sessions file. Sitting out is a decision, and you can see how often we take it.
- One name per session, and that name only, since September 25, 2026. Until then a runner-up and sometimes a third pick were published and measured alongside it; they were losing more often than not, the third was rarely found, and the test bench now does what they were meant to do — try other ways of choosing, in public. Their measured rows were removed from the record on that date so that every figure on this site describes the same thing: the single published pick.
- The earliest calls were written in French. They are shown translated, but the original text stays in the database untouched, so their fingerprints still match. We changed the language of the display, not the substance of the call.
One exception, so that the promise stays exact rather than merely broad. A handful of early records carried dates on which the American market never opened — weekends left over from development. They could never be measured against a close that does not exist, and they were removed. No call published on a real trading session has ever been deleted, and none will be.
What we do not claim
The statistics on this site cover a track record that is still being built. While the number of measured sessions stays low, those numbers are largely luck, and the numbers page says so out loud rather than hiding it in a footnote.
You do not have to take that on trust either. Every closed session, every stock we shortlisted, the score we gave it and the return it went on to deliver are downloadable as one file of sessions and one of candidates. Run your own statistics on them; if they disagree with ours, that is worth knowing, and it is the reason the files exist.
One note on the candidates file, because a blank cell is ambiguous and this one would be read as a zero. Candidate returns exist only for sessions measured across the whole universe. Every closed session carries them today, but the earliest were graded after the fact rather than on the evening itself, and the sessions file gives the date of each grading in its graded_on column. The graded column marks each row that carries a measured return, so a missing figure reads as never measured rather than as a flat day. It describes the observation, not the session: a stock can leave the market between the morning shortlist and the close — a merger, a halt, a delisting — and belong to a fully measured session while having no closing price of its own. Those rows are marked ungraded, which keeps the guarantee simple: every graded row carries both returns.
The very first session is thinner still: the earliest version stored only part of the morning shortlist, and not the published pick's own row, so that session shows fewer candidates than the hundred we score today and no row flagged as the pick. The call itself and its outcome are intact in the sessions file. We are leaving the gap as it is, because the alternative is reconstructing rows after the fact, and a record that fills in its own history is worth less than one with a hole in it.