I used to set my alarm for 6 AM to check pre-market movers. Most mornings, the stocks that gapped were ones I'd never heard of. I was always reacting, never anticipating.
The shift happened when I started scanning for compression setups with catalyst dates. Stocks with tight ranges and earnings the next day. Stocks with low CoilScores and pending FDA dates. I wasn't predicting gaps. I was building a watchlist where gaps were more likely to happen. And when they did, I already had the context to know if the gap was tradeable or noise.
That evening scan routine is baked into how Banana Farmer works now. The Ripeness Score is basically an automated version of what I used to do manually every night for 200 stocks, except it does it for 9,287.