{ "repo": "manifoldbt/manifoldbt", "run_id": "32642616670", "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670", "commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e", "run_started_at": "", "conclusion": "success", "synced_at": "2026-08-23T14:01:18.287780+00:00", "backtests": { "schema_version": 2, "generated_at": "2026-08-23T14:01:07.410774+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 1000000211", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670", "commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e", "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.005347049999997466, 0.0032132190000027094, 0.003269553999999175, 0.005082164000000944, 0.00493666900000278, 0.0033668539999922587, 0.0033179020000062565 ], "min_s": 0.0032132190000027094, "median_s": 0.0033668539999922587, "max_s": 0.005347049999997466, "iqr_s": 0.0018126100000017686, "iqr_over_median": 0.5383690531296981 }, "vectorbt": { "samples_s": [ 0.18863555500000473, 0.34205679800000155, 0.20039412599999196, 0.18093825200000424, 0.18287249200000133, 0.346504865, 0.17978614300000118 ], "min_s": 0.17978614300000118, "median_s": 0.18863555500000473, "max_s": 0.346504865, "iqr_s": 0.1611185459999973, "iqr_over_median": 0.8541260739524597 }, "raptorbt": { "samples_s": [ 0.010460542000004125, 0.008207519000009711, 0.008448298999994108, 0.007822949000001245, 0.00898829300000159, 0.007895570000002294, 0.00839399199999491 ], "min_s": 0.007822949000001245, "median_s": 0.00839399199999491, "max_s": 0.010460542000004125, "iqr_s": 0.001092722999999296, "iqr_over_median": 0.13017918053769395 } }, "speedup": { "vectorbt": { "median_of_ratios": 54.1866947847351, "min": 35.27843483791887, "max": 106.45299869063177 }, "raptorbt": { "median_of_ratios": 2.34508832281425, "min": 1.5392948751751796, "max": 2.5839301017803162 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0054353768621687, "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.0033861920000077816, 0.005095889999992664, 0.0033050610000060487, 0.0033925749999923482, 0.0033702409999989413, 0.00511029300000132, 0.0033675650000049018 ], "min_s": 0.0033050610000060487, "median_s": 0.0033861920000077816, "max_s": 0.00511029300000132, "iqr_s": 0.0017283249999877626, "iqr_over_median": 0.5104037219341936 }, "vectorbt": { "samples_s": [ 0.685716162999995, 0.7026406140000034, 0.8420005899999978, 0.8500549900000038, 0.6868578610000071, 0.7315806839999937, 0.8522979340000063 ], "min_s": 0.685716162999995, "median_s": 0.7315806839999937, "max_s": 0.8522979340000063, "iqr_s": 0.16319712899999672, "iqr_over_median": 0.22307468276458503 }, "raptorbt": { "samples_s": [ 0.010763509000000226, 0.008259987000002411, 0.00783488200001159, 0.007808417999996209, 0.010623882000004414, 0.007928362000001243, 0.007854914999995799 ], "min_s": 0.007808417999996209, "median_s": 0.007928362000001243, "max_s": 0.010763509000000226, "iqr_s": 0.002788999999992825, "iqr_over_median": 0.3517750576969603 } }, "speedup": { "vectorbt": { "median_of_ratios": 203.80081454122208, "min": 137.88378752308526, "max": 254.7609832310075 }, "raptorbt": { "median_of_ratios": 2.3325206788835153, "min": 1.5514495939859407, "max": 3.178646987523298 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9997853104005853, "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.037335460000008425, 0.037978995000003124, 0.03791546700000481, 0.039023332999988725, 0.038331946999988986, 0.038091042000019115, 0.03732786800000554 ], "min_s": 0.03732786800000554, "median_s": 0.037978995000003124, "max_s": 0.039023332999988725, "iqr_s": 0.0009964869999805614, "iqr_over_median": 0.026237845419039642 }, "vectorbt": { "samples_s": [ 2.0507589489999987, 2.315858748000011, 2.0414709830000106, 2.328412334999996, 2.037601520999999, 2.2872202920000007, 2.022937194000008 ], "min_s": 2.022937194000008, "median_s": 2.0507589489999987, "max_s": 2.328412334999996, "iqr_s": 0.27825722700001165, "iqr_over_median": 0.13568499951478785 }, "raptorbt": { "samples_s": [ 0.07901990999999953, 0.08475653599998623, 0.0793328129999793, 0.08569068500000299, 0.07950533600001108, 0.08441346500001146, 0.08000269400000093 ], "min_s": 0.07901990999999953, "median_s": 0.08000269400000093, "max_s": 0.08569068500000299, "iqr_s": 0.00542372300000693, "iqr_over_median": 0.0677942545285646 } }, "speedup": { "vectorbt": { "median_of_ratios": 54.92791434736671, "min": 53.1567447122001, "max": 60.977357299734244 }, "raptorbt": { "median_of_ratios": 2.143243059046101, "min": 2.074127254742211, "max": 2.2316687421554797 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0010434703443873, "raptorbt": 1.0127087280209428 } }, { "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.03776869099999658, 0.036214618000002474, 0.03805361700000276, 0.03835612099999253, 0.03794206099999542, 0.037969554000000016, 0.03712031999998544 ], "min_s": 0.036214618000002474, "median_s": 0.03794206099999542, "max_s": 0.03835612099999253, "iqr_s": 0.0009332970000173191, "iqr_over_median": 0.02459795212541121 }, "vectorbt": { "samples_s": [ 8.470414614000006, 8.453709758999992, 8.483099930999998, 8.443229481999992, 8.505207001000002, 8.376691564999987, 8.546466886000019 ], "min_s": 8.376691564999987, "median_s": 8.470414614000006, "max_s": 8.546466886000019, "iqr_s": 0.061977519000009806, "iqr_over_median": 0.007316940412523915 }, "raptorbt": { "samples_s": [ 0.087959761999997, 0.08789736800000014, 0.09063822400000277, 0.08818575500001202, 0.0897488300000191, 0.08837810500000387, 0.09013085699999124 ], "min_s": 0.08789736800000014, "median_s": 0.08837810500000387, "max_s": 0.09063822400000277, "iqr_s": 0.0021710949999942386, "iqr_over_median": 0.02456598271703318 } }, "speedup": { "vectorbt": { "median_of_ratios": 224.16302058554567, "min": 220.127303331889, "max": 233.4336305576774 }, "raptorbt": { "median_of_ratios": 2.36541789335139, "min": 2.299131212982387, "max": 2.428073276308679 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9998512244657815, "raptorbt": 0.9952822002361194 } }, { "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.3235047160000022, 0.3234485200000563, 0.323429739000062, 0.32509285100002216, 0.32039177000001473, 0.3194278570000506, 0.3223829769999611 ], "min_s": 0.3194278570000506, "median_s": 0.323429739000062, "max_s": 0.32509285100002216, "iqr_s": 0.00311294599998746, "iqr_over_median": 0.00962479829347685 }, "vectorbt": { "samples_s": [ 25.683530236000024, 26.08707517099998, 25.33292799000003, 25.588718906000054, 25.306060289000015, 25.158651128999963, 25.056078312999944 ], "min_s": 25.056078312999944, "median_s": 25.33292799000003, "max_s": 26.08707517099998, "iqr_s": 0.5248791070000607, "iqr_over_median": 0.020719243634500225 }, "raptorbt": { "samples_s": [ 0.9073103939999783, 0.9050338699999543, 0.9025704289999794, 0.9056177639999987, 0.8986746360000097, 0.8985271369999737, 0.8979460529999415 ], "min_s": 0.8979460529999415, "median_s": 0.9025704289999794, "max_s": 0.9073103939999783, "iqr_s": 0.0070906270000250515, "iqr_over_median": 0.007856037348665688 } }, "speedup": { "vectorbt": { "median_of_ratios": 78.76160634604882, "min": 77.72146825544999, "max": 80.65294338337192 }, "raptorbt": { "median_of_ratios": 2.798077017015866, "min": 2.785339540431286, "max": 2.8129266665675665 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.089614874869514, "vectorbt": 0.9999268177353846, "raptorbt": 1.0038506884310427 } }, { "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.3217440409999881, 0.3247571649999941, 0.32139380200010237, 0.33266460599998027, 0.31832793700004913, 0.31972129700000096, 0.3228766590000305 ], "min_s": 0.31832793700004913, "median_s": 0.3217440409999881, "max_s": 0.33266460599998027, "iqr_s": 0.0050358679999931155, "iqr_over_median": 0.015651783275741543 }, "vectorbt": { "samples_s": [ 99.000129775, 99.91466347699998, 99.57081783199999, 98.77557968300005, 98.44118702799994, 98.90509020000002, 98.50235578499996 ], "min_s": 98.44118702799994, "median_s": 98.90509020000002, "max_s": 99.91466347699998, "iqr_s": 1.0684620470000254, "iqr_over_median": 0.010802902508247501 }, "raptorbt": { "samples_s": [ 0.9035892349999699, 0.905373528000041, 0.904816925000091, 0.8981749869999476, 0.8985160949999909, 0.898877296999899, 0.8994789800001399 ], "min_s": 0.8981749869999476, "median_s": 0.8994789800001399, "max_s": 0.905373528000041, "iqr_s": 0.006300830000100177, "iqr_over_median": 0.00700497748162964 } }, "speedup": { "vectorbt": { "median_of_ratios": 307.698409789674, "min": 296.9224194623395, "max": 309.80939026312734 }, "raptorbt": { "median_of_ratios": 2.8084101641528254, "min": 2.69994153510879, "max": 2.822611497651405 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0922024449656378, "vectorbt": 0.9998704046935736, "raptorbt": 0.9986008418150869 } }, { "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.0048959789999116765, 0.004888546000074712, 0.004972762999841507, 0.004702697000084299, 0.015825846000097954, 0.0054333839998435, 0.005020231000116837 ], "min_s": 0.004702697000084299, "median_s": 0.004972762999841507, "max_s": 0.015825846000097954, "iqr_s": 0.000544837999768788, "iqr_over_median": 0.1095644412947396 }, "vectorbt": { "samples_s": [ 0.18151143299996875, 0.18488166700012698, 0.18811562699988826, 0.1911986049999541, 0.18417833200010136, 0.18622987999992802, 0.18950436599993736 ], "min_s": 0.18151143299996875, "median_s": 0.18622987999992802, "max_s": 0.1911986049999541, "iqr_s": 0.0053260339998359996, "iqr_over_median": 0.028599245190074 } }, "speedup": { "vectorbt": { "median_of_ratios": 37.748136688436645, "min": 11.63781904606941, "max": 40.65722392842378 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0033547971859902 } }, { "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.05473372300002666, 0.054536822000045504, 0.05356822899989311, 0.054051924000077634, 0.052198359999920285, 0.05121749200020531, 0.051620961000026 ], "min_s": 0.05121749200020531, "median_s": 0.05356822899989311, "max_s": 0.05473372300002666, "iqr_s": 0.002915861000019504, "iqr_over_median": 0.05443265634235028 }, "vectorbt": { "samples_s": [ 2.2554828490001455, 2.32160071699991, 2.0455224890001773, 2.315093546000071, 2.042998187999956, 2.3009759660001237, 2.0521571520000634 ], "min_s": 2.042998187999956, "median_s": 2.2554828490001455, "max_s": 2.32160071699991, "iqr_s": 0.2695710569998937, "iqr_over_median": 0.11951811432279098 } }, "speedup": { "vectorbt": { "median_of_ratios": 41.2082848630459, "min": 38.18536709519105, "max": 44.92558842965017 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9997501663463275 } }, { "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.0039813280000089435, 0.003687388000116698, 0.003578004000019064, 0.0037989439999819297, 0.00668571799997153, 0.003655769000033615, 0.0035326879999502125 ], "min_s": 0.0035326879999502125, "median_s": 0.003687388000116698, "max_s": 0.00668571799997153, "iqr_s": 0.00040332399998987967, "iqr_over_median": 0.10937932215896871 }, "vectorbt": { "samples_s": [ 0.17644552800015845, 0.3230557110000518, 0.18195427399996333, 0.17985060799992425, 0.177283055000089, 0.17966308800009756, 0.18122035099986533 ], "min_s": 0.17644552800015845, "median_s": 0.17985060799992425, "max_s": 0.3230557110000518, "iqr_s": 0.004671218999874327, "iqr_over_median": 0.025972772913151868 } }, "speedup": { "vectorbt": { "median_of_ratios": 49.14508766786018, "min": 26.516681529320252, "max": 87.61098940220768 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9789401988405265 } }, { "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.0384609120001187, 0.035915725999984716, 0.03618134600014855, 0.037242202999777874, 0.036020176999954856, 0.036429581999982474, 0.03634975299996768 ], "min_s": 0.035915725999984716, "median_s": 0.03634975299996768, "max_s": 0.0384609120001187, "iqr_s": 0.0012220259998230176, "iqr_over_median": 0.03361855030553039 }, "vectorbt": { "samples_s": [ 2.0826293519999126, 2.203784844999973, 2.0856359940000857, 2.1970288970001093, 2.0753685449999466, 2.193081161000009, 2.074696724999967 ], "min_s": 2.074696724999967, "median_s": 2.0856359940000857, "max_s": 2.203784844999973, "iqr_s": 0.12166035200016267, "iqr_over_median": 0.0583324953875713 } }, "speedup": { "vectorbt": { "median_of_ratios": 57.64395813222434, "min": 54.149245134735374, "max": 61.35988577819395 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9998507587618723 } }, { "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.3229244540000309, 0.31889919699983693, 0.3229150720001144, 0.31798327299998164, 0.3189351019998412, 0.3180735190001087, 0.3188503060000585 ], "min_s": 0.31798327299998164, "median_s": 0.31889919699983693, "max_s": 0.3229244540000309, "iqr_s": 0.004841553000005661, "iqr_over_median": 0.015182079621254538 }, "vectorbt": { "samples_s": [ 25.367273596000132, 24.91851582000004, 24.80163867500005, 25.764870866000138, 24.523001781999938, 25.067886242999975, 24.85969646800004 ], "min_s": 24.523001781999938, "median_s": 24.91851582000004, "max_s": 25.764870866000138, "iqr_s": 0.5656349210000826, "iqr_over_median": 0.022699382462662326 } }, "speedup": { "vectorbt": { "median_of_ratios": 78.13916138525987, "min": 76.80545389653186, "max": 81.02586850850368 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.081042000821003, "vectorbt": 0.9998694633565076 } }, { "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.02227130100004615, 0.012896017000002757, 0.013307124999982989, 0.015623138999899311, 0.018572385999959806, 0.01311688900000263, 0.013085992000014812 ], "min_s": 0.012896017000002757, "median_s": 0.013307124999982989, "max_s": 0.02227130100004615, "iqr_s": 0.005486393999944994, "iqr_over_median": 0.41228995744400143 }, "vectorbt": { "samples_s": [ 0.42891496700008247, 0.20736030700004449, 0.20771924700011368, 0.21033216599994375, 0.2139387090001037, 0.21400341999992634, 0.36465912399989975 ], "min_s": 0.20736030700004449, "median_s": 0.2139387090001037, "max_s": 0.42891496700008247, "iqr_s": 0.15693987699978607, "iqr_over_median": 0.7335740116096054 } }, "speedup": { "vectorbt": { "median_of_ratios": 16.079407075843662, "min": 11.519182780315179, "max": 27.866372224550265 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9908345422507613 } }, { "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.14341802100011591, 0.14587604200005444, 0.1439747819999866, 0.14483486800008905, 0.16363966400012941, 0.14317125000002306, 0.14649057899987383 ], "min_s": 0.14317125000002306, "median_s": 0.14483486800008905, "max_s": 0.16363966400012941, "iqr_s": 0.003072557999757919, "iqr_over_median": 0.021214214796370926 }, "vectorbt": { "samples_s": [ 2.5565067089999047, 2.286807359000022, 2.5437298639999426, 2.288696568999967, 2.5330255450001005, 2.2876889350000056, 2.5355352779999976 ], "min_s": 2.286807359000022, "median_s": 2.5330255450001005, "max_s": 2.5565067089999047, "iqr_s": 0.256040928999937, "iqr_over_median": 0.10108106864746477 } }, "speedup": { "vectorbt": { "median_of_ratios": 15.978689401675526, "min": 15.479288352719285, "max": 17.8255611893978 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.2507208539331298, "vectorbt": 0.9992960153911904 } }, { "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.010991447999913362, 0.010809377999976277, 0.010707467999964138, 0.010633620000135124, 0.013683024999863846, 0.011050597999883394, 0.010710762999906365 ], "min_s": 0.010633620000135124, "median_s": 0.010809377999976277, "max_s": 0.013683024999863846, "iqr_s": 0.0003431299999192561, "iqr_over_median": 0.0317437321481411 }, "vectorbt": { "samples_s": [ 0.18317504199990253, 0.18067231800000627, 0.17392761099995369, 0.33920341400016696, 0.18228420800005551, 0.17970991099991807, 0.17375997699991785 ], "min_s": 0.17375997699991785, "median_s": 0.18067231800000627, "max_s": 0.33920341400016696, "iqr_s": 0.009247430999948847, "iqr_over_median": 0.05118344139442837 }, "raptorbt": { "samples_s": [ 0.007785780999938652, 0.007744213000023592, 0.007711743000072602, 0.007797944000003554, 0.007788495999875522, 0.007808533000115858, 0.007783599000049435 ], "min_s": 0.007711743000072602, "median_s": 0.007785780999938652, "max_s": 0.007808533000115858, "iqr_s": 5.373099997996178e-05, "iqr_over_median": 0.0069011702204807915 } }, "speedup": { "vectorbt": { "median_of_ratios": 16.262460276069618, "min": 13.321923185981852, "max": 31.899147608797062 }, "raptorbt": { "median_of_ratios": 0.7164346551707774, "min": 0.5692086362447647, "max": 0.733329195504867 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9980658185206216, "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.10495266099997025, 0.11684381000009125, 0.11480037100000118, 0.11554238899998381, 0.11500177999982952, 0.11438688099997307, 0.11622175799993784 ], "min_s": 0.10495266099997025, "median_s": 0.11500177999982952, "max_s": 0.11684381000009125, "iqr_s": 0.001834876999964763, "iqr_over_median": 0.015955205214801746 }, "vectorbt": { "samples_s": [ 2.040712714999927, 2.314468017000081, 2.066698793000114, 2.3341982450001524, 2.0710454789998494, 2.3247341919998235, 2.0481397460000608 ], "min_s": 2.040712714999927, "median_s": 2.0710454789998494, "max_s": 2.3341982450001524, "iqr_s": 0.2765944459997627, "iqr_over_median": 0.13355305269942014 }, "raptorbt": { "samples_s": [ 0.0862263310000344, 0.07862739900019733, 0.08823097499998767, 0.0789900800000396, 0.08687320099988938, 0.07906726600003822, 0.08717225300006248 ], "min_s": 0.07862739900019733, "median_s": 0.0862263310000344, "max_s": 0.08823097499998767, "iqr_s": 0.008182173000022885, "iqr_over_median": 0.09489181442753977 } }, "speedup": { "vectorbt": { "median_of_ratios": 19.444125528179846, "min": 17.62268770707423, "max": 20.32343369866314 }, "raptorbt": { "median_of_ratios": 0.7500510618683733, "min": 0.6729273805787053, "max": 0.8215735568634972 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 0.9902856115323238, "vectorbt": 1.0006580799244513, "raptorbt": 1.0424009309625302 } }, { "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.0938301109999884, 1.0822019249999357, 1.0741370199998528, 1.0740174619998015, 1.0735488580000947, 1.0734366080000655, 1.0680245089999971 ], "min_s": 1.0680245089999971, "median_s": 1.0740174619998015, "max_s": 1.0938301109999884, "iqr_s": 0.008765316999870265, "iqr_over_median": 0.008161242540274345 }, "vectorbt": { "samples_s": [ 25.34885260200008, 26.449796845000037, 25.433935591999898, 25.150011135000113, 25.19940975999998, 26.0010572220001, 25.222897539000087 ], "min_s": 25.150011135000113, "median_s": 25.34885260200008, "max_s": 26.449796845000037, "iqr_s": 0.801647462000119, "iqr_over_median": 0.031624605444148086 }, "raptorbt": { "samples_s": [ 0.8916911960000107, 0.8841948920000959, 0.8747061929998381, 0.8779344900001433, 0.8752377180001076, 0.8764544499999829, 0.8777472740000576 ], "min_s": 0.8747061929998381, "median_s": 0.8777472740000576, "max_s": 0.8916911960000107, "iqr_s": 0.0089571739999883, "iqr_over_median": 0.010204730069019516 } }, "speedup": { "vectorbt": { "median_of_ratios": 23.61640330016074, "min": 23.174396414106713, "max": 24.440722414166476 }, "raptorbt": { "median_of_ratios": 0.8164939070160065, "min": 0.8143339040674327, "max": 0.8218418834057486 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.022655399306693, "vectorbt": 0.9999107373437759, "raptorbt": 1.0003302692690246 } } ], "cold_start": { "workload": "sma_cross", "bars": 20000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "samples_s": { "manifoldbt": [ 0.46644176499989953, 0.4233923770000274, 0.4149115669999901 ], "vectorbt": [ 7.282435325000051, 7.359608939000054, 7.364390715000127 ], "raptorbt": [ 0.40151585800003886, 0.39548957599981804, 0.3936956680001913 ], "baseline": [ 0.3522295130001112, 0.3622796229999494, 0.35250136200011184 ] }, "median_s": { "manifoldbt": 0.4233923770000274, "vectorbt": 7.359608939000054, "raptorbt": 0.39548957599981804, "baseline": 0.35250136200011184 }, "engine_share_s": { "manifoldbt": 0.07089101499991557, "vectorbt": 7.0071075769999425, "raptorbt": 0.042988213999706204 }, "ratio": { "vectorbt": 17.382478615101704, "raptorbt": 0.9340970633483853 } }, "memory": { "workload": "sma_cross", "bars": 2000000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "manifoldbt": { "before_mb": 728.94464, "peak_mb": 728.956928, "added_mb": 0.012287999999898602, "added_mb_per_million_bars": 0.006143999999949301, "seconds": 0.058185798000067734, "mode": "memory", "engine": "mbt", "workload": "sma_cross", "bars": 2000000 }, "vectorbt": { "before_mb": 613.777408, "peak_mb": 862.683136, "added_mb": 248.90572799999995, "added_mb_per_million_bars": 124.45286399999998, "seconds": 4.335076891999961, "mode": "memory", "engine": "vbt", "workload": "sma_cross", "bars": 2000000 }, "raptorbt": { "before_mb": 330.133504, "peak_mb": 370.663424, "added_mb": 40.529920000000004, "added_mb_per_million_bars": 20.264960000000002, "seconds": 0.16050234499994076, "mode": "memory", "engine": "rbt", "workload": "sma_cross", "bars": 2000000 } }, "sweeps": null, "sweep_reps": null }, "sweeps": { "schema_version": 2, "generated_at": "2026-08-23T13:44:27.708416+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 1000000210", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670", "commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e", "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.005803446000015811 ], "min_s": 0.005803446000015811, "median_s": 0.005803446000015811, "max_s": 0.005803446000015811, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "vectorbt": { "samples_s": [ 0.1942569980000144 ], "min_s": 0.1942569980000144, "median_s": 0.1942569980000144, "max_s": 0.1942569980000144, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "raptorbt": { "samples_s": [ 0.01128670600002124 ], "min_s": 0.01128670600002124, "median_s": 0.01128670600002124, "max_s": 0.01128670600002124, "iqr_s": 0.0, "iqr_over_median": 0.0 } }, "speedup": { "vectorbt": { "median_of_ratios": 33.472698462169745, "min": 33.472698462169745, "max": 33.472698462169745 }, "raptorbt": { "median_of_ratios": 1.9448282968413062, "min": 1.9448282968413062, "max": 1.9448282968413062 } }, "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.45537921499999356, "vectorbt": 5.481004186999996, "raptorbt": 6.752745947999983 }, "ratio": { "vectorbt": 12.036131660071648, "raptorbt": 14.828840943037067 }, "reps": 2, "per_combo_us": 91.07584299999871 }, "memory": { "manifoldbt": 36.0, "vectorbt": 2530.7, "raptorbt": 32.8 }, "memory_baseline_mb": 2177.5, "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.9211620379999772, "raptorbt": 26.626413162999995, "vectorbt": null }, "ratio": { "raptorbt": 13.859535341807701 }, "reps": 2, "per_combo_us": 96.05810189999886 }, "memory": { "manifoldbt": 64.2, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 612.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.693729294000036, "raptorbt": 156.93451893400004, "vectorbt": null }, "ratio": { "raptorbt": 16.189282181743526 }, "reps": 2, "per_combo_us": 969.3729294000036 }, "memory": { "manifoldbt": 100.8, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 1729.4, "tier_after": { "pro": true, "budget_used": 0, "budget_limit": 256 } } ], "sweep_reps": 2 } }