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.

VariantTradesWin rate net [95% CI]Mean net / tradeΣ grossFeesΣ netMax drawdown (Σ)
All directional signals9,85744.9% [44.0%–45.9%]-22.5 bps-2.43-19.71-22.1424.06
Excluding listing events (the observed anti-signal)9,84144.9% [44.0%–45.9%]-22.5 bps-2.51-19.68-22.1924.14
Funding, whale-movement and macro events onlyout-of-sample here5,48445.2% [43.9%–46.5%]-26.7 bps-3.68-10.97-14.6414.99
Macro only (reference: what the event slice mostly is)5,10145.2% [43.8%–46.6%]-27.5 bps-3.84-10.20-14.0514.60
Hack-exploit and whale-movement only (sign agrees on both segments)in-sample on both segments; pre-registered, not yet tested74751.0% [47.4%–54.6%]18.9 bps2.91-1.491.411.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-062026-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.

VariantTradesWin rate net [95% CI]Mean net / tradeΣ grossFeesΣ netMax drawdown (Σ)
All directional signals17,64247.5% [46.8%–48.2%]-17.5 bps4.47-35.28-30.8141.92
Excluding listing events (the observed anti-signal)17,46747.6% [46.9%–48.4%]-17.0 bps5.26-34.93-29.6740.87
Funding, whale-movement and macro events onlyin-sample here4,62249.5% [48.0%–50.9%]4.9 bps11.53-9.242.298.73
Macro only (reference: what the event slice mostly is)4,25749.2% [47.7%–50.7%]2.9 bps9.75-8.511.239.47
Hack-exploit and whale-movement only (sign agrees on both segments)in-sample on both segments; pre-registered, not yet tested87750.1% [46.8%–53.4%]-3.9 bps1.41-1.75-0.352.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-062026-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 eventnHit rateMean signed returnMedian
macro5,10148.8%-7.5 bps-2.7 bps
regulation1,58048.2%3.8 bps-2.5 bps
partnership61639.9%-35.7 bps-40.6 bps
market_structure60143.6%-41.5 bps-23.3 bps
hack_exploit45854.1%49.0 bps36.3 bps
tokenomics43552.0%43.7 bps11.1 bps
whale_movement28954.7%22.9 bps19.8 bps
other26448.1%10.0 bps-9.5 bps
product_launch24846.4%-2.8 bps-6.8 bps
network_upgrade10557.1%46.9 bps45.5 bps
funding9438.3%-52.3 bps-56.0 bps
delisting2676.9%125.1 bps132.4 bps
legal2445.8%43.6 bps-7.0 bps
listing1643.8%48.8 bps-24.5 bps

Reconstructed

Dominant eventnHit rateMean signed returnMedian
regulation6,60649.5%-10.1 bps0.0 bps
macro4,25752.6%22.9 bps15.9 bps
market_structure2,89250.6%12.3 bps6.9 bps
product_launch1,38947.9%-18.8 bps-11.0 bps
hack_exploit66452.4%10.0 bps16.4 bps
other57649.0%-19.3 bps-2.0 bps
partnership49249.0%7.2 bps-2.4 bps
whale_movement21354.9%34.9 bps28.3 bps
listing17536.0%-45.1 bps-104.1 bps
funding15255.9%68.4 bps50.0 bps
legal10947.7%-34.8 bps-6.7 bps
network_upgrade8053.8%-2.5 bps26.5 bps
tokenomics3644.4%-21.8 bps-46.9 bps
delisting1100.0%137.9 bps137.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.

SegmentHorizonnHit rate gross [95% CI]Hit netMean ret grossMean ret netIC
Reconstructed1h17,65249.6% [48.9%–50.3%]33.8%2.7 bps-17.3 bps0.033
4h17,61249.0% [48.3%–49.7%]41.5%4.6 bps-15.4 bps0.012
24h17,64250.4% [49.7%–51.1%]47.5%2.5 bps-17.5 bps0.023
Live1h9,86047.8% [46.9%–48.8%]31.2%0.9 bps-19.1 bps0.009
4h9,86247.4% [46.4%–48.4%]38.0%-2.8 bps-22.8 bps-0.028
24h9,85748.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.