Files
manifoldbt/benchmarks/vs_vectorbt/results/latest.json
T

2497 lines
82 KiB
JSON
Raw Normal View History

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