QUINN

loading quinn...

Things I make
researchprivateApr 2026 – Jun 2026

Vaprosez

A backtest of a mechanical plan that buys the pullback after an extreme intraday run-up in a low-priced US stock. It looked slightly profitable until I found reverse splits missing from the price data. Corrected, it loses 4.5% of position per trade after costs (t = −3.83, 421 trades). The code and data are private.

  • Python
  • Databento

Method

  • Events: a spike is a run-up of at least 10% in 5 minutes, 15% in 15 minutes, or 25% in the session, detected on 1-minute bars across the extended session.
  • Plan: place a limit buy 10% below the spike high. Stop out 15% below entry. Otherwise exit at the highest price of the following 7 trading days. Costs are 50 basis points per side, and only names above a liquidity floor are traded.
  • Data: licensed minute bars from Databento. Split and dividend adjustments came from a free source.

Sample

671 tickers over 64 trading days (2026-03-16 to 2026-06-15). The detector found 2,955 events, of which 465 were tradeable. The plan filled 421 times across 131 symbols.

The data error

The first backtest showed a small gain per trade. A check I added flagged days where the adjusted price gapped more than 3× overnight while volume fell below 0.3× the prior day, on days not marked as a split. It found six reverse splits the free source had missed. I adopted five and excluded one on judgment. The same pass found one bad price tick recorded as a +3,617% spike, where the real move was about +373%, and I added a rule to catch such ticks.

Before the fixAfter
Plan, mean net per trade+0.018 (t = +0.28, n = 422)−0.045 (t = −3.83, n = 421)
No-stop variant, total net+56.6−9.7
Best in-sample variant, in-sample mean+0.42−0.02

A single false trade booked at +26.6 had hidden a significant loss.

Tests on the corrected plan

  • Size of the loss: mean net −4.5% of position per trade. Bootstrap 95% interval −0.068 to −0.021. Resampling by trading day gives −0.066 to −0.022, and the day-clustered t is −4.13.
  • Out-of-sample split: with a 60/40 calendar split, the plan loses in both halves: −0.046 and −0.045.
  • A second artifact: one no-stop variant stayed positive out of sample after the split fix (+0.130 per trade). The cause was the exit label: the exit high was taken from daily bars and could fall before the low on the same day. Recomputed from minute bars so the exit must follow the low, the figure is +0.054 with an interval that includes zero.
  • Related ideas tested and rejected: an entry filter based on several names spiking together failed a pre-registered walk-forward test, and an apparent lead-lag effect between names showed no stable direction.

Open questions

  • The entry is set from the day’s high, which is known only afterwards. The plan needs an entry trigger that doesn’t depend on knowing the day’s high in advance.
  • The sample is one three-month period.
  • Intraday fills, halts and partial fills are not modeled.
  • Split factors have no single authoritative source; one factor differs by 25% between two sources.
  • The short side is untested and would need borrow and halt data.
  • The ticker list was a snapshot, so names delisted during the window are under-represented.

Conclusion

The plan loses money after costs. Both results that suggested otherwise were data artifacts: missed reverse splits, and an exit label that could look ahead.