mirror of
https://github.com/manifoldbt/manifoldbt.git
synced 2026-11-02 07:56:11 +00:00
2485 lines
82 KiB
JSON
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
|
|
}
|
|
}
|