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

2485 lines
82 KiB
JSON

{
"repo": "manifoldbt/manifoldbt",
"run_id": "38254074977",
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/38254074977",
"commit": "4a1e4cd4e901d90a225c6d1593945a30a758dbc3",
"run_started_at": "",
"conclusion": "success",
"synced_at": "2026-10-12T13:41:45.762399+00:00",
"backtests": {
"schema_version": 2,
"generated_at": "2026-10-12T13:41:34.466819+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.15",
"versions": {
"manifoldbt": "0.27.0",
"vectorbt": "0.28.4",
"raptorbt": "0.9.0",
"numpy": "2.4.3",
"numba": "0.64.0",
"pandas": "2.3.3"
},
"runner": "GitHub Actions 1000000713",
"ci": true,
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/38254074977",
"commit": "4a1e4cd4e901d90a225c6d1593945a30a758dbc3",
"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.005995979999994461,
0.005250684000003503,
0.0026280280000037237,
0.0028111910000063745,
0.004924637000002008,
0.005021819000006644,
0.002733404999986533
],
"min_s": 0.0026280280000037237,
"median_s": 0.004924637000002008,
"max_s": 0.005995979999994461,
"iqr_s": 0.00251727900001697,
"iqr_over_median": 0.5111603149665536
},
"vectorbt": {
"samples_s": [
0.18590004699998985,
0.17957753599999648,
0.3226077149999895,
0.1797342850000092,
0.17888035700001126,
0.18150549000000638,
0.30617199600000333
],
"min_s": 0.17888035700001126,
"median_s": 0.18150549000000638,
"max_s": 0.3226077149999895,
"iqr_s": 0.12659446000000685,
"iqr_over_median": 0.6974690407436293
},
"raptorbt": {
"samples_s": [
0.010136455000008482,
0.009021035999992932,
0.007766714999988267,
0.008093607000006386,
0.008246103000004723,
0.0076796329999950785,
0.007701913999994758
],
"min_s": 0.0076796329999950785,
"median_s": 0.008093607000006386,
"max_s": 0.010136455000008482,
"iqr_s": 0.001319121999998174,
"iqr_over_median": 0.16298320390366533
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 36.32356191937362,
"min": 31.004113923022025,
"max": 122.75657451120476
},
"raptorbt": {
"median_of_ratios": 1.7180687316141887,
"min": 1.5292532446878149,
"max": 2.955339516921913
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.003664400886447,
"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.0191599205412123,
"sortino": 0.026757853601622573,
"volatility": 0.006633443246116591
}
},
"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.0737338994486025,
"sortino": 3.9123948298469102,
"volatility": 0.16947108402059763
},
"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.0737338994486025,
"sortino": 3.9123948298469102,
"volatility": 0.16947108402059763
},
"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.002726756999990698,
0.0027759090000074593,
0.005257089000011206,
0.0027428040000074816,
0.002886141000004727,
0.0027474409999967975,
0.005190023000011479
],
"min_s": 0.002726756999990698,
"median_s": 0.0027759090000074593,
"max_s": 0.005257089000011206,
"iqr_s": 0.0024472190000039973,
"iqr_over_median": 0.8815919397924864
},
"vectorbt": {
"samples_s": [
0.8228732600000086,
0.6776811940000016,
0.673619880000004,
0.8275165399999906,
0.8216424270000005,
0.6813722290000044,
0.6752838040000029
],
"min_s": 0.673619880000004,
"median_s": 0.6813722290000044,
"max_s": 0.8275165399999906,
"iqr_s": 0.14758945600000573,
"iqr_over_median": 0.21660620981957393
},
"raptorbt": {
"samples_s": [
0.008370065999997678,
0.010702378999994266,
0.008259978000012325,
0.007737320000003933,
0.007796662000004062,
0.01054992500000651,
0.007686255000010078
],
"min_s": 0.007686255000010078,
"median_s": 0.008259978000012325,
"max_s": 0.010702378999994266,
"iqr_s": 0.002812605000002577,
"iqr_over_median": 0.34050998683027733
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 248.0024972331703,
"min": 128.13552899685894,
"max": 301.7772614144992
},
"raptorbt": {
"median_of_ratios": 2.8209525726165006,
"min": 1.4809674253838718,
"max": 3.8554502326861244
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 0.9980715531720422,
"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.03099757199998976,
0.027700979000002235,
0.0276157410000053,
0.027908155999995188,
0.028664136000003282,
0.028022832000004883,
0.028435134000005746
],
"min_s": 0.0276157410000053,
"median_s": 0.028022832000004883,
"max_s": 0.03099757199998976,
"iqr_s": 0.000963157000001047,
"iqr_over_median": 0.03437043764887429
},
"vectorbt": {
"samples_s": [
2.0708896849999974,
2.201196949000007,
2.066859115999989,
2.1760767939999823,
2.081114229999997,
2.1541896690000044,
2.2769146320000004
],
"min_s": 2.066859115999989,
"median_s": 2.1541896690000044,
"max_s": 2.2769146320000004,
"iqr_s": 0.13030726400000958,
"iqr_over_median": 0.06049015361794928
},
"raptorbt": {
"samples_s": [
0.08661566600000015,
0.08410947000001556,
0.08607320799998774,
0.08432839900001454,
0.08683526599998004,
0.08496823199999426,
0.08681096199998706
],
"min_s": 0.08410947000001556,
"median_s": 0.08607320799998774,
"max_s": 0.08683526599998004,
"iqr_s": 0.002482562999972515,
"iqr_over_median": 0.028842459316409684
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 76.87266115714604,
"min": 66.80812564934703,
"max": 80.07398987462273
},
"raptorbt": {
"median_of_ratios": 3.032107247403812,
"min": 2.7942725965772017,
"max": 3.116816890771507
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 0.9988526786178551,
"raptorbt": 1.0337792316064274
}
},
{
"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.004351997254330881,
"sortino": 0.00576256739777853,
"volatility": 0.0003655041635125006
}
},
"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.682796489575399,
"sortino": 1.3440329806486555,
"volatility": 0.1611746170233167
},
"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.682796489575399,
"sortino": 1.3440329806486555,
"volatility": 0.1611746170233167
},
"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.02903105900000469,
0.02813227699999743,
0.027737054999988686,
0.026464351999976543,
0.028235042000005706,
0.02720323700000904,
0.02831968799998208
],
"min_s": 0.026464351999976543,
"median_s": 0.02813227699999743,
"max_s": 0.02903105900000469,
"iqr_s": 0.0011164509999730399,
"iqr_over_median": 0.039685767347347745
},
"vectorbt": {
"samples_s": [
8.28950264400001,
8.218758906999994,
8.24049762300001,
8.222803513999992,
8.175147801000008,
8.164941682999995,
8.366579629
],
"min_s": 8.164941682999995,
"median_s": 8.222803513999992,
"max_s": 8.366579629,
"iqr_s": 0.11435484300000098,
"iqr_over_median": 0.013907038251042064
},
"raptorbt": {
"samples_s": [
0.08969521999998165,
0.08891130000000658,
0.08979910599998675,
0.08957000699999185,
0.09010917000000518,
0.08916037299999857,
0.08907407200001671
],
"min_s": 0.08891130000000658,
"median_s": 0.08957000699999185,
"max_s": 0.09010917000000518,
"iqr_s": 0.0007250339999700373,
"iqr_over_median": 0.008094606936561959
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 295.43332641960234,
"min": 285.53910637564655,
"max": 310.7124449526397
},
"raptorbt": {
"median_of_ratios": 3.1913949339968033,
"min": 3.0896296273576227,
"max": 3.384553190649491
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 0.9998572806283589,
"raptorbt": 1.0218430968610879
}
},
{
"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.2356476740000062,
0.23726862799998116,
0.23348058900000979,
0.23831430000007003,
0.23529531500003031,
0.2381684160000077,
0.23331394900014857
],
"min_s": 0.23331394900014857,
"median_s": 0.2356476740000062,
"max_s": 0.23831430000007003,
"iqr_s": 0.004687826999997924,
"iqr_over_median": 0.01989337267974816
},
"vectorbt": {
"samples_s": [
24.98517939499999,
24.743131249000044,
24.75932831500006,
25.598791259999985,
24.38757518500006,
24.86295758299991,
24.822206583000025
],
"min_s": 24.38757518500006,
"median_s": 24.822206583000025,
"max_s": 25.598791259999985,
"iqr_s": 0.24204814599994506,
"iqr_over_median": 0.009751274335365353
},
"raptorbt": {
"samples_s": [
0.8915295420000007,
0.8991868519999571,
0.8915785430000369,
0.8909171110000216,
0.8910648419999916,
0.89374473700002,
0.8980560429999969
],
"min_s": 0.8909171110000216,
"median_s": 0.8915785430000369,
"max_s": 0.8991868519999571,
"iqr_s": 0.006991201000005276,
"iqr_over_median": 0.007841374217554478
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 106.02769367882381,
"min": 103.64666710425968,
"max": 107.41609404048545
},
"raptorbt": {
"median_of_ratios": 3.7870063073711298,
"min": 3.738412302575883,
"max": 3.849131382193634
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": 1.1202013119709855,
"vectorbt": 1.0000047682243898,
"raptorbt": 0.997430071868006
}
},
{
"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.001418190244680208,
"sortino": 0.0015630368843009169,
"volatility": 0.00027126004230981933
}
},
"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.16628266067296482,
"sortino": 0.3236304628541403,
"volatility": 0.15595531092911707
},
"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.16628266067296482,
"sortino": 0.3236304628541403,
"volatility": 0.15595531092911707
},
"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.23394205400001056,
0.2357642910000095,
0.23478706700007024,
0.23098874200002228,
0.23291780799991102,
0.2334641869999814,
0.23737588700009837
],
"min_s": 0.23098874200002228,
"median_s": 0.23394205400001056,
"max_s": 0.23737588700009837,
"iqr_s": 0.0028464830000984875,
"iqr_over_median": 0.01216747032621317
},
"vectorbt": {
"samples_s": [
97.19581371800001,
97.60975880300003,
96.65219313600005,
96.86962823299996,
97.25343662,
97.7039807430001,
97.8089896250001
],
"min_s": 96.65219313600005,
"median_s": 97.25343662,
"max_s": 97.8089896250001,
"iqr_s": 0.8343525100001443,
"iqr_over_median": 0.008579157086861865
},
"raptorbt": {
"samples_s": [
0.9058996599999887,
0.910033584999951,
0.9031057189999956,
0.8976874740000085,
0.9031281219999983,
0.8966372009999759,
0.9085588320001534
],
"min_s": 0.8966372009999759,
"median_s": 0.9031281219999983,
"max_s": 0.910033584999951,
"iqr_s": 0.010871358000144937,
"iqr_over_median": 0.012037448215066165
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 415.4696090596675,
"min": 411.6589315201554,
"max": 419.36947833150504
},
"raptorbt": {
"median_of_ratios": 3.8599296829048395,
"min": 3.8275110563347865,
"max": 3.8862823626266683
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": 1.1285717523798544,
"vectorbt": 0.999862279060712,
"raptorbt": 0.999201493659873
}
},
{
"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.003780471000027319,
0.0041592210000089835,
0.003945871000041734,
0.003878835000023173,
0.006443658999842228,
0.0047538030000850995,
0.004055867000033686
],
"min_s": 0.003780471000027319,
"median_s": 0.004055867000033686,
"max_s": 0.006443658999842228,
"iqr_s": 0.0008749680000619264,
"iqr_over_median": 0.2157289674574288
},
"vectorbt": {
"samples_s": [
0.18675138899993726,
0.18617829699996946,
0.1907367650001106,
0.1912229860001844,
0.19047288000001572,
0.18755823199990118,
0.18884254699992198
],
"min_s": 0.18617829699996946,
"median_s": 0.18884254699992198,
"max_s": 0.1912229860001844,
"iqr_s": 0.003985376000173346,
"iqr_over_median": 0.02110422711135639
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 46.56034011922816,
"min": 29.559739273086834,
"max": 49.39897409571128
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.0062317551647801
}
},
{
"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.046195529999977225,
0.04412366099995779,
0.046050465000007534,
0.04603283999995256,
0.04552522899984979,
0.04526800399980857,
0.04622796299986476
],
"min_s": 0.04412366099995779,
"median_s": 0.04603283999995256,
"max_s": 0.04622796299986476,
"iqr_s": 0.0009275260001686547,
"iqr_over_median": 0.020149223905577208
},
"vectorbt": {
"samples_s": [
2.0456789880001907,
2.3111802209998586,
2.030782950999992,
2.318824763000066,
2.0408716939998612,
2.2850209779999204,
2.052750303000039
],
"min_s": 2.030782950999992,
"median_s": 2.052750303000039,
"max_s": 2.318824763000066,
"iqr_s": 0.2703085269999974,
"iqr_over_median": 0.13168115313633072
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 44.82946574539131,
"min": 44.09907589423168,
"max": 52.379611496926096
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 0.9996612621296758
}
},
{
"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.003000840999902721,
0.0027875110001787107,
0.0025635009999405156,
0.0025103720001879992,
0.005327208000153405,
0.0025429529998746148,
0.0027943830000367598
],
"min_s": 0.0025103720001879992,
"median_s": 0.0027875110001787107,
"max_s": 0.005327208000153405,
"iqr_s": 0.00045788800002810603,
"iqr_over_median": 0.16426410514568382
},
"vectorbt": {
"samples_s": [
0.182102008000129,
0.3295473549999315,
0.1847100820000378,
0.1852319899999202,
0.17772034099994016,
0.17859202299996468,
0.18169279099993219
],
"min_s": 0.17772034099994016,
"median_s": 0.182102008000129,
"max_s": 0.3295473549999315,
"iqr_s": 0.0066399669999555044,
"iqr_over_median": 0.03646289831109826
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 70.23017059645636,
"min": 33.360878905952696,
"max": 118.22279983067467
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.0073284270145941
}
},
{
"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.03089989299996887,
0.027696599000137212,
0.027222440000059578,
0.02756066400002055,
0.028059718999884353,
0.027924546999884114,
0.02775166700007503
],
"min_s": 0.027222440000059578,
"median_s": 0.02775166700007503,
"max_s": 0.03089989299996887,
"iqr_s": 0.0004990549998638016,
"iqr_over_median": 0.017982883689922208
},
"vectorbt": {
"samples_s": [
2.0539204420001624,
2.174219948999962,
2.0528360749999592,
2.170625778000158,
2.0639931159998923,
2.184557066000025,
2.0331288239999594
],
"min_s": 2.0331288239999594,
"median_s": 2.0639931159998923,
"max_s": 2.184557066000025,
"iqr_s": 0.12138387400000283,
"iqr_over_median": 0.05881021262088801
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 75.40970151813968,
"min": 66.47014738860848,
"max": 78.75810894826552
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.0004560253677293
}
},
{
"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.2433070619999853,
0.24160303799999383,
0.23496132000013858,
0.24489738600004785,
0.24438731999998708,
0.24777618600001006,
0.24204011500000888
],
"min_s": 0.23496132000013858,
"median_s": 0.2433070619999853,
"max_s": 0.24777618600001006,
"iqr_s": 0.003294348000054015,
"iqr_over_median": 0.013539878263189146
},
"vectorbt": {
"samples_s": [
25.09089034800013,
24.996138942000016,
25.37582992700004,
24.362399891999985,
25.147262228000045,
25.01099127600014,
24.94460785399997
],
"min_s": 24.362399891999985,
"median_s": 25.01099127600014,
"max_s": 25.37582992700004,
"iqr_s": 0.20265437400007613,
"iqr_over_median": 0.008102612637930016
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 103.05980830491282,
"min": 99.48003239199632,
"max": 108.0000313540334
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": 1.1183230344442028,
"vectorbt": 0.9998392455888444
}
},
{
"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.01963494400001764,
0.015142800999910833,
0.015458392000027743,
0.014270435999833353,
0.014093956999886359,
0.02133738199995605,
0.01569785999981832
],
"min_s": 0.014093956999886359,
"median_s": 0.015458392000027743,
"max_s": 0.02133738199995605,
"iqr_s": 0.005364508000184287,
"iqr_over_median": 0.3470288501012692
},
"vectorbt": {
"samples_s": [
0.22894699299990862,
0.22282209199988756,
0.2217526590000034,
0.2210649310000008,
0.22103048700000727,
0.2230423549999614,
0.22683667100000093
],
"min_s": 0.22103048700000727,
"median_s": 0.22282209199988756,
"max_s": 0.22894699299990862,
"iqr_s": 0.005771740000000136,
"iqr_over_median": 0.025902907329328227
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 14.450165245621138,
"min": 10.453126583215354,
"max": 15.6826423552867
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.0028769230068508
}
},
{
"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.15671998000016174,
0.15497184599985303,
0.15207209400000465,
0.15479670800004897,
0.15672251299997697,
0.15349175200003629,
0.15117281799984994
],
"min_s": 0.15117281799984994,
"median_s": 0.15479670800004897,
"max_s": 0.15672251299997697,
"iqr_s": 0.0046478860001570865,
"iqr_over_median": 0.03002574189210546
},
"vectorbt": {
"samples_s": [
2.354111327000055,
2.505598657000064,
2.352760496999963,
2.5190172909999546,
2.360490063999805,
2.4782507429999896,
2.3645509240000138
],
"min_s": 2.352760496999963,
"median_s": 2.3645509240000138,
"max_s": 2.5190172909999546,
"iqr_s": 0.15148733000000902,
"iqr_over_median": 0.06406600444186845
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 15.641376242667917,
"min": 15.021130853881079,
"max": 16.273067583576506
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": 1.213021692306757,
"vectorbt": 1.00030827073946
}
},
{
"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.005175744999860399,
0.004975249000153781,
0.005115893000038341,
0.008158261000062339,
0.005487318999939816,
0.00515160999998443,
0.005743890000076135
],
"min_s": 0.004975249000153781,
"median_s": 0.005175744999860399,
"max_s": 0.008158261000062339,
"iqr_s": 0.0006279970000377944,
"iqr_over_median": 0.12133460981070991
},
"vectorbt": {
"samples_s": [
0.18197274900012417,
0.17958982400000423,
0.17392249999988962,
0.17642311500003416,
0.17820238800004518,
0.34509967799999686,
0.17486967500008177
],
"min_s": 0.17392249999988962,
"median_s": 0.17820238800004518,
"max_s": 0.34509967799999686,
"iqr_s": 0.0071030740000423975,
"iqr_over_median": 0.03985958931167969
},
"raptorbt": {
"samples_s": [
0.007734748000075342,
0.008010914999886154,
0.00989945300011641,
0.010477304999994885,
0.010383510000110618,
0.007934882999961701,
0.00835914699996465
],
"min_s": 0.007734748000075342,
"median_s": 0.00835914699996465,
"max_s": 0.010477304999994885,
"iqr_s": 0.0024486270001489174,
"iqr_over_median": 0.29292785497841733
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 33.99650852716939,
"min": 21.625088361194386,
"max": 66.9887041140614
},
"raptorbt": {
"median_of_ratios": 1.5402724585101906,
"min": 1.2842571474380173,
"max": 1.9350391026634488
}
},
"noisy": true,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 0.9786679262773263,
"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.04918608299999505,
0.06180135700014944,
0.05808824299992921,
0.05886984500011749,
0.05986140699997122,
0.05975879599986911,
0.05998867700009214
],
"min_s": 0.04918608299999505,
"median_s": 0.05975879599986911,
"max_s": 0.06180135700014944,
"iqr_s": 0.0019004340001629316,
"iqr_over_median": 0.03180174513835744
},
"vectorbt": {
"samples_s": [
2.2335388720000537,
2.05828736400008,
2.1998253900001146,
2.0674015550000604,
2.228098090000003,
2.0846201159999964,
2.2080761950001033
],
"min_s": 2.05828736400008,
"median_s": 2.1998253900001146,
"max_s": 2.2335388720000537,
"iqr_s": 0.16069653499994274,
"iqr_over_median": 0.07304967736549962
},
"raptorbt": {
"samples_s": [
0.08537914600015029,
0.07891541100002541,
0.08613400000012916,
0.07982136800001172,
0.08654470499982381,
0.07944606899991413,
0.08691718300019602
],
"min_s": 0.07891541100002541,
"median_s": 0.08537914600015029,
"max_s": 0.08691718300019602,
"iqr_s": 0.007098635999909675,
"iqr_over_median": 0.08314250414143495
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 36.808216240486715,
"min": 33.30488947022802,
"max": 45.40997647648174
},
"raptorbt": {
"median_of_ratios": 1.445751266752975,
"min": 1.2769203595292349,
"max": 1.7358395056617717
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": null,
"vectorbt": 1.0013363807485547,
"raptorbt": 0.9774368444529038
}
},
{
"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.5398412240001562,
0.5563704009998673,
0.5166171860000759,
0.5223132850001093,
0.5071941749999951,
0.5201487970000471,
0.5099995049999961
],
"min_s": 0.5071941749999951,
"median_s": 0.5201487970000471,
"max_s": 0.5563704009998673,
"iqr_s": 0.029841719000160083,
"iqr_over_median": 0.05737150440849213
},
"vectorbt": {
"samples_s": [
25.166156338000064,
25.069940309000003,
25.947442253999952,
24.972725216999834,
24.860534307999842,
24.93323915699989,
25.785153028999957
],
"min_s": 24.860534307999842,
"median_s": 25.069940309000003,
"max_s": 25.947442253999952,
"iqr_s": 0.8519138720000683,
"iqr_over_median": 0.03398148784958354
},
"raptorbt": {
"samples_s": [
0.9015185119999387,
0.9076199109999834,
0.9169601900000544,
0.9078417660000468,
0.9044835849999799,
0.8995681960000184,
0.9119288929998675
],
"min_s": 0.8995681960000184,
"median_s": 0.9076199109999834,
"max_s": 0.9169601900000544,
"iqr_s": 0.010410380999928748,
"iqr_over_median": 0.011469978648285669
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 47.93482038370961,
"min": 45.05980236178305,
"max": 50.559172658412976
},
"raptorbt": {
"median_of_ratios": 1.7381173178466194,
"min": 1.6313231425842867,
"max": 1.7880976041337027
}
},
"noisy": false,
"cpu_over_wall": {
"manifoldbt": 1.0483366025021372,
"vectorbt": 0.9999706305689207,
"raptorbt": 1.0000124327530355
}
}
],
"cold_start": {
"workload": "sma_cross",
"bars": 20000,
"engines": [
"manifoldbt",
"vectorbt",
"raptorbt"
],
"samples_s": {
"manifoldbt": [
0.5121232510000482,
0.42602585999998155,
0.42655278300003374
],
"vectorbt": [
7.429691203999937,
7.242822470999954,
7.078628959000071
],
"raptorbt": [
0.39262156000017967,
0.38900593700009267,
0.3949128930000825
],
"baseline": [
0.357345099999975,
0.3565924899999118,
0.3546684989998994
]
},
"median_s": {
"manifoldbt": 0.42655278300003374,
"vectorbt": 7.242822470999954,
"raptorbt": 0.39262156000017967,
"baseline": 0.3565924899999118
},
"engine_share_s": {
"manifoldbt": 0.06996029300012196,
"vectorbt": 6.886229981000042,
"raptorbt": 0.03602907000026789
},
"ratio": {
"vectorbt": 16.97989735305368,
"raptorbt": 0.9204524636758696
}
},
"memory": {
"workload": "sma_cross",
"bars": 2000000,
"engines": [
"manifoldbt",
"vectorbt",
"raptorbt"
],
"manifoldbt": {
"before_mb": 696.377344,
"peak_mb": 696.393728,
"added_mb": 0.016384000000016385,
"added_mb_per_million_bars": 0.008192000000008193,
"seconds": 0.044637970999929166,
"mode": "memory",
"engine": "mbt",
"workload": "sma_cross",
"bars": 2000000
},
"vectorbt": {
"before_mb": 602.13248,
"peak_mb": 865.755136,
"added_mb": 263.622656,
"added_mb_per_million_bars": 131.811328,
"seconds": 4.352931445999957,
"mode": "memory",
"engine": "vbt",
"workload": "sma_cross",
"bars": 2000000
},
"raptorbt": {
"before_mb": 327.405568,
"peak_mb": 367.947776,
"added_mb": 40.54220799999996,
"added_mb_per_million_bars": 20.27110399999998,
"seconds": 0.16463091300011,
"mode": "memory",
"engine": "rbt",
"workload": "sma_cross",
"bars": 2000000
}
},
"sweeps": null,
"sweep_reps": null
},
"sweeps": {
"schema_version": 2,
"generated_at": "2026-10-12T13:19:35.533494+00:00",
"environment": {
"os": "Linux",
"os_release": "6.17.0-1022-azure",
"arch": "x86_64",
"cpu": "AMD EPYC 9V45 96-Core Processor",
"logical_cores": 4,
"ram_gb": 16.8,
"python": "3.12.15",
"versions": {
"manifoldbt": "0.27.0",
"vectorbt": "0.28.4",
"raptorbt": "0.9.0",
"numpy": "2.4.3",
"numba": "0.64.0",
"pandas": "2.3.3"
},
"runner": "GitHub Actions 1000000714",
"ci": true,
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/38254074977",
"commit": "4a1e4cd4e901d90a225c6d1593945a30a758dbc3",
"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": "81a87f47b436bdf3",
"engines": [
"manifoldbt",
"vectorbt",
"raptorbt"
],
"parity": {
"vectorbt": {
"status": "exact",
"expected": "exact",
"publishable": true,
"diffs": {
"final_equity_vs_capital": 2.037268131971359e-15,
"round_trips_delta": 0,
"total_fees_vs_capital": 0.0
},
"metrics": {
"manifoldbt": {
"total_return": 0.0667552139716674,
"final_equity": 106675.52139716674,
"round_trips": 450,
"fills": 900,
"total_fees": 0.0
},
"vectorbt": {
"total_return": 0.06675521397166537,
"final_equity": 106675.52139716654,
"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.0667552139716674,
"final_equity": 106675.52139716674,
"round_trips": 450,
"fills": 900,
"total_fees": 0.0
},
"raptorbt": {
"total_return": 0.0667552139716674,
"final_equity": 106675.52139716674,
"round_trips": 450,
"fills": null,
"total_fees": 0.0
}
},
"note": ""
}
},
"status": "exact",
"timings": {
"manifoldbt": {
"samples_s": [
0.0035843949999900815
],
"min_s": 0.0035843949999900815,
"median_s": 0.0035843949999900815,
"max_s": 0.0035843949999900815,
"iqr_s": 0.0,
"iqr_over_median": 0.0
},
"vectorbt": {
"samples_s": [
0.10103291400000103
],
"min_s": 0.10103291400000103,
"median_s": 0.10103291400000103,
"max_s": 0.10103291400000103,
"iqr_s": 0.0,
"iqr_over_median": 0.0
},
"raptorbt": {
"samples_s": [
0.0069410490000052505
],
"min_s": 0.0069410490000052505,
"median_s": 0.0069410490000052505,
"max_s": 0.0069410490000052505,
"iqr_s": 0.0,
"iqr_over_median": 0.0
}
},
"speedup": {
"vectorbt": {
"median_of_ratios": 28.18688063125872,
"min": 28.18688063125872,
"max": 28.18688063125872
},
"raptorbt": {
"median_of_ratios": 1.936463196724819,
"min": 1.936463196724819,
"max": 1.936463196724819
}
},
"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": "554df142406ad3f0",
"engines": [
"manifoldbt",
"vectorbt",
"raptorbt"
],
"metrics": false,
"tier_before": {
"pro": true
},
"parity": {
"vectorbt": {
"status": "exact",
"combos_compared": 5000,
"worst_abs_return_delta": 1.635844237846129e-15,
"worst_component": "return",
"worst_pair": [
5,
118
]
},
"raptorbt": {
"status": "exact",
"combos_compared": 5000,
"worst_abs_return_delta": 1.1102230246251565e-16,
"worst_component": "return",
"worst_pair": [
5,
328
]
}
},
"status": "exact",
"timings": {
"seconds": {
"manifoldbt": 0.15539558899999406,
"vectorbt": 5.1320963820000145,
"raptorbt": 3.393215542000007
},
"ratio": {
"vectorbt": 33.026010680394606,
"raptorbt": 21.835983658455948
},
"reps": 2,
"per_combo_us": 31.079117799998812
},
"memory": {
"manifoldbt": 33.5,
"vectorbt": 2531.0,
"raptorbt": 34.3
},
"memory_baseline_mb": 2172.0,
"tier_after": {
"pro": true
}
},
{
"bars": 20000,
"combos": 20000,
"requested_combos": 20000,
"grid": {
"fast": 125,
"slow": 160
},
"data_digest": "554df142406ad3f0",
"engines": [
"manifoldbt",
"raptorbt"
],
"metrics": false,
"tier_before": {
"pro": true
},
"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": [
5,
328
]
},
"vectorbt": {
"status": "exact",
"combos_compared": 250,
"worst_abs_return_delta": 1.635844237846129e-15,
"worst_component": "return",
"worst_pair": [
5,
118
],
"checked_at_combos": 250,
"scope": "anchor grid, not this grid"
}
},
"status": "exact",
"timings": {
"seconds": {
"manifoldbt": 0.587556429999978,
"raptorbt": 13.03787736800001,
"vectorbt": null
},
"ratio": {
"raptorbt": 22.190000317076777
},
"reps": 2,
"per_combo_us": 29.377821499998902
},
"memory": {
"manifoldbt": 70.8,
"vectorbt": null,
"raptorbt": null
},
"memory_baseline_mb": 598.9,
"tier_after": {
"pro": true
}
},
{
"bars": 200000,
"combos": 10000,
"requested_combos": 10000,
"grid": {
"fast": 100,
"slow": 100
},
"data_digest": "116ce87b2230b7dd",
"engines": [
"manifoldbt",
"raptorbt"
],
"metrics": false,
"tier_before": {
"pro": true
},
"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": [
17,
343
]
},
"vectorbt": {
"status": "exact",
"combos_compared": 250,
"worst_abs_return_delta": 1.214306433183765e-14,
"worst_component": "return",
"worst_pair": [
7,
63
],
"checked_at_combos": 250,
"scope": "anchor grid, not this grid"
}
},
"status": "exact",
"timings": {
"seconds": {
"manifoldbt": 2.332767626999953,
"raptorbt": 85.42112018199998,
"vectorbt": null
},
"ratio": {
"raptorbt": 36.61792936138071
},
"reps": 2,
"per_combo_us": 233.2767626999953
},
"memory": {
"manifoldbt": 318.2,
"vectorbt": null,
"raptorbt": null
},
"memory_baseline_mb": 1719.8,
"tier_after": {
"pro": true
}
}
],
"sweep_reps": 2
}
}