Your best backtest parameter set is usually just the luckiest one.
In-sample ranking barely predicts out-of-sample. So don't pick: map the surface, bound the stable region, average it.
https://t.co/J7klWRbyzQ
@DanSFV Each strategy earns its tests, but cutting the weakest one after watching it slide live is a decision made on the data too. The new PF (1.92 to 1.96) measures what you kept, not whether the cut rule holds out of sample. Worth checking against a threshold fixed in advance.
backtrader takes 46.9 seconds to run an EMA(12/26) plus RSI(14) strategy on 500K one-minute bars. The same run takes 13 ms here, developer machine, median of three runs.
No multiplier gets attached to that number though. backtrader's fills work differently, and our parity gate only times engines that produced the same result as ours. The reproduction script lives in the repo as benchmarks/bench_vs_competitors.py. pip install manifoldbt
@AEY_Capital@SystematicPeter Strong OOS discipline. One nuance: optimizing, then checking out of sample, tests the winning variant, not the search. If the morning filter, wider trigger and break-even timing were picked in-sample, the real discount is how many variants got tried, not the split date alone.
Manifold-BT treats limit entries as immediate-or-cancel, cancelled on the spot and never carried to a later bar. Worth checking which one your own backtest actually implements. pip install manifoldbt
That's not a resting order being patient, it's two fill models wearing the same label. A true immediate-or-cancel limit cancels the instant it isn't touched. A good-till-window resting order waits. Mix them up and you've inflated how often a passive entry actually gets filled.
Manifold-BT treats this as a real setting, not an afterthought. A resting entry needs signal_delay of at least 1; the engine has refused signal_delay=0 there since v0.21, since filling at a level the triggering bar itself computes is the look-ahead. pip install manifoldbt
The bigger lever is WHEN the fill happens, not the fee. Same-bar entry vs next-bar entry can move an equity curve more than a 1bp fee cut ever will (illustrative: a mean-reversion sweep went from 1.4 Sharpe same-bar to 0.9 next-bar, fees unchanged).
@PropQuantX One year of OOS with real commissions and slippage already beats most free templates out there. Worth checking that slippage figure is not flat across the year too, a number from a calm stretch tends to understate cost right when volatility, and trade frequency, spike.
10M bars. SMA crossover with drawdown, Sharpe, Sortino and volatility included: 329 ms. The same report from vectorbt takes 102 seconds, 311x slower. raptorbt (also Rust) does it in 909 ms. Numbers and the reproduction script are public in the repo.
@iblanco_finance One implementability wrinkle. The analyst estimates behind that implied cost of capital need a timestamp for when they were available, not the fiscal period they cover. Backtest it on a lagged or restated consensus series and even that 2% out-of-sample R2 looks optimistic.
Walk-forward with a signal coarser than your stored bars (a 12h signal on 1h data) used to score the test window a bit differently than a native-bar run would. v0.27.1 fixes that, so OOS Sharpe and WFE can shift for those setups once you upgrade.
@gmrinvest The $0.03/share cost is flat across all three exit types, but the 3:55 forced close is the one that actually clears at a worse fill: it is a market order into session-end, not a limit-style VWAP or target exit. The losers in a no-stop setup disproportionately end up there.
Check fills against a participation-rate cap or an average-bar-volume limit, not only an equity percentage, especially once a backtest has been compounding for a while. pip install manifoldbt
Nothing in a simple fill model objects, because nothing in it looks at the order relative to the bar's own volume. It charges the same cost either way, no matter how much of the bar you would actually need to trade through.