{ "repo": "manifoldbt/manifoldbt", "run_id": "32695243410", "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32695243410", "commit": "7ac9831d9ac92eb40adac40db44063bc6df5d5d9", "run_started_at": "", "conclusion": "success", "synced_at": "2026-08-24T06:24:44.528361+00:00", "backtests": { "schema_version": 2, "generated_at": "2026-08-24T06:24:32.758792+00:00", "environment": { "os": "Linux", "os_release": "6.17.0-1022-azure", "arch": "x86_64", "cpu": "AMD EPYC 7763 64-Core Processor", "logical_cores": 4, "ram_gb": 16.8, "python": "3.12.14", "versions": { "manifoldbt": "0.19.0", "vectorbt": "0.28.4", "raptorbt": "0.9.0", "numpy": "2.4.3", "numba": "0.64.0", "pandas": "2.3.3" }, "runner": "GitHub Actions 1000000216", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32695243410", "commit": "7ac9831d9ac92eb40adac40db44063bc6df5d5d9", "pinned_cores": null, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ] }, "reference": "manifoldbt", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "reps": 7, "results": [ { "workload": "sma_cross", "title": "SMA 30/150 crossover, long-only, no cost", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.8917489796876906e-15, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0 }, "vectorbt": { "total_return": 0.06675521397166725, "final_equity": 106675.52139716671, "round_trips": 450, "fills": null, "total_fees": 0.0 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 0.0, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0 }, "raptorbt": { "total_return": 0.06675521397166521, "final_equity": 106675.52139716652, "round_trips": 450, "fills": null, "total_fees": 0.0 } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross_metrics" ], "timings": { "manifoldbt": { "samples_s": [ 0.004879696000003264, 0.003447373000000198, 0.0036409869999971534, 0.004861992999991571, 0.0052853259999920965, 0.0036438519999961727, 0.003896827999994912 ], "min_s": 0.003447373000000198, "median_s": 0.003896827999994912, "max_s": 0.0052853259999920965, "iqr_s": 0.0012387090000061107, "iqr_over_median": 0.31787623164474493 }, "vectorbt": { "samples_s": [ 0.2290419250000042, 0.33661285999998825, 0.18699241899999208, 0.18005145600000105, 0.18192289499999958, 0.3333397349999956, 0.17766156199999728 ], "min_s": 0.17766156199999728, "median_s": 0.18699241899999208, "max_s": 0.33661285999998825, "iqr_s": 0.15328827899999453, "iqr_over_median": 0.8197566501345759 }, "raptorbt": { "samples_s": [ 0.010461883000004946, 0.008257428000007394, 0.008563191999996889, 0.0076689409999914915, 0.009019629999997392, 0.007849149999998417, 0.007763659000005418 ], "min_s": 0.0076689409999914915, "median_s": 0.008257428000007394, "max_s": 0.010461883000004946, "iqr_s": 0.0012559709999919733, "iqr_over_median": 0.1521019620141827 } }, "speedup": { "vectorbt": { "median_of_ratios": 46.93774468734343, "min": 34.420373502083244, "max": 97.64329534401091 }, "raptorbt": { "median_of_ratios": 2.1439620418972716, "min": 1.5773245662848108, "max": 2.3952812764986326 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0088440858113723, "raptorbt": null } }, { "workload": "sma_cross_metrics", "title": "SMA 30/150 crossover, with a performance summary", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.8917489796876906e-15, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 2.806945912450058e-15, "advisory_ratio_rel": { "sharpe": 0.00034240713210042254, "sortino": 0.0003424071320978874, "volatility": 0.0003424071321000681 } }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0, "max_drawdown": -0.07910540917093023, "sharpe": 2.1149665518057725, "sortino": 4.02133680320316, "volatility": 0.17066118340286904 }, "vectorbt": { "total_return": 0.06675521397166725, "final_equity": 106675.52139716671, "round_trips": 450, "fills": null, "total_fees": 0.0, "max_drawdown": -0.07910540917093001, "sharpe": 2.1142426200536755, "sortino": 4.019960340111955, "volatility": 0.17060276779841885 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 0.0, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 5.263023585843841e-16, "ratio_basis": "native" }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0, "max_drawdown": -0.07910540917093023, "sharpe": 2.1149665518057725, "sortino": 4.02133680320316, "volatility": 0.17066118340286904 }, "raptorbt": { "total_return": 0.06675521397166521, "final_equity": 106675.52139716652, "round_trips": 450, "fills": null, "total_fees": 0.0, "max_drawdown": -0.07910540917093027, "sharpe": 0.9692748979846307, "sortino": 1.3742016523326603, "volatility": null } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross" ], "timings": { "manifoldbt": { "samples_s": [ 0.0033623529999999846, 0.004866470999999706, 0.003400054000010755, 0.003653088999996612, 0.0036545920000037313, 0.004935180000003925, 0.0033094940000069073 ], "min_s": 0.0033094940000069073, "median_s": 0.003653088999996612, "max_s": 0.004935180000003925, "iqr_s": 0.0015041179999997212, "iqr_over_median": 0.4117386682889785 }, "vectorbt": { "samples_s": [ 0.6847890750000118, 0.6920564480000024, 0.8288446549999975, 0.8422486780000042, 0.6867580870000012, 0.6948161400000004, 0.8570962679999923 ], "min_s": 0.6847890750000118, "median_s": 0.6948161400000004, "max_s": 0.8570962679999923, "iqr_s": 0.15549059100000306, "iqr_over_median": 0.22378667110410386 }, "raptorbt": { "samples_s": [ 0.010547784999999976, 0.008244423000007828, 0.007802983000004815, 0.007754411000007622, 0.010334573999998042, 0.008003419999994321, 0.007738301000003389 ], "min_s": 0.007738301000003389, "median_s": 0.008003419999994321, "max_s": 0.010547784999999976, "iqr_s": 0.0025801629999904208, "iqr_over_median": 0.32238255645614644 } }, "speedup": { "vectorbt": { "median_of_ratios": 203.66364715424436, "min": 140.78840893330087, "max": 258.98106115261226 }, "raptorbt": { "median_of_ratios": 2.29495855065247, "min": 1.6217078201783839, "max": 3.13702487513953 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0025329371078744, "raptorbt": null } }, { "workload": "sma_cross", "title": "SMA 30/150 crossover, long-only, no cost", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 4.220055416226387e-15, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.20294254717538118, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": 9069, "total_fees": 0.0 }, "vectorbt": { "total_return": 0.20294254717537696, "final_equity": 120294.2547175377, "round_trips": 4534, "fills": null, "total_fees": 0.0 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 0.0, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.20294254717538118, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": 9069, "total_fees": 0.0 }, "raptorbt": { "total_return": 0.20294254717538115, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": null, "total_fees": 0.0 } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross_metrics" ], "timings": { "manifoldbt": { "samples_s": [ 0.03841143100000011, 0.036458747000011726, 0.036668950999995786, 0.037002658000005795, 0.03646789499998704, 0.03680117499999369, 0.03495367099998248 ], "min_s": 0.03495367099998248, "median_s": 0.036668950999995786, "max_s": 0.03841143100000011, "iqr_s": 0.0005439109999940683, "iqr_over_median": 0.014833012266812074 }, "vectorbt": { "samples_s": [ 2.0374110679999973, 2.2835828099999986, 2.027839660000012, 2.2872230849999937, 2.030088625000019, 2.2354447450000237, 1.9730962159999876 ], "min_s": 1.9730962159999876, "median_s": 2.0374110679999973, "max_s": 2.2872230849999937, "iqr_s": 0.2557431499999865, "iqr_over_median": 0.12552358923377893 }, "raptorbt": { "samples_s": [ 0.08098256600000298, 0.08288103399999613, 0.08194120199999588, 0.08412889699999937, 0.08147144399998751, 0.07943145400000162, 0.07921447900000089 ], "min_s": 0.07921447900000089, "median_s": 0.08147144399998751, "max_s": 0.08412889699999937, "iqr_s": 0.003449579999994512, "iqr_over_median": 0.042340970414063615 } }, "speedup": { "vectorbt": { "median_of_ratios": 56.44889820016263, "min": 53.04179029414425, "max": 62.63470354588061 }, "raptorbt": { "median_of_ratios": 2.2346208376674124, "min": 2.1082933879761665, "max": 2.2735906431366684 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0003572371830447, "raptorbt": 0.9823681132741224 } }, { "workload": "sma_cross_metrics", "title": "SMA 30/150 crossover, with a performance summary", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 4.220055416226387e-15, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 1.464735645642113e-15, "advisory_ratio_rel": { "sharpe": 0.0003424071321271261, "sortino": 0.00034240713212705575, "volatility": 0.0003424071321024856 } }, "metrics": { "manifoldbt": { "total_return": 0.20294254717538118, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": 9069, "total_fees": 0.0, "max_drawdown": -0.15159363779099633, "sharpe": 0.6860158229410881, "sortino": 1.3522858253366064, "volatility": 0.16128875607357201 }, "vectorbt": { "total_return": 0.20294254717537696, "final_equity": 120294.2547175377, "round_trips": 4534, "fills": null, "total_fees": 0.0, "max_drawdown": -0.1515936377909961, "sharpe": 0.6857810066333395, "sortino": 1.351822951516634, "volatility": 0.16123354855661204 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 0.0, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 0.0, "ratio_basis": "native" }, "metrics": { "manifoldbt": { "total_return": 0.20294254717538118, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": 9069, "total_fees": 0.0, "max_drawdown": -0.15159363779099633, "sharpe": 0.6860158229410881, "sortino": 1.3522858253366064, "volatility": 0.16128875607357201 }, "raptorbt": { "total_return": 0.20294254717538115, "final_equity": 120294.25471753812, "round_trips": 4534, "fills": null, "total_fees": 0.0, "max_drawdown": -0.15159363779099633, "sharpe": 0.3005175738027932, "sortino": 0.42543548791233987, "volatility": null } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross" ], "timings": { "manifoldbt": { "samples_s": [ 0.03631814499999564, 0.03625134800000751, 0.03702843700000358, 0.0373943049999923, 0.038570789999994304, 0.03640098300002137, 0.03750649199997724 ], "min_s": 0.03625134800000751, "median_s": 0.03702843700000358, "max_s": 0.038570789999994304, "iqr_s": 0.0011883469999816043, "iqr_over_median": 0.03209282098462567 }, "vectorbt": { "samples_s": [ 8.432080915, 8.393682709999993, 8.390318123000014, 8.389687948000017, 8.326686325999987, 8.233451341000006, 8.397159626000018 ], "min_s": 8.233451341000006, "median_s": 8.390318123000014, "max_s": 8.432080915, "iqr_s": 0.07047330000003171, "iqr_over_median": 0.008399359710431755 }, "raptorbt": { "samples_s": [ 0.09028694199999165, 0.09033162099999004, 0.09062983300000838, 0.08874442200001909, 0.08869688000001474, 0.08751448200001732, 0.08872236500002373 ], "min_s": 0.08751448200001732, "median_s": 0.08874442200001909, "max_s": 0.09062983300000838, "iqr_s": 0.0016347409999752927, "iqr_over_median": 0.01842077465978584 } }, "speedup": { "vectorbt": { "median_of_ratios": 226.18760985095298, "min": 215.88062692004019, "max": 232.17267608246547 }, "raptorbt": { "median_of_ratios": 2.404179084943007, "min": 2.299586811678678, "max": 2.491814125090502 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9999476292967955, "raptorbt": 0.9921166014797974 } }, { "workload": "sma_cross", "title": "SMA 30/150 crossover, long-only, no cost", "bars": 10000000, "data_digest": "f4e6a3a8823f3768", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.2369127944111823e-14, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.3001352494374474, "final_equity": 130013.52494374473, "round_trips": 46127, "fills": 92254, "total_fees": 0.0 }, "vectorbt": { "total_return": 0.30013524943743497, "final_equity": 130013.5249437435, "round_trips": 46127, "fills": null, "total_fees": 0.0 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.4551915228366853e-16, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.3001352494374474, "final_equity": 130013.52494374473, "round_trips": 46127, "fills": 92254, "total_fees": 0.0 }, "raptorbt": { "total_return": 0.3001352494374475, "final_equity": 130013.52494374475, "round_trips": 46127, "fills": null, "total_fees": 0.0 } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross_metrics" ], "timings": { "manifoldbt": { "samples_s": [ 0.32712228899998763, 0.3184815009999511, 0.3222751999999218, 0.31894982999995136, 0.3198513039999398, 0.35339144699992175, 0.3196001870001055 ], "min_s": 0.3184815009999511, "median_s": 0.3198513039999398, "max_s": 0.35339144699992175, "iqr_s": 0.00817245900003627, "iqr_over_median": 0.025550807196452162 }, "vectorbt": { "samples_s": [ 25.780171853000013, 25.930003043, 25.081107128999975, 25.24383694300002, 25.436068393000028, 25.278404603000013, 25.15486167400013 ], "min_s": 25.081107128999975, "median_s": 25.278404603000013, "max_s": 25.930003043, "iqr_s": 0.6253101789998823, "iqr_over_median": 0.02473693212924012 }, "raptorbt": { "samples_s": [ 0.8930712449999874, 0.8927464529999725, 0.8925744320000604, 0.8923351610000054, 0.8886531360000163, 0.889498802999924, 0.8909506539998802 ], "min_s": 0.8886531360000163, "median_s": 0.8923351610000054, "max_s": 0.8930712449999874, "iqr_s": 0.003247650000048452, "iqr_over_median": 0.0036394957208779454 } }, "speedup": { "vectorbt": { "median_of_ratios": 78.80897364655267, "min": 71.53088966243602, "max": 81.41761126340579 }, "raptorbt": { "median_of_ratios": 2.7783320714558775, "min": 2.517035458982461, "max": 2.8031344055996192 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0966491080248568, "vectorbt": 0.999862546229168, "raptorbt": 0.9984246551296616 } }, { "workload": "sma_cross_metrics", "title": "SMA 30/150 crossover, with a performance summary", "bars": 10000000, "data_digest": "f4e6a3a8823f3768", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.2369127944111823e-14, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 1.1043826616631323e-14, "advisory_ratio_rel": { "sharpe": 0.0003424071321157821, "sortino": 0.0003424071321161821, "volatility": 0.0003424071321037301 } }, "metrics": { "manifoldbt": { "total_return": 0.3001352494374474, "final_equity": 130013.52494374473, "round_trips": 46127, "fills": 92254, "total_fees": 0.0, "max_drawdown": -0.6232787775126734, "sharpe": 0.16657583326366043, "sortino": 0.3242480879539277, "volatility": 0.15596640368660572 }, "vectorbt": { "total_return": 0.30013524943743497, "final_equity": 130013.5249437435, "round_trips": 46127, "fills": null, "total_fees": 0.0, "max_drawdown": -0.6232787775126802, "sharpe": 0.16651881603341911, "sortino": 0.324137101098728, "volatility": 0.15591301795726933 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.4551915228366853e-16, "round_trips_delta": 0, "total_fees_vs_capital": 0.0, "max_drawdown_rel": 0.0, "ratio_basis": "native" }, "metrics": { "manifoldbt": { "total_return": 0.3001352494374474, "final_equity": 130013.52494374473, "round_trips": 46127, "fills": 92254, "total_fees": 0.0, "max_drawdown": -0.6232787775126734, "sharpe": 0.16657583326366043, "sortino": 0.3242480879539277, "volatility": 0.15596640368660572 }, "raptorbt": { "total_return": 0.3001352494374475, "final_equity": 130013.52494374475, "round_trips": 46127, "fills": null, "total_fees": 0.0, "max_drawdown": -0.6232787775126734, "sharpe": 0.07064081213793068, "sortino": 0.09993197026250207, "volatility": null } }, "note": "" } }, "status": "exact", "paired_with": [ "sma_cross" ], "timings": { "manifoldbt": { "samples_s": [ 0.3175222980000285, 0.3220700449999754, 0.317636149000009, 0.3447560820000035, 0.31888608700000987, 0.31764246499994897, 0.32260021999991295 ], "min_s": 0.3175222980000285, "median_s": 0.31888608700000987, "max_s": 0.3447560820000035, "iqr_s": 0.0049640709999039245, "iqr_over_median": 0.015566909947701076 }, "vectorbt": { "samples_s": [ 98.31399542399998, 99.13031890999997, 98.70245542400005, 98.74470937399997, 98.871236533, 98.91308681199996, 98.70410395699992 ], "min_s": 98.31399542399998, "median_s": 98.74470937399997, "max_s": 99.13031890999997, "iqr_s": 0.21063138799991066, "iqr_over_median": 0.0021330903633746587 }, "raptorbt": { "samples_s": [ 0.8962431510000215, 0.8993948380000347, 0.8947939349999388, 0.8922237259999974, 0.8945235740000044, 0.8928620500000761, 0.8911285090000547 ], "min_s": 0.8911285090000547, "median_s": 0.8945235740000044, "max_s": 0.8993948380000347, "iqr_s": 0.004019425000024057, "iqr_over_median": 0.004493369562135249 } }, "speedup": { "vectorbt": { "median_of_ratios": 309.62863409356896, "min": 286.41904966885824, "max": 311.3975545178314 }, "raptorbt": { "median_of_ratios": 2.8051508374524246, "min": 2.5879854557576403, "max": 2.8226148419974617 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0835370125668535, "vectorbt": 0.9998988885367519, "raptorbt": 0.9982160229817851 } }, { "workload": "ema_rsi_fees", "title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.3096723705530167e-15, "round_trips_delta": 0, "total_fees_vs_capital": 4.7748471843078734e-17 }, "metrics": { "manifoldbt": { "total_return": -0.01570110342278974, "final_equity": 98429.88965772103, "round_trips": 3176, "fills": 6352, "total_fees": 1542.3890014306103 }, "vectorbt": { "total_return": -0.01570110342278846, "final_equity": 98429.88965772116, "round_trips": 3176, "fills": null, "total_fees": 1542.3890014306055 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "Two blockers, either one sufficient. Sizing: raptorbt has no fixed-quantity mode. `position_sizes` is a fraction of equity (measured: 0.5 buys exactly half the equity of the bar before the entry), `lot_size` rounds a computed size down to a multiple, and `alloted_capital` fixes the notional, not the quantity. Reproducing `units=5` would mean feeding a fraction derived from an equity curve that does not exist until the run is over. Indicator: `raptorbt.ema` seeds on a simple mean of the first `period` bars and emits from bar `period-1`, while manifoldbt seeds on the first observation and emits from bar 0 (measured: 11 leading NaN for span 12, and ema[11] equal to sma(12)[11] to the last bit). The two are the same recursion with a different warmup, so the signal differs early and the round-trip count with it. Its `sma` and `rsi` do match, which is why the other three workloads run." }, "timings": { "manifoldbt": { "samples_s": [ 0.005246539000154371, 0.0049023080000552, 0.004818834999923638, 0.004937057000006462, 0.017221704000121463, 0.005395639999960622, 0.005208167000091635 ], "min_s": 0.004818834999923638, "median_s": 0.005208167000091635, "max_s": 0.017221704000121463, "iqr_s": 0.000493331999905422, "iqr_over_median": 0.09472276904652675 }, "vectorbt": { "samples_s": [ 0.1847012989999257, 0.18548217799980193, 0.1910755890000928, 0.19474504100003287, 0.18500958799995715, 0.18662912600007076, 0.1880437059999167 ], "min_s": 0.1847012989999257, "median_s": 0.18662912600007076, "max_s": 0.19474504100003287, "iqr_s": 0.006066001000135657, "iqr_over_median": 0.032502970624924625 } }, "speedup": { "vectorbt": { "median_of_ratios": 36.105544618021696, "min": 10.74281546115601, "max": 39.6518222771937 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9956779013213584 } }, { "workload": "ema_rsi_fees", "title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 8.294591680169105e-15, "round_trips_delta": 0, "total_fees_vs_capital": 2.1100277081131935e-15 }, "metrics": { "manifoldbt": { "total_return": -0.1532708157041739, "final_equity": 84672.91842958261, "round_trips": 31389, "fills": 62779, "total_fees": 15206.83039822937 }, "vectorbt": { "total_return": -0.15327081570418216, "final_equity": 84672.91842958178, "round_trips": 31389, "fills": null, "total_fees": 15206.830398229158 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "Two blockers, either one sufficient. Sizing: raptorbt has no fixed-quantity mode. `position_sizes` is a fraction of equity (measured: 0.5 buys exactly half the equity of the bar before the entry), `lot_size` rounds a computed size down to a multiple, and `alloted_capital` fixes the notional, not the quantity. Reproducing `units=5` would mean feeding a fraction derived from an equity curve that does not exist until the run is over. Indicator: `raptorbt.ema` seeds on a simple mean of the first `period` bars and emits from bar `period-1`, while manifoldbt seeds on the first observation and emits from bar 0 (measured: 11 leading NaN for span 12, and ema[11] equal to sma(12)[11] to the last bit). The two are the same recursion with a different warmup, so the signal differs early and the round-trip count with it. Its `sma` and `rsi` do match, which is why the other three workloads run." }, "timings": { "manifoldbt": { "samples_s": [ 0.054873729000064486, 0.05125182400001904, 0.0565114899998207, 0.05653558499989231, 0.05610024600014185, 0.05288013800009139, 0.05169913400004589 ], "min_s": 0.05125182400001904, "median_s": 0.054873729000064486, "max_s": 0.05653558499989231, "iqr_s": 0.004812355999774809, "iqr_over_median": 0.08769872373297527 }, "vectorbt": { "samples_s": [ 2.205457332999913, 2.312152610999874, 2.049424412999997, 2.300816937000036, 2.04612201000009, 2.2958583270001327, 2.059443429999874 ], "min_s": 2.04612201000009, "median_s": 2.205457332999913, "max_s": 2.312152610999874, "iqr_s": 0.251392524000039, "iqr_over_median": 0.1139865733235878 } }, "speedup": { "vectorbt": { "median_of_ratios": 40.19149733741115, "min": 36.26562338042228, "max": 45.113567294678425 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9993925670365275 } }, { "workload": "sma_cross_costs", "title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 8.731149137020111e-16, "round_trips_delta": 0, "total_fees_vs_capital": 1.4210854715202004e-18 }, "metrics": { "manifoldbt": { "total_return": -0.002745042655159957, "final_equity": 99725.49573448401, "round_trips": 450, "fills": 900, "total_fees": 218.42799507745576 }, "vectorbt": { "total_return": -0.0027450426551607985, "final_equity": 99725.49573448392, "round_trips": 450, "fills": null, "total_fees": 218.4279950774559 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that." }, "timings": { "manifoldbt": { "samples_s": [ 0.003949078999994526, 0.003705581000076563, 0.003656618999912098, 0.0036358500001369976, 0.0060230809999666235, 0.0036921459998211503, 0.0036833799999840267 ], "min_s": 0.0036358500001369976, "median_s": 0.0036921459998211503, "max_s": 0.0060230809999666235, "iqr_s": 0.00029246000008242845, "iqr_over_median": 0.07921138549141755 }, "vectorbt": { "samples_s": [ 0.17775888999995004, 0.3240507749999324, 0.182990301000018, 0.18414714799996545, 0.18161737900004482, 0.18299797899999248, 0.18507303499995942 ], "min_s": 0.17775888999995004, "median_s": 0.18299797899999248, "max_s": 0.3240507749999324, "iqr_s": 0.0034556559999145975, "iqr_over_median": 0.018883574664585446 } }, "speedup": { "vectorbt": { "median_of_ratios": 50.0435787825904, "min": 30.153567418577175, "max": 87.44938377901792 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0009618348007485 } }, { "workload": "sma_cross_costs", "title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.6007106751203538e-15, "round_trips_delta": 0, "total_fees_vs_capital": 6.821210263296961e-17 }, "metrics": { "manifoldbt": { "total_return": -0.02986364258908214, "final_equity": 97013.63574109178, "round_trips": 4534, "fills": 9069, "total_fees": 2195.9426086254202 }, "vectorbt": { "total_return": -0.02986364258908383, "final_equity": 97013.63574109162, "round_trips": 4534, "fills": null, "total_fees": 2195.9426086254134 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that." }, "timings": { "manifoldbt": { "samples_s": [ 0.041579560999934984, 0.036446258999831116, 0.036502500000096916, 0.035383864000095855, 0.035573773000123765, 0.03752716999997574, 0.037304735000134315 ], "min_s": 0.035383864000095855, "median_s": 0.036502500000096916, "max_s": 0.041579560999934984, "iqr_s": 0.001953396999851975, "iqr_over_median": 0.05351406067657801 }, "vectorbt": { "samples_s": [ 2.073242475999905, 2.2022289369999726, 2.084316709999939, 2.1940849729999172, 2.0542736519998925, 2.1827779390000615, 2.08357950300001 ], "min_s": 2.0542736519998925, "median_s": 2.084316709999939, "max_s": 2.2022289369999726, "iqr_s": 0.12084249700001237, "iqr_over_median": 0.05797703219488937 } }, "speedup": { "vectorbt": { "median_of_ratios": 57.74685895681477, "min": 49.86205785104722, "max": 62.00806596458695 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0017140611663233 } }, { "workload": "sma_cross_costs", "title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage", "bars": 10000000, "data_digest": "f4e6a3a8823f3768", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 8.149072527885436e-15, "round_trips_delta": 0, "total_fees_vs_capital": 3.1650415621697903e-15 }, "metrics": { "manifoldbt": { "total_return": -0.30242917768507427, "final_equity": 69757.08223149258, "round_trips": 46127, "fills": 92254, "total_fees": 21749.94829446186 }, "vectorbt": { "total_return": -0.30242917768506616, "final_equity": 69757.08223149339, "round_trips": 46127, "fills": null, "total_fees": 21749.948294462178 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that." }, "timings": { "manifoldbt": { "samples_s": [ 0.34842525399994884, 0.3350921820001531, 0.31876775899991117, 0.31804526599989913, 0.3194866800001819, 0.3188277130000188, 0.31933558799983075 ], "min_s": 0.31804526599989913, "median_s": 0.31933558799983075, "max_s": 0.34842525399994884, "iqr_s": 0.01632442300024195, "iqr_over_median": 0.05111996161308085 }, "vectorbt": { "samples_s": [ 25.318823995999992, 25.049471093999955, 24.848114183000007, 25.909182295999926, 24.51903653599993, 25.2646018129999, 25.093897910999885 ], "min_s": 24.51903653599993, "median_s": 25.093897910999885, "max_s": 25.909182295999926, "iqr_s": 0.47070981299998493, "iqr_over_median": 0.018757939267524067 } }, "speedup": { "vectorbt": { "median_of_ratios": 77.95052504982768, "min": 72.66644339162542, "max": 81.4638199834364 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.071124209415114, "vectorbt": 1.0000390457322261 } }, { "workload": "multi_asset", "title": "Five assets in one book, SMA 30/150, 5 bps fee", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.4551915228366853e-16, "round_trips_delta": 0, "total_fees_vs_capital": 5.115907697472722e-18 }, "metrics": { "manifoldbt": { "total_return": -0.004784214364567441, "final_equity": 99521.57856354325, "round_trips": 2350, "fills": 4700, "total_fees": 464.09434549765643 }, "vectorbt": { "total_return": -0.004784214364567548, "final_equity": 99521.57856354324, "round_trips": 2350, "fills": null, "total_fees": 464.09434549765695 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "No multi-instrument portfolio on the entry point this harness drives: `run_single_backtest` is one instrument, and `run_multi_backtest` broadcasts over strategies rather than over assets. 0.9.0 does add `run_portfolio_backtest`, but its allocation model is a different one and would need its own parity work before any timing from it could be published. The units blocker applies here too." }, "timings": { "manifoldbt": { "samples_s": [ 0.02229930999988028, 0.013707165999903737, 0.013650358999939272, 0.013151030000017272, 0.01828118200000972, 0.01388392500007285, 0.013613961999908497 ], "min_s": 0.013151030000017272, "median_s": 0.013707165999903737, "max_s": 0.02229930999988028, "iqr_s": 0.004667220000101224, "iqr_over_median": 0.3404948915139717 }, "vectorbt": { "samples_s": [ 0.43960075499990126, 0.20985605500004567, 0.2119748109998909, 0.2128580249998322, 0.2172727780000514, 0.2185416150000492, 0.38523259299995516 ], "min_s": 0.20985605500004567, "median_s": 0.2172727780000514, "max_s": 0.43960075499990126, "iqr_s": 0.17325778200006425, "iqr_over_median": 0.7974205677989871 } }, "speedup": { "vectorbt": { "median_of_ratios": 15.740621978215994, "min": 11.885050868151517, "max": 28.296875883930365 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0024604431327035 } }, { "workload": "multi_asset", "title": "Five assets in one book, SMA 30/150, 5 bps fee", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.0186340659856795e-15, "round_trips_delta": 0, "total_fees_vs_capital": 2.7284841053187848e-17 }, "metrics": { "manifoldbt": { "total_return": -0.0447197098443024, "final_equity": 95528.02901556976, "round_trips": 22902, "fills": 45806, "total_fees": 4561.765315438204 }, "vectorbt": { "total_return": -0.044719709844301396, "final_equity": 95528.02901556986, "round_trips": 22902, "fills": null, "total_fees": 4561.7653154382015 } }, "note": "" } }, "status": "exact", "unsupported": { "raptorbt": "No multi-instrument portfolio on the entry point this harness drives: `run_single_backtest` is one instrument, and `run_multi_backtest` broadcasts over strategies rather than over assets. 0.9.0 does add `run_portfolio_backtest`, but its allocation model is a different one and would need its own parity work before any timing from it could be published. The units blocker applies here too." }, "timings": { "manifoldbt": { "samples_s": [ 0.1501553889997922, 0.14490668700000242, 0.14558875200009425, 0.14636506199985888, 0.1536310629999207, 0.147068266000133, 0.14864912100006222 ], "min_s": 0.14490668700000242, "median_s": 0.147068266000133, "max_s": 0.1536310629999207, "iqr_s": 0.004566636999697948, "iqr_over_median": 0.03105113784161852 }, "vectorbt": { "samples_s": [ 2.5935149909998927, 2.3203917780001575, 2.5642835829999058, 2.2895732410001983, 2.5865812500001084, 2.2739147839999987, 2.5474208639998324 ], "min_s": 2.2739147839999987, "median_s": 2.5474208639998324, "max_s": 2.5935149909998927, "iqr_s": 0.2970080089999101, "iqr_over_median": 0.1165916528349238 } }, "speedup": { "vectorbt": { "median_of_ratios": 16.83631681960987, "min": 15.46162775862158, "max": 17.613198463286817 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.2543851132511497, "vectorbt": 1.000251489831917 } }, { "workload": "bracket_sl_tp", "title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.01145740341532248, "round_trips_delta": 94, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.05756525685928504, "final_equity": 94243.4743140715, "round_trips": 2309, "fills": 4618, "total_fees": 0.0 }, "vectorbt": { "total_return": -0.06902266027460748, "final_equity": 93097.73397253925, "round_trips": 2215, "fills": null, "total_fees": 0.0 } }, "note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted." }, "raptorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.009248235144781793, "round_trips_delta": 925, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.05756525685928504, "final_equity": 94243.4743140715, "round_trips": 2309, "fills": 4618, "total_fees": 0.0 }, "raptorbt": { "total_return": -0.06681349200406679, "final_equity": 93318.65079959332, "round_trips": 1384, "fills": null, "total_fees": 0.0 } }, "note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers." } }, "status": "documented", "divergence_scale": { "raptorbt": { "round_trips": 1384, "final_equity": 93318.65079959332 }, "manifoldbt": { "reentries_on_exit_bar": 925, "round_trips": 2309, "share_of_round_trips": 0.40060632308358596, "sl_exits": 632, "tp_exits": 388 } }, "timings": { "manifoldbt": { "samples_s": [ 0.010561472000063077, 0.011197752000043693, 0.010966596999878675, 0.010687365999956455, 0.01382391800007099, 0.010924873000021762, 0.011213375999886921 ], "min_s": 0.010561472000063077, "median_s": 0.010966596999878675, "max_s": 0.01382391800007099, "iqr_s": 0.0005260099999304657, "iqr_over_median": 0.04796474238419494 }, "vectorbt": { "samples_s": [ 0.17810525999993843, 0.17614517200013324, 0.17246758100009174, 0.33148679700002504, 0.17858882899986384, 0.1772170679998908, 0.17413174300008905 ], "min_s": 0.17246758100009174, "median_s": 0.1772170679998908, "max_s": 0.33148679700002504, "iqr_s": 0.00445708599977479, "iqr_over_median": 0.025150433025884038 }, "raptorbt": { "samples_s": [ 0.007595532999857824, 0.0076879969999481546, 0.007537800000136485, 0.007794403999923816, 0.007623753000189026, 0.007632308999973247, 0.007587413999999626 ], "min_s": 0.007537800000136485, "median_s": 0.007623753000189026, "max_s": 0.007794403999923816, "iqr_s": 0.0001005829999485286, "iqr_over_median": 0.013193370764508596 } }, "speedup": { "vectorbt": { "median_of_ratios": 15.730404816917355, "min": 12.91882872850857, "max": 31.016697379071292 }, "raptorbt": { "median_of_ratios": 0.6873417524342216, "min": 0.5514900334441999, "max": 0.729310103158774 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0085420267925898, "raptorbt": null } }, { "workload": "bracket_sl_tp", "title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket", "bars": 1000000, "data_digest": "0ef03e7a3c4d011c", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.010543837599986582, "round_trips_delta": 1092, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.45070441471402267, "final_equity": 54929.558528597736, "round_trips": 23075, "fills": 46151, "total_fees": 0.0 }, "vectorbt": { "total_return": -0.46124825231400923, "final_equity": 53875.17476859908, "round_trips": 21983, "fills": null, "total_fees": 0.0 } }, "note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted." }, "raptorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.10072796246195154, "round_trips_delta": 9330, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.45070441471402267, "final_equity": 54929.558528597736, "round_trips": 23075, "fills": 46151, "total_fees": 0.0 }, "raptorbt": { "total_return": -0.3499764522520711, "final_equity": 65002.35477479289, "round_trips": 13745, "fills": null, "total_fees": 0.0 } }, "note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers." } }, "status": "documented", "divergence_scale": { "raptorbt": { "round_trips": 13745, "final_equity": 65002.35477479289 }, "manifoldbt": { "reentries_on_exit_bar": 9330, "round_trips": 23075, "share_of_round_trips": 0.40433369447453954, "sl_exits": 6363, "tp_exits": 3906 } }, "timings": { "manifoldbt": { "samples_s": [ 0.10376091400007681, 0.11586816199996974, 0.11407233099998848, 0.11494229999993877, 0.11642521699991448, 0.11477404199990815, 0.11430490799989457 ], "min_s": 0.10376091400007681, "median_s": 0.11477404199990815, "max_s": 0.11642521699991448, "iqr_s": 0.0017958309999812627, "iqr_over_median": 0.01564666512296134 }, "vectorbt": { "samples_s": [ 2.0267436500000713, 2.297758552000005, 2.022033168000007, 2.284868069999902, 2.0138650700000653, 2.2832133000001704, 2.0164515349999874 ], "min_s": 2.0138650700000653, "median_s": 2.0267436500000713, "max_s": 2.297758552000005, "iqr_s": 0.2684165349999148, "iqr_over_median": 0.13243733858492926 }, "raptorbt": { "samples_s": [ 0.08457978000001276, 0.07705215600003612, 0.08845987700010483, 0.07779004099984377, 0.08870894300002874, 0.07779083800005537, 0.08828350900012083 ], "min_s": 0.07705215600003612, "median_s": 0.08457978000001276, "max_s": 0.08870894300002874, "iqr_s": 0.010669836000261057, "iqr_over_median": 0.12615114392895616 } }, "speedup": { "vectorbt": { "median_of_ratios": 19.53282379527392, "min": 17.297498960225642, "max": 19.893115727352335 }, "raptorbt": { "median_of_ratios": 0.7619392541058686, "min": 0.6649985178849755, "max": 0.8151410462705654 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 0.9947769500671655, "vectorbt": 1.001677267768342, "raptorbt": 1.012588458526649 } }, { "workload": "bracket_sl_tp", "title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket", "bars": 10000000, "data_digest": "f4e6a3a8823f3768", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.0008838890600401106, "round_trips_delta": 10171, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.9948342253853452, "final_equity": 516.5774614654839, "round_trips": 231082, "fills": 462164, "total_fees": 0.0 }, "vectorbt": { "total_return": -0.9957181144453853, "final_equity": 428.18855546147284, "round_trips": 220911, "fills": null, "total_fees": 0.0 } }, "note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted." }, "raptorbt": { "status": "documented", "expected": "documented", "publishable": false, "diffs": { "final_equity_vs_capital": 0.022352514553554532, "round_trips_delta": 93295, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": -0.9948342253853452, "final_equity": 516.5774614654839, "round_trips": 231082, "fills": 462164, "total_fees": 0.0 }, "raptorbt": { "total_return": -0.9724817108317907, "final_equity": 2751.828916820937, "round_trips": 137787, "fills": null, "total_fees": 0.0 } }, "note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers." } }, "status": "documented", "divergence_scale": { "raptorbt": { "round_trips": 137787, "final_equity": 2751.828916820937 }, "manifoldbt": { "reentries_on_exit_bar": 93295, "round_trips": 231082, "share_of_round_trips": 0.4037311430574428, "sl_exits": 63245, "tp_exits": 39487 } }, "timings": { "manifoldbt": { "samples_s": [ 1.0875503639999806, 1.0724363080000785, 1.1248991930001466, 1.0724184860000605, 1.071602815999995, 1.0980863420002152, 1.0670113199998923 ], "min_s": 1.0670113199998923, "median_s": 1.0724363080000785, "max_s": 1.1248991930001466, "iqr_s": 0.02648352600022008, "iqr_over_median": 0.024694730869013196 }, "vectorbt": { "samples_s": [ 24.822297670000125, 25.995311312000013, 25.331261793000067, 25.115389510999876, 25.07546243999991, 26.016469547000042, 25.20907599499992 ], "min_s": 24.822297670000125, "median_s": 25.20907599499992, "max_s": 26.016469547000042, "iqr_s": 0.9198488720001023, "iqr_over_median": 0.036488797613309955 }, "raptorbt": { "samples_s": [ 0.8853017450001062, 0.8832706519999647, 0.8899431120000827, 0.886816041999964, 0.8861643479999657, 0.8865204819999235, 0.8869375670001318 ], "min_s": 0.8832706519999647, "median_s": 0.8865204819999235, "max_s": 0.8899431120000827, "iqr_s": 0.0016358220000256551, "iqr_over_median": 0.0018452162507688076 } }, "speedup": { "vectorbt": { "median_of_ratios": 23.419392558847086, "min": 22.518694964515603, "max": 24.23949200347114 }, "raptorbt": { "median_of_ratios": 0.8236112908626925, "min": 0.7911314342990792, "max": 0.831235386518881 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.025809197572685, "vectorbt": 0.999801378567194, "raptorbt": 1.0008132295649872 } } ], "cold_start": { "workload": "sma_cross", "bars": 20000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "samples_s": { "manifoldbt": [ 0.47015028300006634, 0.4186611949999133, 0.42321224099987376 ], "vectorbt": [ 7.6041231409999455, 7.369359748000079, 7.170137889999978 ], "raptorbt": [ 0.39029380200008745, 0.3907653839999057, 0.39220189899992874 ], "baseline": [ 0.35211166299995966, 0.35257918499996777, 0.3510158039998714 ] }, "median_s": { "manifoldbt": 0.42321224099987376, "vectorbt": 7.369359748000079, "raptorbt": 0.3907653839999057, "baseline": 0.35211166299995966 }, "engine_share_s": { "manifoldbt": 0.0711005779999141, "vectorbt": 7.017248085000119, "raptorbt": 0.03865372099994602 }, "ratio": { "vectorbt": 17.412917288472944, "raptorbt": 0.9233319505992792 } }, "memory": { "workload": "sma_cross", "bars": 2000000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "manifoldbt": { "before_mb": 728.928256, "peak_mb": 728.948736, "added_mb": 0.020480000000020482, "added_mb_per_million_bars": 0.010240000000010241, "seconds": 0.05882227300003251, "mode": "memory", "engine": "mbt", "workload": "sma_cross", "bars": 2000000 }, "vectorbt": { "before_mb": 613.666816, "peak_mb": 862.490624, "added_mb": 248.82380799999999, "added_mb_per_million_bars": 124.41190399999999, "seconds": 4.370269445999838, "mode": "memory", "engine": "vbt", "workload": "sma_cross", "bars": 2000000 }, "raptorbt": { "before_mb": 330.309632, "peak_mb": 370.839552, "added_mb": 40.529920000000004, "added_mb_per_million_bars": 20.264960000000002, "seconds": 0.16149092799992104, "mode": "memory", "engine": "rbt", "workload": "sma_cross", "bars": 2000000 } }, "sweeps": null, "sweep_reps": null }, "sweeps": { "schema_version": 2, "generated_at": "2026-08-24T06:07:30.724122+00:00", "environment": { "os": "Linux", "os_release": "6.17.0-1022-azure", "arch": "x86_64", "cpu": "AMD EPYC 7763 64-Core Processor", "logical_cores": 4, "ram_gb": 16.8, "python": "3.12.14", "versions": { "manifoldbt": "0.19.0", "vectorbt": "0.28.4", "raptorbt": "0.9.0", "numpy": "2.4.3", "numba": "0.64.0", "pandas": "2.3.3" }, "runner": "GitHub Actions 1000000217", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32695243410", "commit": "7ac9831d9ac92eb40adac40db44063bc6df5d5d9", "pinned_cores": null, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ] }, "reference": "manifoldbt", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "reps": 1, "results": [ { "workload": "sma_cross", "title": "SMA 30/150 crossover, long-only, no cost", "bars": 100000, "data_digest": "b7c2ad8cea687ce0", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "parity": { "vectorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 1.8917489796876906e-15, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0 }, "vectorbt": { "total_return": 0.06675521397166725, "final_equity": 106675.52139716671, "round_trips": 450, "fills": null, "total_fees": 0.0 } }, "note": "" }, "raptorbt": { "status": "exact", "expected": "exact", "publishable": true, "diffs": { "final_equity_vs_capital": 0.0, "round_trips_delta": 0, "total_fees_vs_capital": 0.0 }, "metrics": { "manifoldbt": { "total_return": 0.06675521397166517, "final_equity": 106675.52139716652, "round_trips": 450, "fills": 900, "total_fees": 0.0 }, "raptorbt": { "total_return": 0.06675521397166521, "final_equity": 106675.52139716652, "round_trips": 450, "fills": null, "total_fees": 0.0 } }, "note": "" } }, "status": "exact", "timings": { "manifoldbt": { "samples_s": [ 0.005697086000054696 ], "min_s": 0.005697086000054696, "median_s": 0.005697086000054696, "max_s": 0.005697086000054696, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "vectorbt": { "samples_s": [ 0.18699431200002437 ], "min_s": 0.18699431200002437, "median_s": 0.18699431200002437, "max_s": 0.18699431200002437, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "raptorbt": { "samples_s": [ 0.01087188300004982 ], "min_s": 0.01087188300004982, "median_s": 0.01087188300004982, "max_s": 0.01087188300004982, "iqr_s": 0.0, "iqr_over_median": 0.0 } }, "speedup": { "vectorbt": { "median_of_ratios": 32.822799585301865, "min": 32.822799585301865, "max": 32.822799585301865 }, "raptorbt": { "median_of_ratios": 1.9083234832588873, "min": 1.9083234832588873, "max": 1.9083234832588873 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": null, "raptorbt": null } } ], "cold_start": null, "memory": null, "sweeps": [ { "bars": 20000, "combos": 5000, "requested_combos": 5000, "grid": { "fast": 50, "slow": 100 }, "data_digest": "ccec9b97c4ca2b6f", "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "metrics": false, "tier_before": { "pro": true, "budget_used": 0, "budget_limit": 256 }, "parity": { "vectorbt": { "status": "exact", "combos_compared": 5000, "worst_abs_return_delta": 1.2663481374630692e-15, "worst_component": "return", "worst_pair": [ 101, 118 ] }, "raptorbt": { "status": "exact", "combos_compared": 5000, "worst_abs_return_delta": 1.1102230246251565e-16, "worst_component": "return", "worst_pair": [ 19, 113 ] } }, "status": "exact", "timings": { "seconds": { "manifoldbt": 0.4606691870000077, "vectorbt": 5.286901884000031, "raptorbt": 6.738069831000075 }, "ratio": { "vectorbt": 11.476569376019375, "raptorbt": 14.626699638584602 }, "reps": 2, "per_combo_us": 92.13383740000154 }, "memory": { "manifoldbt": 36.7, "vectorbt": 2533.2, "raptorbt": 33.5 }, "memory_baseline_mb": 2176.0, "tier_after": { "pro": true, "budget_used": 0, "budget_limit": 256 } }, { "bars": 20000, "combos": 20000, "requested_combos": 20000, "grid": { "fast": 125, "slow": 160 }, "data_digest": "ccec9b97c4ca2b6f", "engines": [ "manifoldbt", "raptorbt" ], "metrics": false, "tier_before": { "pro": true, "budget_used": 0, "budget_limit": 256 }, "out_of_scope": { "vectorbt": { "status": "out of scope", "reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.", "parity_scope": "anchor grid" } }, "parity": { "raptorbt": { "status": "exact", "combos_compared": 20000, "worst_abs_return_delta": 1.1102230246251565e-16, "worst_component": "return", "worst_pair": [ 11, 733 ] }, "vectorbt": { "status": "exact", "combos_compared": 250, "worst_abs_return_delta": 2.2707530300536405e-15, "worst_component": "return", "worst_pair": [ 9, 78 ], "checked_at_combos": 250, "scope": "anchor grid, not this grid" } }, "status": "exact", "timings": { "seconds": { "manifoldbt": 1.9305274299999837, "raptorbt": 26.62652079599991, "vectorbt": null }, "ratio": { "raptorbt": 13.792355592689058 }, "reps": 2, "per_combo_us": 96.52637149999919 }, "memory": { "manifoldbt": 64.3, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 613.7, "tier_after": { "pro": true, "budget_used": 0, "budget_limit": 256 } }, { "bars": 200000, "combos": 10000, "requested_combos": 10000, "grid": { "fast": 100, "slow": 100 }, "data_digest": "e89a96644ec074e4", "engines": [ "manifoldbt", "raptorbt" ], "metrics": false, "tier_before": { "pro": true, "budget_used": 0, "budget_limit": 256 }, "out_of_scope": { "vectorbt": { "status": "out of scope", "reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.", "parity_scope": "anchor grid" } }, "parity": { "raptorbt": { "status": "exact", "combos_compared": 10000, "worst_abs_return_delta": 1.1796119636642288e-16, "worst_component": "return", "worst_pair": [ 7, 323 ] }, "vectorbt": { "status": "exact", "combos_compared": 250, "worst_abs_return_delta": 9.196202827022049e-15, "worst_component": "return", "worst_pair": [ 11, 53 ], "checked_at_combos": 250, "scope": "anchor grid, not this grid" } }, "status": "exact", "timings": { "seconds": { "manifoldbt": 9.619396154000015, "raptorbt": 150.39642181, "vectorbt": null }, "ratio": { "raptorbt": 15.634705069035018 }, "reps": 2, "per_combo_us": 961.9396154000015 }, "memory": { "manifoldbt": 77.6, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 1728.7, "tier_after": { "pro": true, "budget_used": 0, "budget_limit": 256 } } ], "sweep_reps": 2 } }