← all research

500 nulls per rule. shift keeps the exact run structure (same exposure, same trades); perm keeps only the number of long bars. Low p on gross/calmar = real timing/risk skill; low p on raw net would be meaningless (drift).

SymRulenet p(f/v) shiftgross p(f/v) shiftcal p(f/v) shiftgross p(v) perm
BTC/USDdual(200,60)0.166/0.0920.166/0.0860.060/0.1380.046
BTC/USDdonchian(55,20)0.310/0.0620.310/0.0620.174/0.1820.072
BTC/USDdonchian(100,50)0.430/0.1380.430/0.1380.230/0.0000.080
BTC/USDroc(120)0.376/0.2080.376/0.2100.108/0.0900.104
ETH/USDdual(200,60)0.226/0.0840.226/0.0860.030/0.1020.060
ETH/USDdonchian(55,20)0.538/0.1100.538/0.1100.468/0.0260.050
ETH/USDdonchian(100,50)0.594/0.4060.594/0.4040.320/0.0880.492
ETH/USDroc(120)0.490/0.2860.490/0.2820.360/0.3260.230

Read: if gross/calmar p stays high under shift, the return is drift the rule would have earned at any phase — no timing skill. If perm gross p is low, the rule's placement of the long bars beats random placement (exposure timing).