Research
How the signal performs against real market outcomes. Fees included, live and reconstructed kept apart, negative results kept.
Pooled across everything there is no headline edge. Direction over 24 hours is a coin flip. Hit rates differ by event type, but on live data those slices flip sign when you split the window. Every one of those numbers is below. Treat the signal as a filter and sizing overlay for a strategy you already run.
What the event filter is worth
Every directional signal held 24h at equal weight, net of 20 bps round-trip fees, over a frozen 126-day window (2026-04-06 → 2026-08-10). The live segment is the headline; the reconstruction sits below it, labeled. Taking every signal loses money. Each filtered row says where its membership was chosen, because they were not all chosen the same way. The oldest one was read off the reconstruction's own event study, so on live it is out-of-sample.
Read the sums with two things in mind. Fees are the trade count times 20 bps whatever the signal did, so they get their own column and they are usually the larger term. The event slice is 93.0% macro by trade count, so its sign is macro's sign. The macro-only line on each chart is there to show that. The hack-and-whale row is a pre-registered successor: the only two event types whose sign agrees on both segments. Both segments are in-sample for it, so its number here is a description of the data it was chosen on and not a result. It is tested on a future live window against gates written before the read.
Live-collected
The young record, and the one that counts. Its event slice is negative.
| Variant | Trades | Win rate net [95% CI] | Mean net / trade | Σ gross | Fees | Σ net | Max drawdown (Σ) |
|---|---|---|---|---|---|---|---|
| All directional signals | 9,857 | 44.9% [44.0%–45.9%] | -22.5 bps | -2.43 | -19.71 | -22.14 | 24.06 |
| Excluding listing events (the observed anti-signal) | 9,841 | 44.9% [44.0%–45.9%] | -22.5 bps | -2.51 | -19.68 | -22.19 | 24.14 |
| Funding, whale-movement and macro events onlyout-of-sample here | 5,484 | 45.2% [43.9%–46.5%] | -26.7 bps | -3.68 | -10.97 | -14.64 | 14.99 |
| Macro only (reference: what the event slice mostly is) | 5,101 | 45.2% [43.8%–46.6%] | -27.5 bps | -3.84 | -10.20 | -14.05 | 14.60 |
| Hack-exploit and whale-movement only (sign agrees on both segments)in-sample on both segments; pre-registered, not yet tested | 747 | 51.0% [47.4%–54.6%] | 18.9 bps | 2.91 | -1.49 | 1.41 | 1.66 |
Funding, whale-movement and macro events only is 93.0% macro by trade count: macro 93.0%, whale_movement 5.3%, funding 1.7%. So that row is mostly one event, and its sign is that event's sign.
Methodology & disclosed assumptions
- 24-hour horizon only; directional signals only (neutral excluded); live signals published later than one hour after their bucket are excluded.
- One trade per signal: enter at the first close realized after publication, exit at the 24h close; net return subtracts a 10 bps taker fee per side (20 bps round trip).
- Equal weight per trade, no compounding: the equity curve is the running sum of per-trade net returns, so mean net return times trade count equals the curve's endpoint.
- Overlapping positions are allowed (hourly signals with a 24h hold imply up to 24 concurrent positions per symbol): this is a signal-quality statistic, not an executable portfolio.
- Max drawdown is the largest peak-to-trough drop of that running sum, in units of summed per-trade return, not a portfolio percentage.
- Live and reconstructed segments are computed separately and never pooled.
- Event-filtered membership was read off the reconstructed segment's event study. On the reconstructed segment that is in-sample. The same membership applied to the live segment is out-of-sample. Neither is a validated strategy.
- Gross and net are printed separately because the fee term is the trade count times 20 bps whatever the signal quality. On hourly signals held 24h it dominates the sum.
- A variant can be one event wearing a multi-event label. Where one event is more than 80% of a variant's trades, the composition is printed under the table.
Artifact 374fe6e, frozen over 2026-04-06 → 2026-08-10; fee assumption 10.0 bps per side.
Reconstructed (GDELT-backfilled)
Before backfilling we wrote the kill line down: if reconstructed and live scores correlate below 0.8 on the same buckets, the reconstruction is a research artifact rather than history. It came back at 0.031 over 3,701 paired buckets, so the kill fired. Kept here because it is the longer window. Never pooled with live.
| Variant | Trades | Win rate net [95% CI] | Mean net / trade | Σ gross | Fees | Σ net | Max drawdown (Σ) |
|---|---|---|---|---|---|---|---|
| All directional signals | 17,642 | 47.5% [46.8%–48.2%] | -17.5 bps | 4.47 | -35.28 | -30.81 | 41.92 |
| Excluding listing events (the observed anti-signal) | 17,467 | 47.6% [46.9%–48.4%] | -17.0 bps | 5.26 | -34.93 | -29.67 | 40.87 |
| Funding, whale-movement and macro events onlyin-sample here | 4,622 | 49.5% [48.0%–50.9%] | 4.9 bps | 11.53 | -9.24 | 2.29 | 8.73 |
| Macro only (reference: what the event slice mostly is) | 4,257 | 49.2% [47.7%–50.7%] | 2.9 bps | 9.75 | -8.51 | 1.23 | 9.47 |
| Hack-exploit and whale-movement only (sign agrees on both segments)in-sample on both segments; pre-registered, not yet tested | 877 | 50.1% [46.8%–53.4%] | -3.9 bps | 1.41 | -1.75 | -0.35 | 2.83 |
Funding, whale-movement and macro events only is 92.1% macro by trade count: macro 92.1%, whale_movement 4.6%, funding 3.3%. So that row is mostly one event, and its sign is that event's sign.
Methodology & disclosed assumptions
- 24-hour horizon only; directional signals only (neutral excluded); live signals published later than one hour after their bucket are excluded.
- One trade per signal: enter at the first close realized after publication, exit at the 24h close; net return subtracts a 10 bps taker fee per side (20 bps round trip).
- Equal weight per trade, no compounding: the equity curve is the running sum of per-trade net returns, so mean net return times trade count equals the curve's endpoint.
- Overlapping positions are allowed (hourly signals with a 24h hold imply up to 24 concurrent positions per symbol): this is a signal-quality statistic, not an executable portfolio.
- Max drawdown is the largest peak-to-trough drop of that running sum, in units of summed per-trade return, not a portfolio percentage.
- Live and reconstructed segments are computed separately and never pooled.
- Event-filtered membership was read off the reconstructed segment's event study. On the reconstructed segment that is in-sample. The same membership applied to the live segment is out-of-sample. Neither is a validated strategy.
- Gross and net are printed separately because the fee term is the trade count times 20 bps whatever the signal quality. On hourly signals held 24h it dominates the sum.
- A variant can be one event wearing a multi-event label. Where one event is more than 80% of a variant's trades, the composition is printed under the table.
Artifact 374fe6e, frozen over 2026-04-06 → 2026-08-10; fee assumption 10.0 bps per side.
Composition slices by event type
Forward returns at 24h grouped by the signal's dominant event type. Funding, whale movement and macro print above the book. Listing prints as an anti-signal. The weak rows stay in the table. Read these as composition, not demonstrated edge: the same axis flips sign between the two segments below, and it flipped sign across sub-windows within the live record too. That is what a young sample looks like when the tape changes regime.
Live-collected
| Dominant event | n | Hit rate | Mean signed return | Median |
|---|---|---|---|---|
| macro | 5,101 | 48.8% | -7.5 bps | -2.7 bps |
| regulation | 1,580 | 48.2% | 3.8 bps | -2.5 bps |
| partnership | 616 | 39.9% | -35.7 bps | -40.6 bps |
| market_structure | 601 | 43.6% | -41.5 bps | -23.3 bps |
| hack_exploit | 458 | 54.1% | 49.0 bps | 36.3 bps |
| tokenomics | 435 | 52.0% | 43.7 bps | 11.1 bps |
| whale_movement | 289 | 54.7% | 22.9 bps | 19.8 bps |
| other | 264 | 48.1% | 10.0 bps | -9.5 bps |
| product_launch | 248 | 46.4% | -2.8 bps | -6.8 bps |
| network_upgrade | 105 | 57.1% | 46.9 bps | 45.5 bps |
| funding | 94 | 38.3% | -52.3 bps | -56.0 bps |
| delisting | 26 | 76.9% | 125.1 bps | 132.4 bps |
| legal | 24 | 45.8% | 43.6 bps | -7.0 bps |
| listing | 16 | 43.8% | 48.8 bps | -24.5 bps |
Reconstructed
| Dominant event | n | Hit rate | Mean signed return | Median |
|---|---|---|---|---|
| regulation | 6,606 | 49.5% | -10.1 bps | 0.0 bps |
| macro | 4,257 | 52.6% | 22.9 bps | 15.9 bps |
| market_structure | 2,892 | 50.6% | 12.3 bps | 6.9 bps |
| product_launch | 1,389 | 47.9% | -18.8 bps | -11.0 bps |
| hack_exploit | 664 | 52.4% | 10.0 bps | 16.4 bps |
| other | 576 | 49.0% | -19.3 bps | -2.0 bps |
| partnership | 492 | 49.0% | 7.2 bps | -2.4 bps |
| whale_movement | 213 | 54.9% | 34.9 bps | 28.3 bps |
| listing | 175 | 36.0% | -45.1 bps | -104.1 bps |
| funding | 152 | 55.9% | 68.4 bps | 50.0 bps |
| legal | 109 | 47.7% | -34.8 bps | -6.7 bps |
| network_upgrade | 80 | 53.8% | -2.5 bps | 26.5 bps |
| tokenomics | 36 | 44.4% | -21.8 bps | -46.9 bps |
| delisting | 1 | 100.0% | 137.9 bps | 137.9 bps |
The headline numbers, honestly
Pooled hit rates with Wilson 95% intervals, published as they land, even where an interval sits entirely below 50%. No lookahead: entries use the first close realized after publication. Reconstructed (GDELT-backfilled) buckets are never pooled with live.
| Segment | Horizon | n | Hit rate gross [95% CI] | Hit net | Mean ret gross | Mean ret net | IC |
|---|---|---|---|---|---|---|---|
| Reconstructed | 1h | 17,652 | 49.6% [48.9%–50.3%] | 33.8% | 2.7 bps | -17.3 bps | 0.033 |
| 4h | 17,612 | 49.0% [48.3%–49.7%] | 41.5% | 4.6 bps | -15.4 bps | 0.012 | |
| 24h | 17,642 | 50.4% [49.7%–51.1%] | 47.5% | 2.5 bps | -17.5 bps | 0.023 | |
| Live | 1h | 9,860 | 47.8% [46.9%–48.8%] | 31.2% | 0.9 bps | -19.1 bps | 0.009 |
| 4h | 9,862 | 47.4% [46.4%–48.4%] | 38.0% | -2.8 bps | -22.8 bps | -0.028 | |
| 24h | 9,857 | 48.4% [47.4%–49.4%] | 44.9% | -2.5 bps | -22.5 bps | -0.019 |
Read these against the null, not against 50%. A book with no information at all lands between 42.6% and 49.7% net over a 14-day window, because fees pull the center below a coin flip. Our live net sits inside that band. So the claim is that the signal is at or below a coin flip on direction, and it is not yet possible to say more than that.
Find a filter we could not
Event type moves 24h returns by a wide margin. The spread is in the table above and it is not small. What we have not managed is to turn that spread into a filter that survives outside the data it was picked on. The published slice reads 24.9 bps gross on the segment its membership was read off, and -6.7 bps gross on live. We also ran the mirror of that, picking membership on live instead, and it fails the same way pointing the other direction. Both look excellent where they were chosen. Both go flat on the other segment.
So the axis is open, and the data behind it is not ours to keep. Every bucket in these tables is available through the API with its as-of timestamp and the hash that commits it, so you can rebuild this backtest and then change it. Slice it on your own event mix, your own horizon, your own universe. Two things we would ask of your own read. Write the pass line down before you look at the answer. Check the slice is large enough to detect the effect you are hoping for, because ours failed that test twice.
If you find one that holds on a window it was not chosen on, we want to see it. Send it to contact@shingou.io and we will publish it on this page and credit you, including when it beats ours. Start from the API docs or the live demo.
What you are buying
Not an edge. This page is the reason why. The whole record is here, including the part that reads null, so there is nothing on it you need to discount.
What you buy is the instrument. One score per symbol per hour, stamped with the hour it was known. Typed events on the same clock. Every bucket's hash committed to a public log at publish time, so a backtest against this history cannot quietly see the future. That is what makes your own test worth running, whichever way it comes out.
So the price is for freshness and for depth, never for a number we cannot stand behind. A bot that trades on this needs it live every month. A backtest needs history and barely any throughput. Those are priced separately, so neither pays for the other.
Citing this page
Every claim here is meant to be linkable at the paragraph, so an argument can point at the number instead of the page. Stable anchors: #backtest, #event-study, #hit-rates, #your-own-filter, #what-you-buy.
If you quote the event-conditioned figures, carry the caveat with them: those slices were chosen after seeing the event study, they are in-sample, and on live data they do not hold their sign when the window is split.
Negative results are kept on purpose. Every published bucket's hash is committed to a public append-only log at publish time. Consume the signal via the API or see the live demo.