I would run a more granular search (Sell Rank at 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, etc) to get a better picture of the performance and turnover curves.
With the parameters you’ve shown, I’d personally go with the lowest sell rank setting of 97.5, as the marginal value of any additional trades (i.e. higher sell rank) is zero if not slightly negative. And that’s assuming you are estimating slippage accurately. If you are underestimating slippage, then you’d be potentially be under-trading at 97.5
Now I’ve tried my hand a bit back and forth with the various ideas. Thanks. This is a short summary what I found:
One of the most obvious solutions is to adjust the rank sell rule. After several tests on different universes and portfolio sizes, I quickly see that it is possible to reduce turnover by over 100% just by adjusting the sell rank
I also see no reason why a share should be sold just because it receives “NO Rank” - so the force rule also contributes significantly to reducing turnover, as “NO rank” makes up almost 10-12% of transactions.
When I looked at the transactions, I also saw that there were quite a few short holding periods. When I use NoDays > 45 on sell, I found that it is smart to let the stock have some time when it first enters the portfolio. This also contributed to reducing turnover.
rankPos in the Buy rules: Instead of only ease the rankPos-Threshold in the Sell rules, you can also use the rankPos in Buy rules. Exp: If your simulation has 20 stocks, you could use a Buy rule: rankPos<=15.
If your universe is also not very static (i.e. using volume threshold), then you may use “force into universe” in simulations. Unfortunately this increase the simulation runtime a lot.
If you have a lot of fundamental Q-/TTM-factors, then a weeksIntoQ or weeksToQ threshold can also be helpful in the Buy rules (or even in the universe, if you follow the previous tip). In addition you can try not to sell on a tight rankPos, but when weeksToQ = 0. That is one of my favourite ways to reduce the turnover. (you can also experiment with the LatestActualDays in a similar way for sentiment driven factors)
If you use a rankPos threshold in the Sell rules, which is only a little bit above the number of stocks in your simulation, then you can use a minimum holding period with noDays. Exp: rankPos >= 25 and noDays >= 20
In the sell rules you can use the rankPos with different thresholds for different volumes. So you can leave a high turnover for liquid stocks and reduce the turnover only for less liquid stocks.
The weighting formula can be used to buy a higher amount of stocks with higher trading volume. This is not reducing the turnover itself, but the slippage.
Remove the most volatile factors from the ranking and use them as ordinary buy rules, like avgRec < AvgRec4WkAgo (you may either use no corresponding sell rule or one with some tolerance like avgRec > AvgRec4WkAgo+0.5)
Feeding off the last bullet point, include equal in the compare like AvgRec <= AvgRec4WkAgo. This keeps stable recommendations in your set which helps a lot with limited analyst coverage and addresses the left boundary condition of 1.00 as as unchanged 1.00 < 1.00 would be excluded.