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

2497 lines
82 KiB
JSON

{
"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
}
}