mirror of
https://github.com/manifoldbt/manifoldbt.git
synced 2026-08-24 22:48:05 +00:00
2497 lines
82 KiB
JSON
2497 lines
82 KiB
JSON
{
|
|
"repo": "manifoldbt/manifoldbt",
|
|
"run_id": "32642616670",
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670",
|
|
"commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e",
|
|
"run_started_at": "",
|
|
"conclusion": "success",
|
|
"synced_at": "2026-08-23T14:01:18.287780+00:00",
|
|
"backtests": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-08-23T14:01:07.410774+00:00",
|
|
"environment": {
|
|
"os": "Linux",
|
|
"os_release": "6.17.0-1022-azure",
|
|
"arch": "x86_64",
|
|
"cpu": "AMD EPYC 7763 64-Core Processor",
|
|
"logical_cores": 4,
|
|
"ram_gb": 16.8,
|
|
"python": "3.12.14",
|
|
"versions": {
|
|
"manifoldbt": "0.19.0",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000211",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670",
|
|
"commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e",
|
|
"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.005347049999997466,
|
|
0.0032132190000027094,
|
|
0.003269553999999175,
|
|
0.005082164000000944,
|
|
0.00493666900000278,
|
|
0.0033668539999922587,
|
|
0.0033179020000062565
|
|
],
|
|
"min_s": 0.0032132190000027094,
|
|
"median_s": 0.0033668539999922587,
|
|
"max_s": 0.005347049999997466,
|
|
"iqr_s": 0.0018126100000017686,
|
|
"iqr_over_median": 0.5383690531296981
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18863555500000473,
|
|
0.34205679800000155,
|
|
0.20039412599999196,
|
|
0.18093825200000424,
|
|
0.18287249200000133,
|
|
0.346504865,
|
|
0.17978614300000118
|
|
],
|
|
"min_s": 0.17978614300000118,
|
|
"median_s": 0.18863555500000473,
|
|
"max_s": 0.346504865,
|
|
"iqr_s": 0.1611185459999973,
|
|
"iqr_over_median": 0.8541260739524597
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.010460542000004125,
|
|
0.008207519000009711,
|
|
0.008448298999994108,
|
|
0.007822949000001245,
|
|
0.00898829300000159,
|
|
0.007895570000002294,
|
|
0.00839399199999491
|
|
],
|
|
"min_s": 0.007822949000001245,
|
|
"median_s": 0.00839399199999491,
|
|
"max_s": 0.010460542000004125,
|
|
"iqr_s": 0.001092722999999296,
|
|
"iqr_over_median": 0.13017918053769395
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 54.1866947847351,
|
|
"min": 35.27843483791887,
|
|
"max": 106.45299869063177
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.34508832281425,
|
|
"min": 1.5392948751751796,
|
|
"max": 2.5839301017803162
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0054353768621687,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.8917489796876906e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 2.806945912450058e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.00034240713210042254,
|
|
"sortino": 0.0003424071320978874,
|
|
"volatility": 0.0003424071321000681
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093023,
|
|
"sharpe": 2.1149665518057725,
|
|
"sortino": 4.02133680320316,
|
|
"volatility": 0.17066118340286904
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166725,
|
|
"final_equity": 106675.52139716671,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093001,
|
|
"sharpe": 2.1142426200536755,
|
|
"sortino": 4.019960340111955,
|
|
"volatility": 0.17060276779841885
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 5.263023585843841e-16,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093023,
|
|
"sharpe": 2.1149665518057725,
|
|
"sortino": 4.02133680320316,
|
|
"volatility": 0.17066118340286904
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.06675521397166521,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093027,
|
|
"sharpe": 0.9692748979846307,
|
|
"sortino": 1.3742016523326603,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.0033861920000077816,
|
|
0.005095889999992664,
|
|
0.0033050610000060487,
|
|
0.0033925749999923482,
|
|
0.0033702409999989413,
|
|
0.00511029300000132,
|
|
0.0033675650000049018
|
|
],
|
|
"min_s": 0.0033050610000060487,
|
|
"median_s": 0.0033861920000077816,
|
|
"max_s": 0.00511029300000132,
|
|
"iqr_s": 0.0017283249999877626,
|
|
"iqr_over_median": 0.5104037219341936
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.685716162999995,
|
|
0.7026406140000034,
|
|
0.8420005899999978,
|
|
0.8500549900000038,
|
|
0.6868578610000071,
|
|
0.7315806839999937,
|
|
0.8522979340000063
|
|
],
|
|
"min_s": 0.685716162999995,
|
|
"median_s": 0.7315806839999937,
|
|
"max_s": 0.8522979340000063,
|
|
"iqr_s": 0.16319712899999672,
|
|
"iqr_over_median": 0.22307468276458503
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.010763509000000226,
|
|
0.008259987000002411,
|
|
0.00783488200001159,
|
|
0.007808417999996209,
|
|
0.010623882000004414,
|
|
0.007928362000001243,
|
|
0.007854914999995799
|
|
],
|
|
"min_s": 0.007808417999996209,
|
|
"median_s": 0.007928362000001243,
|
|
"max_s": 0.010763509000000226,
|
|
"iqr_s": 0.002788999999992825,
|
|
"iqr_over_median": 0.3517750576969603
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 203.80081454122208,
|
|
"min": 137.88378752308526,
|
|
"max": 254.7609832310075
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.3325206788835153,
|
|
"min": 1.5514495939859407,
|
|
"max": 3.178646987523298
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9997853104005853,
|
|
"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.037335460000008425,
|
|
0.037978995000003124,
|
|
0.03791546700000481,
|
|
0.039023332999988725,
|
|
0.038331946999988986,
|
|
0.038091042000019115,
|
|
0.03732786800000554
|
|
],
|
|
"min_s": 0.03732786800000554,
|
|
"median_s": 0.037978995000003124,
|
|
"max_s": 0.039023332999988725,
|
|
"iqr_s": 0.0009964869999805614,
|
|
"iqr_over_median": 0.026237845419039642
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.0507589489999987,
|
|
2.315858748000011,
|
|
2.0414709830000106,
|
|
2.328412334999996,
|
|
2.037601520999999,
|
|
2.2872202920000007,
|
|
2.022937194000008
|
|
],
|
|
"min_s": 2.022937194000008,
|
|
"median_s": 2.0507589489999987,
|
|
"max_s": 2.328412334999996,
|
|
"iqr_s": 0.27825722700001165,
|
|
"iqr_over_median": 0.13568499951478785
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.07901990999999953,
|
|
0.08475653599998623,
|
|
0.0793328129999793,
|
|
0.08569068500000299,
|
|
0.07950533600001108,
|
|
0.08441346500001146,
|
|
0.08000269400000093
|
|
],
|
|
"min_s": 0.07901990999999953,
|
|
"median_s": 0.08000269400000093,
|
|
"max_s": 0.08569068500000299,
|
|
"iqr_s": 0.00542372300000693,
|
|
"iqr_over_median": 0.0677942545285646
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 54.92791434736671,
|
|
"min": 53.1567447122001,
|
|
"max": 60.977357299734244
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.143243059046101,
|
|
"min": 2.074127254742211,
|
|
"max": 2.2316687421554797
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0010434703443873,
|
|
"raptorbt": 1.0127087280209428
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 4.220055416226387e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 1.464735645642113e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.0003424071321271261,
|
|
"sortino": 0.00034240713212705575,
|
|
"volatility": 0.0003424071321024856
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.6860158229410881,
|
|
"sortino": 1.3522858253366064,
|
|
"volatility": 0.16128875607357201
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.20294254717537696,
|
|
"final_equity": 120294.2547175377,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.1515936377909961,
|
|
"sharpe": 0.6857810066333395,
|
|
"sortino": 1.351822951516634,
|
|
"volatility": 0.16123354855661204
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 0.0,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.6860158229410881,
|
|
"sortino": 1.3522858253366064,
|
|
"volatility": 0.16128875607357201
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.20294254717538115,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.3005175738027932,
|
|
"sortino": 0.42543548791233987,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.03776869099999658,
|
|
0.036214618000002474,
|
|
0.03805361700000276,
|
|
0.03835612099999253,
|
|
0.03794206099999542,
|
|
0.037969554000000016,
|
|
0.03712031999998544
|
|
],
|
|
"min_s": 0.036214618000002474,
|
|
"median_s": 0.03794206099999542,
|
|
"max_s": 0.03835612099999253,
|
|
"iqr_s": 0.0009332970000173191,
|
|
"iqr_over_median": 0.02459795212541121
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
8.470414614000006,
|
|
8.453709758999992,
|
|
8.483099930999998,
|
|
8.443229481999992,
|
|
8.505207001000002,
|
|
8.376691564999987,
|
|
8.546466886000019
|
|
],
|
|
"min_s": 8.376691564999987,
|
|
"median_s": 8.470414614000006,
|
|
"max_s": 8.546466886000019,
|
|
"iqr_s": 0.061977519000009806,
|
|
"iqr_over_median": 0.007316940412523915
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.087959761999997,
|
|
0.08789736800000014,
|
|
0.09063822400000277,
|
|
0.08818575500001202,
|
|
0.0897488300000191,
|
|
0.08837810500000387,
|
|
0.09013085699999124
|
|
],
|
|
"min_s": 0.08789736800000014,
|
|
"median_s": 0.08837810500000387,
|
|
"max_s": 0.09063822400000277,
|
|
"iqr_s": 0.0021710949999942386,
|
|
"iqr_over_median": 0.02456598271703318
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 224.16302058554567,
|
|
"min": 220.127303331889,
|
|
"max": 233.4336305576774
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.36541789335139,
|
|
"min": 2.299131212982387,
|
|
"max": 2.428073276308679
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9998512244657815,
|
|
"raptorbt": 0.9952822002361194
|
|
}
|
|
},
|
|
{
|
|
"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.3235047160000022,
|
|
0.3234485200000563,
|
|
0.323429739000062,
|
|
0.32509285100002216,
|
|
0.32039177000001473,
|
|
0.3194278570000506,
|
|
0.3223829769999611
|
|
],
|
|
"min_s": 0.3194278570000506,
|
|
"median_s": 0.323429739000062,
|
|
"max_s": 0.32509285100002216,
|
|
"iqr_s": 0.00311294599998746,
|
|
"iqr_over_median": 0.00962479829347685
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
25.683530236000024,
|
|
26.08707517099998,
|
|
25.33292799000003,
|
|
25.588718906000054,
|
|
25.306060289000015,
|
|
25.158651128999963,
|
|
25.056078312999944
|
|
],
|
|
"min_s": 25.056078312999944,
|
|
"median_s": 25.33292799000003,
|
|
"max_s": 26.08707517099998,
|
|
"iqr_s": 0.5248791070000607,
|
|
"iqr_over_median": 0.020719243634500225
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.9073103939999783,
|
|
0.9050338699999543,
|
|
0.9025704289999794,
|
|
0.9056177639999987,
|
|
0.8986746360000097,
|
|
0.8985271369999737,
|
|
0.8979460529999415
|
|
],
|
|
"min_s": 0.8979460529999415,
|
|
"median_s": 0.9025704289999794,
|
|
"max_s": 0.9073103939999783,
|
|
"iqr_s": 0.0070906270000250515,
|
|
"iqr_over_median": 0.007856037348665688
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 78.76160634604882,
|
|
"min": 77.72146825544999,
|
|
"max": 80.65294338337192
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.798077017015866,
|
|
"min": 2.785339540431286,
|
|
"max": 2.8129266665675665
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.089614874869514,
|
|
"vectorbt": 0.9999268177353846,
|
|
"raptorbt": 1.0038506884310427
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.2369127944111823e-14,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 1.1043826616631323e-14,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.0003424071321157821,
|
|
"sortino": 0.0003424071321161821,
|
|
"volatility": 0.0003424071321037301
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.16657583326366043,
|
|
"sortino": 0.3242480879539277,
|
|
"volatility": 0.15596640368660572
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.30013524943743497,
|
|
"final_equity": 130013.5249437435,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126802,
|
|
"sharpe": 0.16651881603341911,
|
|
"sortino": 0.324137101098728,
|
|
"volatility": 0.15591301795726933
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.4551915228366853e-16,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 0.0,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.16657583326366043,
|
|
"sortino": 0.3242480879539277,
|
|
"volatility": 0.15596640368660572
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.3001352494374475,
|
|
"final_equity": 130013.52494374475,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.07064081213793068,
|
|
"sortino": 0.09993197026250207,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.3217440409999881,
|
|
0.3247571649999941,
|
|
0.32139380200010237,
|
|
0.33266460599998027,
|
|
0.31832793700004913,
|
|
0.31972129700000096,
|
|
0.3228766590000305
|
|
],
|
|
"min_s": 0.31832793700004913,
|
|
"median_s": 0.3217440409999881,
|
|
"max_s": 0.33266460599998027,
|
|
"iqr_s": 0.0050358679999931155,
|
|
"iqr_over_median": 0.015651783275741543
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
99.000129775,
|
|
99.91466347699998,
|
|
99.57081783199999,
|
|
98.77557968300005,
|
|
98.44118702799994,
|
|
98.90509020000002,
|
|
98.50235578499996
|
|
],
|
|
"min_s": 98.44118702799994,
|
|
"median_s": 98.90509020000002,
|
|
"max_s": 99.91466347699998,
|
|
"iqr_s": 1.0684620470000254,
|
|
"iqr_over_median": 0.010802902508247501
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.9035892349999699,
|
|
0.905373528000041,
|
|
0.904816925000091,
|
|
0.8981749869999476,
|
|
0.8985160949999909,
|
|
0.898877296999899,
|
|
0.8994789800001399
|
|
],
|
|
"min_s": 0.8981749869999476,
|
|
"median_s": 0.8994789800001399,
|
|
"max_s": 0.905373528000041,
|
|
"iqr_s": 0.006300830000100177,
|
|
"iqr_over_median": 0.00700497748162964
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 307.698409789674,
|
|
"min": 296.9224194623395,
|
|
"max": 309.80939026312734
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.8084101641528254,
|
|
"min": 2.69994153510879,
|
|
"max": 2.822611497651405
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0922024449656378,
|
|
"vectorbt": 0.9998704046935736,
|
|
"raptorbt": 0.9986008418150869
|
|
}
|
|
},
|
|
{
|
|
"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.0048959789999116765,
|
|
0.004888546000074712,
|
|
0.004972762999841507,
|
|
0.004702697000084299,
|
|
0.015825846000097954,
|
|
0.0054333839998435,
|
|
0.005020231000116837
|
|
],
|
|
"min_s": 0.004702697000084299,
|
|
"median_s": 0.004972762999841507,
|
|
"max_s": 0.015825846000097954,
|
|
"iqr_s": 0.000544837999768788,
|
|
"iqr_over_median": 0.1095644412947396
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18151143299996875,
|
|
0.18488166700012698,
|
|
0.18811562699988826,
|
|
0.1911986049999541,
|
|
0.18417833200010136,
|
|
0.18622987999992802,
|
|
0.18950436599993736
|
|
],
|
|
"min_s": 0.18151143299996875,
|
|
"median_s": 0.18622987999992802,
|
|
"max_s": 0.1911986049999541,
|
|
"iqr_s": 0.0053260339998359996,
|
|
"iqr_over_median": 0.028599245190074
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 37.748136688436645,
|
|
"min": 11.63781904606941,
|
|
"max": 40.65722392842378
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0033547971859902
|
|
}
|
|
},
|
|
{
|
|
"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.05473372300002666,
|
|
0.054536822000045504,
|
|
0.05356822899989311,
|
|
0.054051924000077634,
|
|
0.052198359999920285,
|
|
0.05121749200020531,
|
|
0.051620961000026
|
|
],
|
|
"min_s": 0.05121749200020531,
|
|
"median_s": 0.05356822899989311,
|
|
"max_s": 0.05473372300002666,
|
|
"iqr_s": 0.002915861000019504,
|
|
"iqr_over_median": 0.05443265634235028
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.2554828490001455,
|
|
2.32160071699991,
|
|
2.0455224890001773,
|
|
2.315093546000071,
|
|
2.042998187999956,
|
|
2.3009759660001237,
|
|
2.0521571520000634
|
|
],
|
|
"min_s": 2.042998187999956,
|
|
"median_s": 2.2554828490001455,
|
|
"max_s": 2.32160071699991,
|
|
"iqr_s": 0.2695710569998937,
|
|
"iqr_over_median": 0.11951811432279098
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 41.2082848630459,
|
|
"min": 38.18536709519105,
|
|
"max": 44.92558842965017
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9997501663463275
|
|
}
|
|
},
|
|
{
|
|
"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.0039813280000089435,
|
|
0.003687388000116698,
|
|
0.003578004000019064,
|
|
0.0037989439999819297,
|
|
0.00668571799997153,
|
|
0.003655769000033615,
|
|
0.0035326879999502125
|
|
],
|
|
"min_s": 0.0035326879999502125,
|
|
"median_s": 0.003687388000116698,
|
|
"max_s": 0.00668571799997153,
|
|
"iqr_s": 0.00040332399998987967,
|
|
"iqr_over_median": 0.10937932215896871
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.17644552800015845,
|
|
0.3230557110000518,
|
|
0.18195427399996333,
|
|
0.17985060799992425,
|
|
0.177283055000089,
|
|
0.17966308800009756,
|
|
0.18122035099986533
|
|
],
|
|
"min_s": 0.17644552800015845,
|
|
"median_s": 0.17985060799992425,
|
|
"max_s": 0.3230557110000518,
|
|
"iqr_s": 0.004671218999874327,
|
|
"iqr_over_median": 0.025972772913151868
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 49.14508766786018,
|
|
"min": 26.516681529320252,
|
|
"max": 87.61098940220768
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9789401988405265
|
|
}
|
|
},
|
|
{
|
|
"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.0384609120001187,
|
|
0.035915725999984716,
|
|
0.03618134600014855,
|
|
0.037242202999777874,
|
|
0.036020176999954856,
|
|
0.036429581999982474,
|
|
0.03634975299996768
|
|
],
|
|
"min_s": 0.035915725999984716,
|
|
"median_s": 0.03634975299996768,
|
|
"max_s": 0.0384609120001187,
|
|
"iqr_s": 0.0012220259998230176,
|
|
"iqr_over_median": 0.03361855030553039
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.0826293519999126,
|
|
2.203784844999973,
|
|
2.0856359940000857,
|
|
2.1970288970001093,
|
|
2.0753685449999466,
|
|
2.193081161000009,
|
|
2.074696724999967
|
|
],
|
|
"min_s": 2.074696724999967,
|
|
"median_s": 2.0856359940000857,
|
|
"max_s": 2.203784844999973,
|
|
"iqr_s": 0.12166035200016267,
|
|
"iqr_over_median": 0.0583324953875713
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 57.64395813222434,
|
|
"min": 54.149245134735374,
|
|
"max": 61.35988577819395
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9998507587618723
|
|
}
|
|
},
|
|
{
|
|
"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.3229244540000309,
|
|
0.31889919699983693,
|
|
0.3229150720001144,
|
|
0.31798327299998164,
|
|
0.3189351019998412,
|
|
0.3180735190001087,
|
|
0.3188503060000585
|
|
],
|
|
"min_s": 0.31798327299998164,
|
|
"median_s": 0.31889919699983693,
|
|
"max_s": 0.3229244540000309,
|
|
"iqr_s": 0.004841553000005661,
|
|
"iqr_over_median": 0.015182079621254538
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
25.367273596000132,
|
|
24.91851582000004,
|
|
24.80163867500005,
|
|
25.764870866000138,
|
|
24.523001781999938,
|
|
25.067886242999975,
|
|
24.85969646800004
|
|
],
|
|
"min_s": 24.523001781999938,
|
|
"median_s": 24.91851582000004,
|
|
"max_s": 25.764870866000138,
|
|
"iqr_s": 0.5656349210000826,
|
|
"iqr_over_median": 0.022699382462662326
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 78.13916138525987,
|
|
"min": 76.80545389653186,
|
|
"max": 81.02586850850368
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.081042000821003,
|
|
"vectorbt": 0.9998694633565076
|
|
}
|
|
},
|
|
{
|
|
"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.02227130100004615,
|
|
0.012896017000002757,
|
|
0.013307124999982989,
|
|
0.015623138999899311,
|
|
0.018572385999959806,
|
|
0.01311688900000263,
|
|
0.013085992000014812
|
|
],
|
|
"min_s": 0.012896017000002757,
|
|
"median_s": 0.013307124999982989,
|
|
"max_s": 0.02227130100004615,
|
|
"iqr_s": 0.005486393999944994,
|
|
"iqr_over_median": 0.41228995744400143
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.42891496700008247,
|
|
0.20736030700004449,
|
|
0.20771924700011368,
|
|
0.21033216599994375,
|
|
0.2139387090001037,
|
|
0.21400341999992634,
|
|
0.36465912399989975
|
|
],
|
|
"min_s": 0.20736030700004449,
|
|
"median_s": 0.2139387090001037,
|
|
"max_s": 0.42891496700008247,
|
|
"iqr_s": 0.15693987699978607,
|
|
"iqr_over_median": 0.7335740116096054
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 16.079407075843662,
|
|
"min": 11.519182780315179,
|
|
"max": 27.866372224550265
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9908345422507613
|
|
}
|
|
},
|
|
{
|
|
"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.14341802100011591,
|
|
0.14587604200005444,
|
|
0.1439747819999866,
|
|
0.14483486800008905,
|
|
0.16363966400012941,
|
|
0.14317125000002306,
|
|
0.14649057899987383
|
|
],
|
|
"min_s": 0.14317125000002306,
|
|
"median_s": 0.14483486800008905,
|
|
"max_s": 0.16363966400012941,
|
|
"iqr_s": 0.003072557999757919,
|
|
"iqr_over_median": 0.021214214796370926
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.5565067089999047,
|
|
2.286807359000022,
|
|
2.5437298639999426,
|
|
2.288696568999967,
|
|
2.5330255450001005,
|
|
2.2876889350000056,
|
|
2.5355352779999976
|
|
],
|
|
"min_s": 2.286807359000022,
|
|
"median_s": 2.5330255450001005,
|
|
"max_s": 2.5565067089999047,
|
|
"iqr_s": 0.256040928999937,
|
|
"iqr_over_median": 0.10108106864746477
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 15.978689401675526,
|
|
"min": 15.479288352719285,
|
|
"max": 17.8255611893978
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.2507208539331298,
|
|
"vectorbt": 0.9992960153911904
|
|
}
|
|
},
|
|
{
|
|
"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.010991447999913362,
|
|
0.010809377999976277,
|
|
0.010707467999964138,
|
|
0.010633620000135124,
|
|
0.013683024999863846,
|
|
0.011050597999883394,
|
|
0.010710762999906365
|
|
],
|
|
"min_s": 0.010633620000135124,
|
|
"median_s": 0.010809377999976277,
|
|
"max_s": 0.013683024999863846,
|
|
"iqr_s": 0.0003431299999192561,
|
|
"iqr_over_median": 0.0317437321481411
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18317504199990253,
|
|
0.18067231800000627,
|
|
0.17392761099995369,
|
|
0.33920341400016696,
|
|
0.18228420800005551,
|
|
0.17970991099991807,
|
|
0.17375997699991785
|
|
],
|
|
"min_s": 0.17375997699991785,
|
|
"median_s": 0.18067231800000627,
|
|
"max_s": 0.33920341400016696,
|
|
"iqr_s": 0.009247430999948847,
|
|
"iqr_over_median": 0.05118344139442837
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.007785780999938652,
|
|
0.007744213000023592,
|
|
0.007711743000072602,
|
|
0.007797944000003554,
|
|
0.007788495999875522,
|
|
0.007808533000115858,
|
|
0.007783599000049435
|
|
],
|
|
"min_s": 0.007711743000072602,
|
|
"median_s": 0.007785780999938652,
|
|
"max_s": 0.007808533000115858,
|
|
"iqr_s": 5.373099997996178e-05,
|
|
"iqr_over_median": 0.0069011702204807915
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 16.262460276069618,
|
|
"min": 13.321923185981852,
|
|
"max": 31.899147608797062
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.7164346551707774,
|
|
"min": 0.5692086362447647,
|
|
"max": 0.733329195504867
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9980658185206216,
|
|
"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.10495266099997025,
|
|
0.11684381000009125,
|
|
0.11480037100000118,
|
|
0.11554238899998381,
|
|
0.11500177999982952,
|
|
0.11438688099997307,
|
|
0.11622175799993784
|
|
],
|
|
"min_s": 0.10495266099997025,
|
|
"median_s": 0.11500177999982952,
|
|
"max_s": 0.11684381000009125,
|
|
"iqr_s": 0.001834876999964763,
|
|
"iqr_over_median": 0.015955205214801746
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.040712714999927,
|
|
2.314468017000081,
|
|
2.066698793000114,
|
|
2.3341982450001524,
|
|
2.0710454789998494,
|
|
2.3247341919998235,
|
|
2.0481397460000608
|
|
],
|
|
"min_s": 2.040712714999927,
|
|
"median_s": 2.0710454789998494,
|
|
"max_s": 2.3341982450001524,
|
|
"iqr_s": 0.2765944459997627,
|
|
"iqr_over_median": 0.13355305269942014
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.0862263310000344,
|
|
0.07862739900019733,
|
|
0.08823097499998767,
|
|
0.0789900800000396,
|
|
0.08687320099988938,
|
|
0.07906726600003822,
|
|
0.08717225300006248
|
|
],
|
|
"min_s": 0.07862739900019733,
|
|
"median_s": 0.0862263310000344,
|
|
"max_s": 0.08823097499998767,
|
|
"iqr_s": 0.008182173000022885,
|
|
"iqr_over_median": 0.09489181442753977
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 19.444125528179846,
|
|
"min": 17.62268770707423,
|
|
"max": 20.32343369866314
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.7500510618683733,
|
|
"min": 0.6729273805787053,
|
|
"max": 0.8215735568634972
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 0.9902856115323238,
|
|
"vectorbt": 1.0006580799244513,
|
|
"raptorbt": 1.0424009309625302
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0008838890600401106,
|
|
"round_trips_delta": 10171,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853452,
|
|
"final_equity": 516.5774614654839,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.9957181144453853,
|
|
"final_equity": 428.18855546147284,
|
|
"round_trips": 220911,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted."
|
|
},
|
|
"raptorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.022352514553554532,
|
|
"round_trips_delta": 93295,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853452,
|
|
"final_equity": 516.5774614654839,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.9724817108317907,
|
|
"final_equity": 2751.828916820937,
|
|
"round_trips": 137787,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers."
|
|
}
|
|
},
|
|
"status": "documented",
|
|
"divergence_scale": {
|
|
"raptorbt": {
|
|
"round_trips": 137787,
|
|
"final_equity": 2751.828916820937
|
|
},
|
|
"manifoldbt": {
|
|
"reentries_on_exit_bar": 93295,
|
|
"round_trips": 231082,
|
|
"share_of_round_trips": 0.4037311430574428,
|
|
"sl_exits": 63245,
|
|
"tp_exits": 39487
|
|
}
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
1.0938301109999884,
|
|
1.0822019249999357,
|
|
1.0741370199998528,
|
|
1.0740174619998015,
|
|
1.0735488580000947,
|
|
1.0734366080000655,
|
|
1.0680245089999971
|
|
],
|
|
"min_s": 1.0680245089999971,
|
|
"median_s": 1.0740174619998015,
|
|
"max_s": 1.0938301109999884,
|
|
"iqr_s": 0.008765316999870265,
|
|
"iqr_over_median": 0.008161242540274345
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
25.34885260200008,
|
|
26.449796845000037,
|
|
25.433935591999898,
|
|
25.150011135000113,
|
|
25.19940975999998,
|
|
26.0010572220001,
|
|
25.222897539000087
|
|
],
|
|
"min_s": 25.150011135000113,
|
|
"median_s": 25.34885260200008,
|
|
"max_s": 26.449796845000037,
|
|
"iqr_s": 0.801647462000119,
|
|
"iqr_over_median": 0.031624605444148086
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.8916911960000107,
|
|
0.8841948920000959,
|
|
0.8747061929998381,
|
|
0.8779344900001433,
|
|
0.8752377180001076,
|
|
0.8764544499999829,
|
|
0.8777472740000576
|
|
],
|
|
"min_s": 0.8747061929998381,
|
|
"median_s": 0.8777472740000576,
|
|
"max_s": 0.8916911960000107,
|
|
"iqr_s": 0.0089571739999883,
|
|
"iqr_over_median": 0.010204730069019516
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 23.61640330016074,
|
|
"min": 23.174396414106713,
|
|
"max": 24.440722414166476
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.8164939070160065,
|
|
"min": 0.8143339040674327,
|
|
"max": 0.8218418834057486
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.022655399306693,
|
|
"vectorbt": 0.9999107373437759,
|
|
"raptorbt": 1.0003302692690246
|
|
}
|
|
}
|
|
],
|
|
"cold_start": {
|
|
"workload": "sma_cross",
|
|
"bars": 20000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"samples_s": {
|
|
"manifoldbt": [
|
|
0.46644176499989953,
|
|
0.4233923770000274,
|
|
0.4149115669999901
|
|
],
|
|
"vectorbt": [
|
|
7.282435325000051,
|
|
7.359608939000054,
|
|
7.364390715000127
|
|
],
|
|
"raptorbt": [
|
|
0.40151585800003886,
|
|
0.39548957599981804,
|
|
0.3936956680001913
|
|
],
|
|
"baseline": [
|
|
0.3522295130001112,
|
|
0.3622796229999494,
|
|
0.35250136200011184
|
|
]
|
|
},
|
|
"median_s": {
|
|
"manifoldbt": 0.4233923770000274,
|
|
"vectorbt": 7.359608939000054,
|
|
"raptorbt": 0.39548957599981804,
|
|
"baseline": 0.35250136200011184
|
|
},
|
|
"engine_share_s": {
|
|
"manifoldbt": 0.07089101499991557,
|
|
"vectorbt": 7.0071075769999425,
|
|
"raptorbt": 0.042988213999706204
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 17.382478615101704,
|
|
"raptorbt": 0.9340970633483853
|
|
}
|
|
},
|
|
"memory": {
|
|
"workload": "sma_cross",
|
|
"bars": 2000000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"manifoldbt": {
|
|
"before_mb": 728.94464,
|
|
"peak_mb": 728.956928,
|
|
"added_mb": 0.012287999999898602,
|
|
"added_mb_per_million_bars": 0.006143999999949301,
|
|
"seconds": 0.058185798000067734,
|
|
"mode": "memory",
|
|
"engine": "mbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"vectorbt": {
|
|
"before_mb": 613.777408,
|
|
"peak_mb": 862.683136,
|
|
"added_mb": 248.90572799999995,
|
|
"added_mb_per_million_bars": 124.45286399999998,
|
|
"seconds": 4.335076891999961,
|
|
"mode": "memory",
|
|
"engine": "vbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"raptorbt": {
|
|
"before_mb": 330.133504,
|
|
"peak_mb": 370.663424,
|
|
"added_mb": 40.529920000000004,
|
|
"added_mb_per_million_bars": 20.264960000000002,
|
|
"seconds": 0.16050234499994076,
|
|
"mode": "memory",
|
|
"engine": "rbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
}
|
|
},
|
|
"sweeps": null,
|
|
"sweep_reps": null
|
|
},
|
|
"sweeps": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-08-23T13:44:27.708416+00:00",
|
|
"environment": {
|
|
"os": "Linux",
|
|
"os_release": "6.17.0-1022-azure",
|
|
"arch": "x86_64",
|
|
"cpu": "AMD EPYC 7763 64-Core Processor",
|
|
"logical_cores": 4,
|
|
"ram_gb": 16.8,
|
|
"python": "3.12.14",
|
|
"versions": {
|
|
"manifoldbt": "0.19.0",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000210",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32642616670",
|
|
"commit": "44f8ed1a91da9826161aa53823e1bb891f39aa5e",
|
|
"pinned_cores": null,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
]
|
|
},
|
|
"reference": "manifoldbt",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"reps": 1,
|
|
"results": [
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.8917489796876906e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166725,
|
|
"final_equity": 106675.52139716671,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.06675521397166521,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.005803446000015811
|
|
],
|
|
"min_s": 0.005803446000015811,
|
|
"median_s": 0.005803446000015811,
|
|
"max_s": 0.005803446000015811,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.1942569980000144
|
|
],
|
|
"min_s": 0.1942569980000144,
|
|
"median_s": 0.1942569980000144,
|
|
"max_s": 0.1942569980000144,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.01128670600002124
|
|
],
|
|
"min_s": 0.01128670600002124,
|
|
"median_s": 0.01128670600002124,
|
|
"max_s": 0.01128670600002124,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 33.472698462169745,
|
|
"min": 33.472698462169745,
|
|
"max": 33.472698462169745
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.9448282968413062,
|
|
"min": 1.9448282968413062,
|
|
"max": 1.9448282968413062
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
}
|
|
}
|
|
],
|
|
"cold_start": null,
|
|
"memory": null,
|
|
"sweeps": [
|
|
{
|
|
"bars": 20000,
|
|
"combos": 5000,
|
|
"requested_combos": 5000,
|
|
"grid": {
|
|
"fast": 50,
|
|
"slow": 100
|
|
},
|
|
"data_digest": "ccec9b97c4ca2b6f",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 5000,
|
|
"worst_abs_return_delta": 1.2663481374630692e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
101,
|
|
118
|
|
]
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 5000,
|
|
"worst_abs_return_delta": 1.1102230246251565e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
19,
|
|
113
|
|
]
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 0.45537921499999356,
|
|
"vectorbt": 5.481004186999996,
|
|
"raptorbt": 6.752745947999983
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 12.036131660071648,
|
|
"raptorbt": 14.828840943037067
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 91.07584299999871
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 36.0,
|
|
"vectorbt": 2530.7,
|
|
"raptorbt": 32.8
|
|
},
|
|
"memory_baseline_mb": 2177.5,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
},
|
|
{
|
|
"bars": 20000,
|
|
"combos": 20000,
|
|
"requested_combos": 20000,
|
|
"grid": {
|
|
"fast": 125,
|
|
"slow": 160
|
|
},
|
|
"data_digest": "ccec9b97c4ca2b6f",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"out_of_scope": {
|
|
"vectorbt": {
|
|
"status": "out of scope",
|
|
"reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.",
|
|
"parity_scope": "anchor grid"
|
|
}
|
|
},
|
|
"parity": {
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 20000,
|
|
"worst_abs_return_delta": 1.1102230246251565e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
11,
|
|
733
|
|
]
|
|
},
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 250,
|
|
"worst_abs_return_delta": 2.2707530300536405e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
9,
|
|
78
|
|
],
|
|
"checked_at_combos": 250,
|
|
"scope": "anchor grid, not this grid"
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 1.9211620379999772,
|
|
"raptorbt": 26.626413162999995,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 13.859535341807701
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 96.05810189999886
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 64.2,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 612.7,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
},
|
|
{
|
|
"bars": 200000,
|
|
"combos": 10000,
|
|
"requested_combos": 10000,
|
|
"grid": {
|
|
"fast": 100,
|
|
"slow": 100
|
|
},
|
|
"data_digest": "e89a96644ec074e4",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"out_of_scope": {
|
|
"vectorbt": {
|
|
"status": "out of scope",
|
|
"reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.",
|
|
"parity_scope": "anchor grid"
|
|
}
|
|
},
|
|
"parity": {
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 10000,
|
|
"worst_abs_return_delta": 1.1796119636642288e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
7,
|
|
323
|
|
]
|
|
},
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 250,
|
|
"worst_abs_return_delta": 9.196202827022049e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
11,
|
|
53
|
|
],
|
|
"checked_at_combos": 250,
|
|
"scope": "anchor grid, not this grid"
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 9.693729294000036,
|
|
"raptorbt": 156.93451893400004,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 16.189282181743526
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 969.3729294000036
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 100.8,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 1729.4,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
}
|
|
],
|
|
"sweep_reps": 2
|
|
}
|
|
}
|