{ "repo": "manifoldbt/manifoldbt", "run_id": "32713305381", "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381", "commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7", "run_started_at": "", "conclusion": "success", "synced_at": "2026-08-24T10:15:18.247339+00:00", "backtests": { "schema_version": 2, "generated_at": "2026-08-24T10:15:09.228209+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.1", "vectorbt": "0.28.4", "raptorbt": "0.9.0", "numpy": "2.4.3", "numba": "0.64.0", "pandas": "2.3.3" }, "runner": "GitHub Actions 1000000221", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381", "commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7", "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.005086016000007021, 0.0032640149999991763, 0.003371505000004049, 0.003337901999998394, 0.003271808999997461, 0.003305723000011085, 0.003306945000005612 ], "min_s": 0.0032640149999991763, "median_s": 0.003306945000005612, "max_s": 0.005086016000007021, "iqr_s": 9.969600000658829e-05, "iqr_over_median": 0.030147462387919696 }, "vectorbt": { "samples_s": [ 0.18361185099999489, 0.17885441299999627, 0.1857335680000034, 0.17952656899998942, 0.18028834999999788, 0.32503587800000844, 0.17677236500000504 ], "min_s": 0.17677236500000504, "median_s": 0.18028834999999788, "max_s": 0.32503587800000844, "iqr_s": 0.006879155000007131, "iqr_over_median": 0.0381564033394682 }, "raptorbt": { "samples_s": [ 0.009773237000004542, 0.009820387000004871, 0.008156228999993687, 0.007777633000003448, 0.00757018599999526, 0.007587787999995044, 0.007597254999993197 ], "min_s": 0.00757018599999526, "median_s": 0.007777633000003448, "max_s": 0.009820387000004871, "iqr_s": 0.0021854490000094984, "iqr_over_median": 0.2809915304577279 } }, "speedup": { "vectorbt": { "median_of_ratios": 54.795830595153944, "min": 36.10131210750053, "max": 98.32520087101022 }, "raptorbt": { "median_of_ratios": 2.31376159182921, "min": 1.9215899045522173, "max": 3.0086831708822874 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0072186409523143, "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.003255979000002185, 0.004720033000012336, 0.004896713000007935, 0.00478545599999336, 0.004877547000006643, 0.0050088329999908865, 0.0033084580000064534 ], "min_s": 0.003255979000002185, "median_s": 0.00478545599999336, "max_s": 0.0050088329999908865, "iqr_s": 0.0015882550000014817, "iqr_over_median": 0.33189209137095516 }, "vectorbt": { "samples_s": [ 0.6878645719999952, 0.9081481260000004, 0.8173868140000025, 0.8253067410000057, 0.6771847520000023, 0.6831418059999947, 0.820317715999991 ], "min_s": 0.6771847520000023, "median_s": 0.8173868140000025, "max_s": 0.9081481260000004, "iqr_s": 0.14216493500001093, "iqr_over_median": 0.17392614190129388 }, "raptorbt": { "samples_s": [ 0.010578843000004667, 0.008162831000007031, 0.007974630000006755, 0.007688956999999164, 0.010505968000003918, 0.007584362000002898, 0.007647280000000478 ], "min_s": 0.007584362000002898, "median_s": 0.007974630000006755, "max_s": 0.010578843000004667, "iqr_s": 0.00285868800000344, "iqr_over_median": 0.3584728068889739 } }, "speedup": { "vectorbt": { "median_of_ratios": 172.4614626069388, "min": 136.3874191855144, "max": 247.94563388696213 }, "raptorbt": { "median_of_ratios": 1.7294012563017458, "min": 1.514197418843211, "max": 3.249051360588495 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9945841246374895, "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.036878396000005864, 0.03571583599999428, 0.03574679599998376, 0.03707817700001215, 0.0378416449999861, 0.03753157099998816, 0.035101703000009365 ], "min_s": 0.035101703000009365, "median_s": 0.036878396000005864, "max_s": 0.0378416449999861, "iqr_s": 0.0018157349999938788, "iqr_over_median": 0.04923573682525645 }, "vectorbt": { "samples_s": [ 2.1526621960000085, 2.043684607000003, 2.0278536129999907, 2.272070284999984, 2.011077475999997, 2.2560072160000004, 1.9949298709999823 ], "min_s": 1.9949298709999823, "median_s": 2.043684607000003, "max_s": 2.272070284999984, "iqr_s": 0.24492974000000345, "iqr_over_median": 0.11984713255708497 }, "raptorbt": { "samples_s": [ 0.08223053499999367, 0.08242296100000601, 0.0776152770000067, 0.08192856700000561, 0.07690396999998939, 0.08210328799998479, 0.07704403600001797 ], "min_s": 0.07690396999998939, "median_s": 0.08192856700000561, "max_s": 0.08242296100000601, "iqr_s": 0.005186498999975697, "iqr_over_median": 0.06330513506937503 } }, "speedup": { "vectorbt": { "median_of_ratios": 57.2206851605078, "min": 53.14455743138903, "max": 61.27783156650985 }, "raptorbt": { "median_of_ratios": 2.194880288286794, "min": 2.032257582883028, "max": 2.3077427335039618 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.0001161880238378, "raptorbt": 0.9995562077532977 } }, { "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.037138538999997195, 0.03594979999999737, 0.03583431600000608, 0.03592240099999344, 0.03758607800000391, 0.03689630000002353, 0.03835280999999213 ], "min_s": 0.03583431600000608, "median_s": 0.03689630000002353, "max_s": 0.03835280999999213, "iqr_s": 0.0016636770000104661, "iqr_over_median": 0.04509061884279467 }, "vectorbt": { "samples_s": [ 8.163776672000012, 8.496581371999994, 8.350863197999985, 8.325415729000014, 8.292014292000005, 8.267167305000015, 8.279689720999983 ], "min_s": 8.163776672000012, "median_s": 8.292014292000005, "max_s": 8.496581371999994, "iqr_s": 0.0836958929999696, "iqr_over_median": 0.010093553876374523 }, "raptorbt": { "samples_s": [ 0.08701218100000574, 0.08703576599998541, 0.08671125800000823, 0.08601961200000119, 0.08658772300000805, 0.08563197399999467, 0.08672109099998693 ], "min_s": 0.08563197399999467, "median_s": 0.08671125800000823, "max_s": 0.08703576599998541, "iqr_s": 0.0009925690000045506, "iqr_over_median": 0.011446829660855069 } }, "speedup": { "vectorbt": { "median_of_ratios": 224.0649416064685, "min": 215.88221882573092, "max": 236.3457201987387 }, "raptorbt": { "median_of_ratios": 2.342908023388112, "min": 2.2611404744529726, "max": 2.4210361670994494 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9999053160142127, "raptorbt": 0.9740480498398478 } }, { "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.32351850399999194, 0.3202701980000029, 0.32139288899998064, 0.31894670599990604, 0.3200021860000106, 0.31976874500003305, 0.31871445799993126 ], "min_s": 0.31871445799993126, "median_s": 0.3200021860000106, "max_s": 0.32351850399999194, "iqr_s": 0.0024461830000745977, "iqr_over_median": 0.007644269655315781 }, "vectorbt": { "samples_s": [ 24.966537722999988, 25.087499501000025, 25.178886218000002, 24.910972221000065, 24.944502747, 24.874792727, 24.801107568999896 ], "min_s": 24.801107568999896, "median_s": 24.944502747, "max_s": 25.178886218000002, "iqr_s": 0.2127067740000257, "iqr_over_median": 0.008527200407937868 }, "raptorbt": { "samples_s": [ 0.9003745869999875, 0.8885115830000245, 0.8903806420000819, 0.887415371999964, 0.8909642070000245, 0.8898108550000643, 0.896099920000097 ], "min_s": 0.887415371999964, "median_s": 0.8903806420000819, "max_s": 0.9003745869999875, "iqr_s": 0.007588337000072443, "iqr_over_median": 0.008522576347826466 } }, "speedup": { "vectorbt": { "median_of_ratios": 77.95103858134011, "min": 77.17190026014899, "max": 78.34300969241892 }, "raptorbt": { "median_of_ratios": 2.7826698791339735, "min": 2.7703806539420217, "max": 2.811607373018171 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0835571080165156, "vectorbt": 0.9998609629874063, "raptorbt": 1.0026335682628353 } }, { "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.32074174399997446, 0.3292579920000094, 0.32045135600003505, 0.32179833999998664, 0.31892916099991453, 0.3199751650000735, 0.32104021800000737 ], "min_s": 0.31892916099991453, "median_s": 0.32074174399997446, "max_s": 0.3292579920000094, "iqr_s": 0.0018231749999131353, "iqr_over_median": 0.005684246076535895 }, "vectorbt": { "samples_s": [ 98.03886155999999, 98.29277811900005, 98.024604566, 97.924379467, 97.93534395500001, 97.4675261079999, 97.86300137600006 ], "min_s": 97.4675261079999, "median_s": 97.93534395500001, "max_s": 98.29277811900005, "iqr_s": 0.1758601839999301, "iqr_over_median": 0.0017956763809471635 }, "raptorbt": { "samples_s": [ 0.8999588449999578, 0.9001707470000611, 0.8982293809999646, 0.897499420000031, 0.9007717609999872, 0.8987831899999037, 0.8962689560000854 ], "min_s": 0.8962689560000854, "median_s": 0.8987831899999037, "max_s": 0.9007717609999872, "iqr_s": 0.0026713270000300327, "iqr_over_median": 0.002972159503817955 } }, "speedup": { "vectorbt": { "median_of_ratios": 304.83097097821496, "min": 298.5281466425187, "max": 307.07553880601796 }, "raptorbt": { "median_of_ratios": 2.803013200542882, "min": 2.733937425579742, "max": 2.8243631224434464 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0922682620656068, "vectorbt": 0.999859243462431, "raptorbt": 0.9997326152339213 } }, { "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.00484398899993721, 0.004881091000015658, 0.004743271000052118, 0.004768868999917686, 0.017285433000097328, 0.004837667999936457, 0.004986926999890784 ], "min_s": 0.004743271000052118, "median_s": 0.00484398899993721, "max_s": 0.017285433000097328, "iqr_s": 0.00021805799997309805, "iqr_over_median": 0.04501620461481738 }, "vectorbt": { "samples_s": [ 0.18274148899990905, 0.18636382799991225, 0.1908901040001183, 0.34402032499997404, 0.1837524590000612, 0.18440214299994295, 0.18748917100015206 ], "min_s": 0.18274148899990905, "median_s": 0.18636382799991225, "max_s": 0.34402032499997404, "iqr_s": 0.007137645000057091, "iqr_over_median": 0.03829951915379444 } }, "speedup": { "vectorbt": { "median_of_ratios": 38.117982259709656, "min": 10.630480532308711, "max": 72.13876602731425 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 1.000233260562006 } }, { "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.05468129000018962, 0.05192759400006253, 0.05483863199992811, 0.054464268999936394, 0.05389681199994811, 0.052467804999878354, 0.051793465999935506 ], "min_s": 0.051793465999935506, "median_s": 0.05389681199994811, "max_s": 0.05483863199992811, "iqr_s": 0.0027536960001270927, "iqr_over_median": 0.051092001510771055 }, "vectorbt": { "samples_s": [ 2.040135706000001, 2.2946230769998692, 2.0383569709999847, 2.2844864599999255, 2.0221348820000458, 2.278572961000009, 2.023895618000097 ], "min_s": 2.0221348820000458, "median_s": 2.040135706000001, "max_s": 2.2946230769998692, "iqr_s": 0.2605908419998286, "iqr_over_median": 0.12773211175777957 } }, "speedup": { "vectorbt": { "median_of_ratios": 39.07627301873593, "min": 37.170091533331046, "max": 44.18889650456569 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9998527803550585 } }, { "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.003871248999985255, 0.003302136000002065, 0.0033703130000048986, 0.0035228179999649, 0.005218563999960679, 0.003723248999904172, 0.003339085000106934 ], "min_s": 0.003302136000002065, "median_s": 0.0035228179999649, "max_s": 0.005218563999960679, "iqr_s": 0.0005321639998783212, "iqr_over_median": 0.15106201906644723 }, "vectorbt": { "samples_s": [ 0.17765502999986893, 0.33669244599991544, 0.18637438899986591, 0.1779633249998369, 0.17972546500004682, 0.1834427849998974, 0.18913354100004653 ], "min_s": 0.17765502999986893, "median_s": 0.1834427849998974, "max_s": 0.33669244599991544, "iqr_s": 0.01117021600020962, "iqr_over_median": 0.06089209777433257 } }, "speedup": { "vectorbt": { "median_of_ratios": 50.51732022534518, "min": 34.439639908871676, "max": 101.96201670667256 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9923220957665657 } }, { "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.0406119189999572, 0.03566852800008746, 0.03565877999994882, 0.034294702999886795, 0.03435004600009961, 0.035560656999905405, 0.038307935999910114 ], "min_s": 0.034294702999886795, "median_s": 0.03565877999994882, "max_s": 0.0406119189999572, "iqr_s": 0.003957889999810504, "iqr_over_median": 0.11099342153085959 }, "vectorbt": { "samples_s": [ 2.049106897999991, 2.1562171769999168, 2.0434591430000637, 2.1485062799999923, 2.043331909000017, 2.165936456000054, 2.1759491909999724 ], "min_s": 2.043331909000017, "median_s": 2.1485062799999923, "max_s": 2.1759491909999724, "iqr_s": 0.12247731299999032, "iqr_over_median": 0.057005797069390345 } }, "speedup": { "vectorbt": { "median_of_ratios": 59.48556543400528, "min": 50.45580086974345, "max": 62.648341932195315 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9984774535254388 } }, { "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.33108427800016216, 0.31927832199994555, 0.32159976499997356, 0.31982600300011654, 0.32315278700002636, 0.31991790799997943, 0.3188191829999596 ], "min_s": 0.3188191829999596, "median_s": 0.31991790799997943, "max_s": 0.33108427800016216, "iqr_s": 0.003874465000080818, "iqr_over_median": 0.012110810002174267 }, "vectorbt": { "samples_s": [ 24.860258039999962, 25.55476604500018, 24.87219184399987, 24.9671859529999, 24.799834751000162, 24.951896657999896, 24.55627262400003 ], "min_s": 24.55627262400003, "median_s": 24.87219184399987, "max_s": 25.55476604500018, "iqr_s": 0.16735120199973608, "iqr_over_median": 0.006728446091497466 } }, "speedup": { "vectorbt": { "median_of_ratios": 77.33896150080183, "min": 75.0874012809143, "max": 80.03915168723712 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0959860860280388, "vectorbt": 0.9998143591409021 } }, { "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.023109289999865723, 0.01271814199981236, 0.013359569999920495, 0.013076972000135356, 0.01802267500011112, 0.013018533000149546, 0.012592148999829078 ], "min_s": 0.012592148999829078, "median_s": 0.013076972000135356, "max_s": 0.023109289999865723, "iqr_s": 0.005304533000298761, "iqr_over_median": 0.40563924127419215 }, "vectorbt": { "samples_s": [ 0.41095788000006905, 0.21117583900013415, 0.21494155900018086, 0.21643066900014674, 0.21761884700003975, 0.21590418599998884, 0.3576757230000567 ], "min_s": 0.21117583900013415, "median_s": 0.21643066900014674, "max_s": 0.41095788000006905, "iqr_s": 0.14273416399987582, "iqr_over_median": 0.6594913958325336 } }, "speedup": { "vectorbt": { "median_of_ratios": 16.58437137252782, "min": 12.074725144780006, "max": 28.404660952226 } }, "noisy": true, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9974496172785567 } }, { "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.14334547500016015, 0.14099054200005412, 0.14265404699995088, 0.14506040900005246, 0.14237165400004415, 0.14354739600003086, 0.14592469600006552 ], "min_s": 0.14099054200005412, "median_s": 0.14334547500016015, "max_s": 0.14592469600006552, "iqr_s": 0.002688755000008314, "iqr_over_median": 0.018757166907468197 }, "vectorbt": { "samples_s": [ 2.548502177999808, 2.2950072179999097, 2.5687573969998994, 2.3378954519998842, 2.5308834439999828, 2.2760534960000314, 2.5351989760001743 ], "min_s": 2.2760534960000314, "median_s": 2.5308834439999828, "max_s": 2.5687573969998994, "iqr_s": 0.25349495999989813, "iqr_over_median": 0.10016066152744561 } }, "speedup": { "vectorbt": { "median_of_ratios": 17.373337382173034, "min": 15.855763040101, "max": 18.006901668908025 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.2650735266363864, "vectorbt": 0.9992804852288221 } }, { "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.007959955000160335, 0.007891016000030504, 0.007931120999955965, 0.007959473000028083, 0.010777479000125822, 0.008580210999980409, 0.008099854999954914 ], "min_s": 0.007891016000030504, "median_s": 0.007959955000160335, "max_s": 0.010777479000125822, "iqr_s": 0.0006490900000244437, "iqr_over_median": 0.08154443084305996 }, "vectorbt": { "samples_s": [ 0.18156059499983712, 0.17893430799995258, 0.17498802799991608, 0.3380797410000014, 0.18128034300002582, 0.1753626570000506, 0.18014177999998537 ], "min_s": 0.17498802799991608, "median_s": 0.18014177999998537, "max_s": 0.3380797410000014, "iqr_s": 0.006197937999786518, "iqr_over_median": 0.034405888516184424 }, "raptorbt": { "samples_s": [ 0.00758355300013136, 0.007616654999992534, 0.007598629999847617, 0.007624738999993497, 0.007543028000100094, 0.007516827999779707, 0.007618218000061461 ], "min_s": 0.007516827999779707, "median_s": 0.007598629999847617, "max_s": 0.007624738999993497, "iqr_s": 7.5189999961367e-05, "iqr_over_median": 0.0098952047886099 } }, "speedup": { "vectorbt": { "median_of_ratios": 22.24012405172538, "min": 16.820291925218267, "max": 42.47514138169807 }, "raptorbt": { "median_of_ratios": 0.9527130492545004, "min": 0.6998879793699465, "max": 0.9652312199041404 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": null, "vectorbt": 0.9855727381427762, "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.07556033000014395, 0.086905655999999, 0.08652868299986949, 0.08505993099993248, 0.08579243899998801, 0.08698165699979654, 0.08476480800004538 ], "min_s": 0.07556033000014395, "median_s": 0.08579243899998801, "max_s": 0.08698165699979654, "iqr_s": 0.002140847999953621, "iqr_over_median": 0.024953807408994638 }, "vectorbt": { "samples_s": [ 2.0287785399998484, 2.2871528539999417, 2.0491359790000843, 2.2847077960000206, 2.020059084999957, 2.2943602479999754, 2.0258624880000298 ], "min_s": 2.020059084999957, "median_s": 2.0491359790000843, "max_s": 2.2943602479999754, "iqr_s": 0.26129036599991196, "iqr_over_median": 0.12751245826419663 }, "raptorbt": { "samples_s": [ 0.07557534700003998, 0.08625597499985815, 0.07516399199994339, 0.08486126000002514, 0.07653187899995828, 0.08565653300001941, 0.07646637699986059 ], "min_s": 0.07516399199994339, "median_s": 0.07653187899995828, "max_s": 0.08625597499985815, "iqr_s": 0.010081185999979425, "iqr_over_median": 0.13172531671390064 } }, "speedup": { "vectorbt": { "median_of_ratios": 26.317652489729415, "min": 23.545887126489543, "max": 26.859977067249613 }, "raptorbt": { "median_of_ratios": 0.9847654776250097, "min": 0.8686598408074322, "max": 1.000198741851657 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0480169166975069, "vectorbt": 0.9999961981465524, "raptorbt": 0.9990876848650796 } }, { "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": [ 0.8068502040000567, 0.7967224879998867, 0.7939243590001297, 0.7900002689998473, 0.7876182999998491, 0.7906549809999888, 0.7919537610000589 ], "min_s": 0.7876182999998491, "median_s": 0.7919537610000589, "max_s": 0.8068502040000567, "iqr_s": 0.006722219000039331, "iqr_over_median": 0.008488145812390215 }, "vectorbt": { "samples_s": [ 24.9078087649998, 25.90321060400015, 25.31438572000002, 24.825181309000072, 24.855272518999982, 25.89725853599998, 25.41575723899996 ], "min_s": 24.825181309000072, "median_s": 25.31438572000002, "max_s": 25.90321060400015, "iqr_s": 1.0419860169999993, "iqr_over_median": 0.04116181322846646 }, "raptorbt": { "samples_s": [ 0.8893825309999102, 0.8786584000001767, 0.8827479530000346, 0.8890934060000291, 0.8824379769998814, 0.8857742300001519, 0.8819613980001577 ], "min_s": 0.8786584000001767, "median_s": 0.8827479530000346, "max_s": 0.8893825309999102, "iqr_s": 0.007132007999871348, "iqr_over_median": 0.008079325446899188 } }, "speedup": { "vectorbt": { "median_of_ratios": 31.885135445246974, "min": 30.870425069630457, "max": 32.754183756922856 }, "raptorbt": { "median_of_ratios": 1.1136526416472088, "min": 1.1022895285775347, "max": 1.12543430792199 } }, "noisy": false, "cpu_over_wall": { "manifoldbt": 1.0363954066133985, "vectorbt": 0.9998934348920596, "raptorbt": 1.0016064644921072 } } ], "cold_start": { "workload": "sma_cross", "bars": 20000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "samples_s": { "manifoldbt": [ 0.4424554540000827, 0.41451248299995314, 0.413940496999885 ], "vectorbt": [ 7.340981547999945, 7.887811972999998, 7.206707354000173 ], "raptorbt": [ 0.40212875299994266, 0.3889863320000586, 0.3910420580000391 ], "baseline": [ 0.3473758520001411, 0.3551300369999808, 0.3489620369998647 ] }, "median_s": { "manifoldbt": 0.41451248299995314, "vectorbt": 7.340981547999945, "raptorbt": 0.3910420580000391, "baseline": 0.3489620369998647 }, "engine_share_s": { "manifoldbt": 0.06555044600008841, "vectorbt": 6.9920195110000805, "raptorbt": 0.042080021000174384 }, "ratio": { "vectorbt": 17.709916707142387, "raptorbt": 0.9433782432074146 } }, "memory": { "workload": "sma_cross", "bars": 2000000, "engines": [ "manifoldbt", "vectorbt", "raptorbt" ], "manifoldbt": { "before_mb": 728.674304, "peak_mb": 728.686592, "added_mb": 0.012288000000012289, "added_mb_per_million_bars": 0.0061440000000061445, "seconds": 0.05825765299982777, "mode": "memory", "engine": "mbt", "workload": "sma_cross", "bars": 2000000 }, "vectorbt": { "before_mb": 614.281216, "peak_mb": 864.681984, "added_mb": 250.40076800000008, "added_mb_per_million_bars": 125.20038400000004, "seconds": 4.3868381639999825, "mode": "memory", "engine": "vbt", "workload": "sma_cross", "bars": 2000000 }, "raptorbt": { "before_mb": 330.174464, "peak_mb": 370.70848, "added_mb": 40.53401600000001, "added_mb_per_million_bars": 20.267008000000004, "seconds": 0.161842740000111, "mode": "memory", "engine": "rbt", "workload": "sma_cross", "bars": 2000000 } }, "sweeps": null, "sweep_reps": null }, "sweeps": { "schema_version": 2, "generated_at": "2026-08-24T09:59:57.098825+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.1", "vectorbt": "0.28.4", "raptorbt": "0.9.0", "numpy": "2.4.3", "numba": "0.64.0", "pandas": "2.3.3" }, "runner": "GitHub Actions 1000000222", "ci": true, "run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381", "commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7", "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.005212192999806575 ], "min_s": 0.005212192999806575, "median_s": 0.005212192999806575, "max_s": 0.005212192999806575, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "vectorbt": { "samples_s": [ 0.18328484499988917 ], "min_s": 0.18328484499988917, "median_s": 0.18328484499988917, "max_s": 0.18328484499988917, "iqr_s": 0.0, "iqr_over_median": 0.0 }, "raptorbt": { "samples_s": [ 0.011166662000050565 ], "min_s": 0.011166662000050565, "median_s": 0.011166662000050565, "max_s": 0.011166662000050565, "iqr_s": 0.0, "iqr_over_median": 0.0 } }, "speedup": { "vectorbt": { "median_of_ratios": 35.164631280286606, "min": 35.164631280286606, "max": 35.164631280286606 }, "raptorbt": { "median_of_ratios": 2.1424114572244273, "min": 2.1424114572244273, "max": 2.1424114572244273 } }, "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.4702996930000154, "vectorbt": 5.237195704999976, "raptorbt": 6.737781942999845 }, "ratio": { "vectorbt": 11.135868857562288, "raptorbt": 14.326570999908403 }, "reps": 2, "per_combo_us": 94.05993860000308 }, "memory": { "manifoldbt": 38.4, "vectorbt": 2531.8, "raptorbt": 35.1 }, "memory_baseline_mb": 2173.6, "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.9359811260001152, "raptorbt": 26.944831631999932, "vectorbt": null }, "ratio": { "raptorbt": 13.917920619231454 }, "reps": 2, "per_combo_us": 96.79905630000576 }, "memory": { "manifoldbt": 61.6, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 613.2, "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.608373389000008, "raptorbt": 151.70980005299998, "vectorbt": null }, "ratio": { "raptorbt": 15.789332274147725 }, "reps": 2, "per_combo_us": 960.8373389000008 }, "memory": { "manifoldbt": 81.6, "vectorbt": null, "raptorbt": null }, "memory_baseline_mb": 1755.2, "tier_after": { "pro": true, "budget_used": 0, "budget_limit": 256 } } ], "sweep_reps": 2 } }