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": "32713305381",
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381",
|
|
"commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7",
|
|
"run_started_at": "",
|
|
"conclusion": "success",
|
|
"synced_at": "2026-08-24T10:15:18.247339+00:00",
|
|
"backtests": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-08-24T10:15:09.228209+00:00",
|
|
"environment": {
|
|
"os": "Linux",
|
|
"os_release": "6.17.0-1022-azure",
|
|
"arch": "x86_64",
|
|
"cpu": "AMD EPYC 7763 64-Core Processor",
|
|
"logical_cores": 4,
|
|
"ram_gb": 16.8,
|
|
"python": "3.12.14",
|
|
"versions": {
|
|
"manifoldbt": "0.19.1",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000221",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381",
|
|
"commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7",
|
|
"pinned_cores": null,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
]
|
|
},
|
|
"reference": "manifoldbt",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"reps": 7,
|
|
"results": [
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.8917489796876906e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166725,
|
|
"final_equity": 106675.52139716671,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.06675521397166521,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.005086016000007021,
|
|
0.0032640149999991763,
|
|
0.003371505000004049,
|
|
0.003337901999998394,
|
|
0.003271808999997461,
|
|
0.003305723000011085,
|
|
0.003306945000005612
|
|
],
|
|
"min_s": 0.0032640149999991763,
|
|
"median_s": 0.003306945000005612,
|
|
"max_s": 0.005086016000007021,
|
|
"iqr_s": 9.969600000658829e-05,
|
|
"iqr_over_median": 0.030147462387919696
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18361185099999489,
|
|
0.17885441299999627,
|
|
0.1857335680000034,
|
|
0.17952656899998942,
|
|
0.18028834999999788,
|
|
0.32503587800000844,
|
|
0.17677236500000504
|
|
],
|
|
"min_s": 0.17677236500000504,
|
|
"median_s": 0.18028834999999788,
|
|
"max_s": 0.32503587800000844,
|
|
"iqr_s": 0.006879155000007131,
|
|
"iqr_over_median": 0.0381564033394682
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.009773237000004542,
|
|
0.009820387000004871,
|
|
0.008156228999993687,
|
|
0.007777633000003448,
|
|
0.00757018599999526,
|
|
0.007587787999995044,
|
|
0.007597254999993197
|
|
],
|
|
"min_s": 0.00757018599999526,
|
|
"median_s": 0.007777633000003448,
|
|
"max_s": 0.009820387000004871,
|
|
"iqr_s": 0.0021854490000094984,
|
|
"iqr_over_median": 0.2809915304577279
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 54.795830595153944,
|
|
"min": 36.10131210750053,
|
|
"max": 98.32520087101022
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.31376159182921,
|
|
"min": 1.9215899045522173,
|
|
"max": 3.0086831708822874
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0072186409523143,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.8917489796876906e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 2.806945912450058e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.00034240713210042254,
|
|
"sortino": 0.0003424071320978874,
|
|
"volatility": 0.0003424071321000681
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093023,
|
|
"sharpe": 2.1149665518057725,
|
|
"sortino": 4.02133680320316,
|
|
"volatility": 0.17066118340286904
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166725,
|
|
"final_equity": 106675.52139716671,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093001,
|
|
"sharpe": 2.1142426200536755,
|
|
"sortino": 4.019960340111955,
|
|
"volatility": 0.17060276779841885
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 5.263023585843841e-16,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093023,
|
|
"sharpe": 2.1149665518057725,
|
|
"sortino": 4.02133680320316,
|
|
"volatility": 0.17066118340286904
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.06675521397166521,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093027,
|
|
"sharpe": 0.9692748979846307,
|
|
"sortino": 1.3742016523326603,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.003255979000002185,
|
|
0.004720033000012336,
|
|
0.004896713000007935,
|
|
0.00478545599999336,
|
|
0.004877547000006643,
|
|
0.0050088329999908865,
|
|
0.0033084580000064534
|
|
],
|
|
"min_s": 0.003255979000002185,
|
|
"median_s": 0.00478545599999336,
|
|
"max_s": 0.0050088329999908865,
|
|
"iqr_s": 0.0015882550000014817,
|
|
"iqr_over_median": 0.33189209137095516
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.6878645719999952,
|
|
0.9081481260000004,
|
|
0.8173868140000025,
|
|
0.8253067410000057,
|
|
0.6771847520000023,
|
|
0.6831418059999947,
|
|
0.820317715999991
|
|
],
|
|
"min_s": 0.6771847520000023,
|
|
"median_s": 0.8173868140000025,
|
|
"max_s": 0.9081481260000004,
|
|
"iqr_s": 0.14216493500001093,
|
|
"iqr_over_median": 0.17392614190129388
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.010578843000004667,
|
|
0.008162831000007031,
|
|
0.007974630000006755,
|
|
0.007688956999999164,
|
|
0.010505968000003918,
|
|
0.007584362000002898,
|
|
0.007647280000000478
|
|
],
|
|
"min_s": 0.007584362000002898,
|
|
"median_s": 0.007974630000006755,
|
|
"max_s": 0.010578843000004667,
|
|
"iqr_s": 0.00285868800000344,
|
|
"iqr_over_median": 0.3584728068889739
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 172.4614626069388,
|
|
"min": 136.3874191855144,
|
|
"max": 247.94563388696213
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.7294012563017458,
|
|
"min": 1.514197418843211,
|
|
"max": 3.249051360588495
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9945841246374895,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 4.220055416226387e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.20294254717537696,
|
|
"final_equity": 120294.2547175377,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.20294254717538115,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.036878396000005864,
|
|
0.03571583599999428,
|
|
0.03574679599998376,
|
|
0.03707817700001215,
|
|
0.0378416449999861,
|
|
0.03753157099998816,
|
|
0.035101703000009365
|
|
],
|
|
"min_s": 0.035101703000009365,
|
|
"median_s": 0.036878396000005864,
|
|
"max_s": 0.0378416449999861,
|
|
"iqr_s": 0.0018157349999938788,
|
|
"iqr_over_median": 0.04923573682525645
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.1526621960000085,
|
|
2.043684607000003,
|
|
2.0278536129999907,
|
|
2.272070284999984,
|
|
2.011077475999997,
|
|
2.2560072160000004,
|
|
1.9949298709999823
|
|
],
|
|
"min_s": 1.9949298709999823,
|
|
"median_s": 2.043684607000003,
|
|
"max_s": 2.272070284999984,
|
|
"iqr_s": 0.24492974000000345,
|
|
"iqr_over_median": 0.11984713255708497
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.08223053499999367,
|
|
0.08242296100000601,
|
|
0.0776152770000067,
|
|
0.08192856700000561,
|
|
0.07690396999998939,
|
|
0.08210328799998479,
|
|
0.07704403600001797
|
|
],
|
|
"min_s": 0.07690396999998939,
|
|
"median_s": 0.08192856700000561,
|
|
"max_s": 0.08242296100000601,
|
|
"iqr_s": 0.005186498999975697,
|
|
"iqr_over_median": 0.06330513506937503
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 57.2206851605078,
|
|
"min": 53.14455743138903,
|
|
"max": 61.27783156650985
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.194880288286794,
|
|
"min": 2.032257582883028,
|
|
"max": 2.3077427335039618
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0001161880238378,
|
|
"raptorbt": 0.9995562077532977
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 4.220055416226387e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 1.464735645642113e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.0003424071321271261,
|
|
"sortino": 0.00034240713212705575,
|
|
"volatility": 0.0003424071321024856
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.6860158229410881,
|
|
"sortino": 1.3522858253366064,
|
|
"volatility": 0.16128875607357201
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.20294254717537696,
|
|
"final_equity": 120294.2547175377,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.1515936377909961,
|
|
"sharpe": 0.6857810066333395,
|
|
"sortino": 1.351822951516634,
|
|
"volatility": 0.16123354855661204
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 0.0,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717538118,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.6860158229410881,
|
|
"sortino": 1.3522858253366064,
|
|
"volatility": 0.16128875607357201
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.20294254717538115,
|
|
"final_equity": 120294.25471753812,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099633,
|
|
"sharpe": 0.3005175738027932,
|
|
"sortino": 0.42543548791233987,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.037138538999997195,
|
|
0.03594979999999737,
|
|
0.03583431600000608,
|
|
0.03592240099999344,
|
|
0.03758607800000391,
|
|
0.03689630000002353,
|
|
0.03835280999999213
|
|
],
|
|
"min_s": 0.03583431600000608,
|
|
"median_s": 0.03689630000002353,
|
|
"max_s": 0.03835280999999213,
|
|
"iqr_s": 0.0016636770000104661,
|
|
"iqr_over_median": 0.04509061884279467
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
8.163776672000012,
|
|
8.496581371999994,
|
|
8.350863197999985,
|
|
8.325415729000014,
|
|
8.292014292000005,
|
|
8.267167305000015,
|
|
8.279689720999983
|
|
],
|
|
"min_s": 8.163776672000012,
|
|
"median_s": 8.292014292000005,
|
|
"max_s": 8.496581371999994,
|
|
"iqr_s": 0.0836958929999696,
|
|
"iqr_over_median": 0.010093553876374523
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.08701218100000574,
|
|
0.08703576599998541,
|
|
0.08671125800000823,
|
|
0.08601961200000119,
|
|
0.08658772300000805,
|
|
0.08563197399999467,
|
|
0.08672109099998693
|
|
],
|
|
"min_s": 0.08563197399999467,
|
|
"median_s": 0.08671125800000823,
|
|
"max_s": 0.08703576599998541,
|
|
"iqr_s": 0.0009925690000045506,
|
|
"iqr_over_median": 0.011446829660855069
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 224.0649416064685,
|
|
"min": 215.88221882573092,
|
|
"max": 236.3457201987387
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.342908023388112,
|
|
"min": 2.2611404744529726,
|
|
"max": 2.4210361670994494
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9999053160142127,
|
|
"raptorbt": 0.9740480498398478
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.2369127944111823e-14,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.30013524943743497,
|
|
"final_equity": 130013.5249437435,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.4551915228366853e-16,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.3001352494374475,
|
|
"final_equity": 130013.52494374475,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.32351850399999194,
|
|
0.3202701980000029,
|
|
0.32139288899998064,
|
|
0.31894670599990604,
|
|
0.3200021860000106,
|
|
0.31976874500003305,
|
|
0.31871445799993126
|
|
],
|
|
"min_s": 0.31871445799993126,
|
|
"median_s": 0.3200021860000106,
|
|
"max_s": 0.32351850399999194,
|
|
"iqr_s": 0.0024461830000745977,
|
|
"iqr_over_median": 0.007644269655315781
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
24.966537722999988,
|
|
25.087499501000025,
|
|
25.178886218000002,
|
|
24.910972221000065,
|
|
24.944502747,
|
|
24.874792727,
|
|
24.801107568999896
|
|
],
|
|
"min_s": 24.801107568999896,
|
|
"median_s": 24.944502747,
|
|
"max_s": 25.178886218000002,
|
|
"iqr_s": 0.2127067740000257,
|
|
"iqr_over_median": 0.008527200407937868
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.9003745869999875,
|
|
0.8885115830000245,
|
|
0.8903806420000819,
|
|
0.887415371999964,
|
|
0.8909642070000245,
|
|
0.8898108550000643,
|
|
0.896099920000097
|
|
],
|
|
"min_s": 0.887415371999964,
|
|
"median_s": 0.8903806420000819,
|
|
"max_s": 0.9003745869999875,
|
|
"iqr_s": 0.007588337000072443,
|
|
"iqr_over_median": 0.008522576347826466
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 77.95103858134011,
|
|
"min": 77.17190026014899,
|
|
"max": 78.34300969241892
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.7826698791339735,
|
|
"min": 2.7703806539420217,
|
|
"max": 2.811607373018171
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0835571080165156,
|
|
"vectorbt": 0.9998609629874063,
|
|
"raptorbt": 1.0026335682628353
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.2369127944111823e-14,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 1.1043826616631323e-14,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.0003424071321157821,
|
|
"sortino": 0.0003424071321161821,
|
|
"volatility": 0.0003424071321037301
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.16657583326366043,
|
|
"sortino": 0.3242480879539277,
|
|
"volatility": 0.15596640368660572
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.30013524943743497,
|
|
"final_equity": 130013.5249437435,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126802,
|
|
"sharpe": 0.16651881603341911,
|
|
"sortino": 0.324137101098728,
|
|
"volatility": 0.15591301795726933
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.4551915228366853e-16,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 0.0,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.3001352494374474,
|
|
"final_equity": 130013.52494374473,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.16657583326366043,
|
|
"sortino": 0.3242480879539277,
|
|
"volatility": 0.15596640368660572
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.3001352494374475,
|
|
"final_equity": 130013.52494374475,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126734,
|
|
"sharpe": 0.07064081213793068,
|
|
"sortino": 0.09993197026250207,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.32074174399997446,
|
|
0.3292579920000094,
|
|
0.32045135600003505,
|
|
0.32179833999998664,
|
|
0.31892916099991453,
|
|
0.3199751650000735,
|
|
0.32104021800000737
|
|
],
|
|
"min_s": 0.31892916099991453,
|
|
"median_s": 0.32074174399997446,
|
|
"max_s": 0.3292579920000094,
|
|
"iqr_s": 0.0018231749999131353,
|
|
"iqr_over_median": 0.005684246076535895
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
98.03886155999999,
|
|
98.29277811900005,
|
|
98.024604566,
|
|
97.924379467,
|
|
97.93534395500001,
|
|
97.4675261079999,
|
|
97.86300137600006
|
|
],
|
|
"min_s": 97.4675261079999,
|
|
"median_s": 97.93534395500001,
|
|
"max_s": 98.29277811900005,
|
|
"iqr_s": 0.1758601839999301,
|
|
"iqr_over_median": 0.0017956763809471635
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.8999588449999578,
|
|
0.9001707470000611,
|
|
0.8982293809999646,
|
|
0.897499420000031,
|
|
0.9007717609999872,
|
|
0.8987831899999037,
|
|
0.8962689560000854
|
|
],
|
|
"min_s": 0.8962689560000854,
|
|
"median_s": 0.8987831899999037,
|
|
"max_s": 0.9007717609999872,
|
|
"iqr_s": 0.0026713270000300327,
|
|
"iqr_over_median": 0.002972159503817955
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 304.83097097821496,
|
|
"min": 298.5281466425187,
|
|
"max": 307.07553880601796
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.803013200542882,
|
|
"min": 2.733937425579742,
|
|
"max": 2.8243631224434464
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0922682620656068,
|
|
"vectorbt": 0.999859243462431,
|
|
"raptorbt": 0.9997326152339213
|
|
}
|
|
},
|
|
{
|
|
"workload": "ema_rsi_fees",
|
|
"title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.3096723705530167e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 4.7748471843078734e-17
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.01570110342278974,
|
|
"final_equity": 98429.88965772103,
|
|
"round_trips": 3176,
|
|
"fills": 6352,
|
|
"total_fees": 1542.3890014306103
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.01570110342278846,
|
|
"final_equity": 98429.88965772116,
|
|
"round_trips": 3176,
|
|
"fills": null,
|
|
"total_fees": 1542.3890014306055
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "Two blockers, either one sufficient. Sizing: raptorbt has no fixed-quantity mode. `position_sizes` is a fraction of equity (measured: 0.5 buys exactly half the equity of the bar before the entry), `lot_size` rounds a computed size down to a multiple, and `alloted_capital` fixes the notional, not the quantity. Reproducing `units=5` would mean feeding a fraction derived from an equity curve that does not exist until the run is over. Indicator: `raptorbt.ema` seeds on a simple mean of the first `period` bars and emits from bar `period-1`, while manifoldbt seeds on the first observation and emits from bar 0 (measured: 11 leading NaN for span 12, and ema[11] equal to sma(12)[11] to the last bit). The two are the same recursion with a different warmup, so the signal differs early and the round-trip count with it. Its `sma` and `rsi` do match, which is why the other three workloads run."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.00484398899993721,
|
|
0.004881091000015658,
|
|
0.004743271000052118,
|
|
0.004768868999917686,
|
|
0.017285433000097328,
|
|
0.004837667999936457,
|
|
0.004986926999890784
|
|
],
|
|
"min_s": 0.004743271000052118,
|
|
"median_s": 0.00484398899993721,
|
|
"max_s": 0.017285433000097328,
|
|
"iqr_s": 0.00021805799997309805,
|
|
"iqr_over_median": 0.04501620461481738
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18274148899990905,
|
|
0.18636382799991225,
|
|
0.1908901040001183,
|
|
0.34402032499997404,
|
|
0.1837524590000612,
|
|
0.18440214299994295,
|
|
0.18748917100015206
|
|
],
|
|
"min_s": 0.18274148899990905,
|
|
"median_s": 0.18636382799991225,
|
|
"max_s": 0.34402032499997404,
|
|
"iqr_s": 0.007137645000057091,
|
|
"iqr_over_median": 0.03829951915379444
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 38.117982259709656,
|
|
"min": 10.630480532308711,
|
|
"max": 72.13876602731425
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.000233260562006
|
|
}
|
|
},
|
|
{
|
|
"workload": "ema_rsi_fees",
|
|
"title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 8.294591680169105e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 2.1100277081131935e-15
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.1532708157041739,
|
|
"final_equity": 84672.91842958261,
|
|
"round_trips": 31389,
|
|
"fills": 62779,
|
|
"total_fees": 15206.83039822937
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.15327081570418216,
|
|
"final_equity": 84672.91842958178,
|
|
"round_trips": 31389,
|
|
"fills": null,
|
|
"total_fees": 15206.830398229158
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "Two blockers, either one sufficient. Sizing: raptorbt has no fixed-quantity mode. `position_sizes` is a fraction of equity (measured: 0.5 buys exactly half the equity of the bar before the entry), `lot_size` rounds a computed size down to a multiple, and `alloted_capital` fixes the notional, not the quantity. Reproducing `units=5` would mean feeding a fraction derived from an equity curve that does not exist until the run is over. Indicator: `raptorbt.ema` seeds on a simple mean of the first `period` bars and emits from bar `period-1`, while manifoldbt seeds on the first observation and emits from bar 0 (measured: 11 leading NaN for span 12, and ema[11] equal to sma(12)[11] to the last bit). The two are the same recursion with a different warmup, so the signal differs early and the round-trip count with it. Its `sma` and `rsi` do match, which is why the other three workloads run."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.05468129000018962,
|
|
0.05192759400006253,
|
|
0.05483863199992811,
|
|
0.054464268999936394,
|
|
0.05389681199994811,
|
|
0.052467804999878354,
|
|
0.051793465999935506
|
|
],
|
|
"min_s": 0.051793465999935506,
|
|
"median_s": 0.05389681199994811,
|
|
"max_s": 0.05483863199992811,
|
|
"iqr_s": 0.0027536960001270927,
|
|
"iqr_over_median": 0.051092001510771055
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.040135706000001,
|
|
2.2946230769998692,
|
|
2.0383569709999847,
|
|
2.2844864599999255,
|
|
2.0221348820000458,
|
|
2.278572961000009,
|
|
2.023895618000097
|
|
],
|
|
"min_s": 2.0221348820000458,
|
|
"median_s": 2.040135706000001,
|
|
"max_s": 2.2946230769998692,
|
|
"iqr_s": 0.2605908419998286,
|
|
"iqr_over_median": 0.12773211175777957
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 39.07627301873593,
|
|
"min": 37.170091533331046,
|
|
"max": 44.18889650456569
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9998527803550585
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 8.731149137020111e-16,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 1.4210854715202004e-18
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.002745042655159957,
|
|
"final_equity": 99725.49573448401,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 218.42799507745576
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.0027450426551607985,
|
|
"final_equity": 99725.49573448392,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 218.4279950774559
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.003871248999985255,
|
|
0.003302136000002065,
|
|
0.0033703130000048986,
|
|
0.0035228179999649,
|
|
0.005218563999960679,
|
|
0.003723248999904172,
|
|
0.003339085000106934
|
|
],
|
|
"min_s": 0.003302136000002065,
|
|
"median_s": 0.0035228179999649,
|
|
"max_s": 0.005218563999960679,
|
|
"iqr_s": 0.0005321639998783212,
|
|
"iqr_over_median": 0.15106201906644723
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.17765502999986893,
|
|
0.33669244599991544,
|
|
0.18637438899986591,
|
|
0.1779633249998369,
|
|
0.17972546500004682,
|
|
0.1834427849998974,
|
|
0.18913354100004653
|
|
],
|
|
"min_s": 0.17765502999986893,
|
|
"median_s": 0.1834427849998974,
|
|
"max_s": 0.33669244599991544,
|
|
"iqr_s": 0.01117021600020962,
|
|
"iqr_over_median": 0.06089209777433257
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 50.51732022534518,
|
|
"min": 34.439639908871676,
|
|
"max": 101.96201670667256
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9923220957665657
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.6007106751203538e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 6.821210263296961e-17
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.02986364258908214,
|
|
"final_equity": 97013.63574109178,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 2195.9426086254202
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.02986364258908383,
|
|
"final_equity": 97013.63574109162,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 2195.9426086254134
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.0406119189999572,
|
|
0.03566852800008746,
|
|
0.03565877999994882,
|
|
0.034294702999886795,
|
|
0.03435004600009961,
|
|
0.035560656999905405,
|
|
0.038307935999910114
|
|
],
|
|
"min_s": 0.034294702999886795,
|
|
"median_s": 0.03565877999994882,
|
|
"max_s": 0.0406119189999572,
|
|
"iqr_s": 0.003957889999810504,
|
|
"iqr_over_median": 0.11099342153085959
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.049106897999991,
|
|
2.1562171769999168,
|
|
2.0434591430000637,
|
|
2.1485062799999923,
|
|
2.043331909000017,
|
|
2.165936456000054,
|
|
2.1759491909999724
|
|
],
|
|
"min_s": 2.043331909000017,
|
|
"median_s": 2.1485062799999923,
|
|
"max_s": 2.1759491909999724,
|
|
"iqr_s": 0.12247731299999032,
|
|
"iqr_over_median": 0.057005797069390345
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 59.48556543400528,
|
|
"min": 50.45580086974345,
|
|
"max": 62.648341932195315
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9984774535254388
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 8.149072527885436e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 3.1650415621697903e-15
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.30242917768507427,
|
|
"final_equity": 69757.08223149258,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 21749.94829446186
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.30242917768506616,
|
|
"final_equity": 69757.08223149339,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 21749.948294462178
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "Same blocker as the other fixed-quantity workload: raptorbt has no units sizing, and a cost model on top of a fraction of equity compares policy rather than arithmetic. See `ema_rsi_fees` for the measurements behind that."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.33108427800016216,
|
|
0.31927832199994555,
|
|
0.32159976499997356,
|
|
0.31982600300011654,
|
|
0.32315278700002636,
|
|
0.31991790799997943,
|
|
0.3188191829999596
|
|
],
|
|
"min_s": 0.3188191829999596,
|
|
"median_s": 0.31991790799997943,
|
|
"max_s": 0.33108427800016216,
|
|
"iqr_s": 0.003874465000080818,
|
|
"iqr_over_median": 0.012110810002174267
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
24.860258039999962,
|
|
25.55476604500018,
|
|
24.87219184399987,
|
|
24.9671859529999,
|
|
24.799834751000162,
|
|
24.951896657999896,
|
|
24.55627262400003
|
|
],
|
|
"min_s": 24.55627262400003,
|
|
"median_s": 24.87219184399987,
|
|
"max_s": 25.55476604500018,
|
|
"iqr_s": 0.16735120199973608,
|
|
"iqr_over_median": 0.006728446091497466
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 77.33896150080183,
|
|
"min": 75.0874012809143,
|
|
"max": 80.03915168723712
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0959860860280388,
|
|
"vectorbt": 0.9998143591409021
|
|
}
|
|
},
|
|
{
|
|
"workload": "multi_asset",
|
|
"title": "Five assets in one book, SMA 30/150, 5 bps fee",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.4551915228366853e-16,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 5.115907697472722e-18
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.004784214364567441,
|
|
"final_equity": 99521.57856354325,
|
|
"round_trips": 2350,
|
|
"fills": 4700,
|
|
"total_fees": 464.09434549765643
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.004784214364567548,
|
|
"final_equity": 99521.57856354324,
|
|
"round_trips": 2350,
|
|
"fills": null,
|
|
"total_fees": 464.09434549765695
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "No multi-instrument portfolio on the entry point this harness drives: `run_single_backtest` is one instrument, and `run_multi_backtest` broadcasts over strategies rather than over assets. 0.9.0 does add `run_portfolio_backtest`, but its allocation model is a different one and would need its own parity work before any timing from it could be published. The units blocker applies here too."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.023109289999865723,
|
|
0.01271814199981236,
|
|
0.013359569999920495,
|
|
0.013076972000135356,
|
|
0.01802267500011112,
|
|
0.013018533000149546,
|
|
0.012592148999829078
|
|
],
|
|
"min_s": 0.012592148999829078,
|
|
"median_s": 0.013076972000135356,
|
|
"max_s": 0.023109289999865723,
|
|
"iqr_s": 0.005304533000298761,
|
|
"iqr_over_median": 0.40563924127419215
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.41095788000006905,
|
|
0.21117583900013415,
|
|
0.21494155900018086,
|
|
0.21643066900014674,
|
|
0.21761884700003975,
|
|
0.21590418599998884,
|
|
0.3576757230000567
|
|
],
|
|
"min_s": 0.21117583900013415,
|
|
"median_s": 0.21643066900014674,
|
|
"max_s": 0.41095788000006905,
|
|
"iqr_s": 0.14273416399987582,
|
|
"iqr_over_median": 0.6594913958325336
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 16.58437137252782,
|
|
"min": 12.074725144780006,
|
|
"max": 28.404660952226
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9974496172785567
|
|
}
|
|
},
|
|
{
|
|
"workload": "multi_asset",
|
|
"title": "Five assets in one book, SMA 30/150, 5 bps fee",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.0186340659856795e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 2.7284841053187848e-17
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.0447197098443024,
|
|
"final_equity": 95528.02901556976,
|
|
"round_trips": 22902,
|
|
"fills": 45806,
|
|
"total_fees": 4561.765315438204
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.044719709844301396,
|
|
"final_equity": 95528.02901556986,
|
|
"round_trips": 22902,
|
|
"fills": null,
|
|
"total_fees": 4561.7653154382015
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"unsupported": {
|
|
"raptorbt": "No multi-instrument portfolio on the entry point this harness drives: `run_single_backtest` is one instrument, and `run_multi_backtest` broadcasts over strategies rather than over assets. 0.9.0 does add `run_portfolio_backtest`, but its allocation model is a different one and would need its own parity work before any timing from it could be published. The units blocker applies here too."
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.14334547500016015,
|
|
0.14099054200005412,
|
|
0.14265404699995088,
|
|
0.14506040900005246,
|
|
0.14237165400004415,
|
|
0.14354739600003086,
|
|
0.14592469600006552
|
|
],
|
|
"min_s": 0.14099054200005412,
|
|
"median_s": 0.14334547500016015,
|
|
"max_s": 0.14592469600006552,
|
|
"iqr_s": 0.002688755000008314,
|
|
"iqr_over_median": 0.018757166907468197
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.548502177999808,
|
|
2.2950072179999097,
|
|
2.5687573969998994,
|
|
2.3378954519998842,
|
|
2.5308834439999828,
|
|
2.2760534960000314,
|
|
2.5351989760001743
|
|
],
|
|
"min_s": 2.2760534960000314,
|
|
"median_s": 2.5308834439999828,
|
|
"max_s": 2.5687573969998994,
|
|
"iqr_s": 0.25349495999989813,
|
|
"iqr_over_median": 0.10016066152744561
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 17.373337382173034,
|
|
"min": 15.855763040101,
|
|
"max": 18.006901668908025
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.2650735266363864,
|
|
"vectorbt": 0.9992804852288221
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.01145740341532248,
|
|
"round_trips_delta": 94,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.05756525685928504,
|
|
"final_equity": 94243.4743140715,
|
|
"round_trips": 2309,
|
|
"fills": 4618,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.06902266027460748,
|
|
"final_equity": 93097.73397253925,
|
|
"round_trips": 2215,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted."
|
|
},
|
|
"raptorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.009248235144781793,
|
|
"round_trips_delta": 925,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.05756525685928504,
|
|
"final_equity": 94243.4743140715,
|
|
"round_trips": 2309,
|
|
"fills": 4618,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.06681349200406679,
|
|
"final_equity": 93318.65079959332,
|
|
"round_trips": 1384,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers."
|
|
}
|
|
},
|
|
"status": "documented",
|
|
"divergence_scale": {
|
|
"raptorbt": {
|
|
"round_trips": 1384,
|
|
"final_equity": 93318.65079959332
|
|
},
|
|
"manifoldbt": {
|
|
"reentries_on_exit_bar": 925,
|
|
"round_trips": 2309,
|
|
"share_of_round_trips": 0.40060632308358596,
|
|
"sl_exits": 632,
|
|
"tp_exits": 388
|
|
}
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.007959955000160335,
|
|
0.007891016000030504,
|
|
0.007931120999955965,
|
|
0.007959473000028083,
|
|
0.010777479000125822,
|
|
0.008580210999980409,
|
|
0.008099854999954914
|
|
],
|
|
"min_s": 0.007891016000030504,
|
|
"median_s": 0.007959955000160335,
|
|
"max_s": 0.010777479000125822,
|
|
"iqr_s": 0.0006490900000244437,
|
|
"iqr_over_median": 0.08154443084305996
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18156059499983712,
|
|
0.17893430799995258,
|
|
0.17498802799991608,
|
|
0.3380797410000014,
|
|
0.18128034300002582,
|
|
0.1753626570000506,
|
|
0.18014177999998537
|
|
],
|
|
"min_s": 0.17498802799991608,
|
|
"median_s": 0.18014177999998537,
|
|
"max_s": 0.3380797410000014,
|
|
"iqr_s": 0.006197937999786518,
|
|
"iqr_over_median": 0.034405888516184424
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.00758355300013136,
|
|
0.007616654999992534,
|
|
0.007598629999847617,
|
|
0.007624738999993497,
|
|
0.007543028000100094,
|
|
0.007516827999779707,
|
|
0.007618218000061461
|
|
],
|
|
"min_s": 0.007516827999779707,
|
|
"median_s": 0.007598629999847617,
|
|
"max_s": 0.007624738999993497,
|
|
"iqr_s": 7.5189999961367e-05,
|
|
"iqr_over_median": 0.0098952047886099
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 22.24012405172538,
|
|
"min": 16.820291925218267,
|
|
"max": 42.47514138169807
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.9527130492545004,
|
|
"min": 0.6998879793699465,
|
|
"max": 0.9652312199041404
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9855727381427762,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 1000000,
|
|
"data_digest": "0ef03e7a3c4d011c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.010543837599986582,
|
|
"round_trips_delta": 1092,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.45070441471402267,
|
|
"final_equity": 54929.558528597736,
|
|
"round_trips": 23075,
|
|
"fills": 46151,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.46124825231400923,
|
|
"final_equity": 53875.17476859908,
|
|
"round_trips": 21983,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted."
|
|
},
|
|
"raptorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.10072796246195154,
|
|
"round_trips_delta": 9330,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.45070441471402267,
|
|
"final_equity": 54929.558528597736,
|
|
"round_trips": 23075,
|
|
"fills": 46151,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.3499764522520711,
|
|
"final_equity": 65002.35477479289,
|
|
"round_trips": 13745,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers."
|
|
}
|
|
},
|
|
"status": "documented",
|
|
"divergence_scale": {
|
|
"raptorbt": {
|
|
"round_trips": 13745,
|
|
"final_equity": 65002.35477479289
|
|
},
|
|
"manifoldbt": {
|
|
"reentries_on_exit_bar": 9330,
|
|
"round_trips": 23075,
|
|
"share_of_round_trips": 0.40433369447453954,
|
|
"sl_exits": 6363,
|
|
"tp_exits": 3906
|
|
}
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.07556033000014395,
|
|
0.086905655999999,
|
|
0.08652868299986949,
|
|
0.08505993099993248,
|
|
0.08579243899998801,
|
|
0.08698165699979654,
|
|
0.08476480800004538
|
|
],
|
|
"min_s": 0.07556033000014395,
|
|
"median_s": 0.08579243899998801,
|
|
"max_s": 0.08698165699979654,
|
|
"iqr_s": 0.002140847999953621,
|
|
"iqr_over_median": 0.024953807408994638
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.0287785399998484,
|
|
2.2871528539999417,
|
|
2.0491359790000843,
|
|
2.2847077960000206,
|
|
2.020059084999957,
|
|
2.2943602479999754,
|
|
2.0258624880000298
|
|
],
|
|
"min_s": 2.020059084999957,
|
|
"median_s": 2.0491359790000843,
|
|
"max_s": 2.2943602479999754,
|
|
"iqr_s": 0.26129036599991196,
|
|
"iqr_over_median": 0.12751245826419663
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.07557534700003998,
|
|
0.08625597499985815,
|
|
0.07516399199994339,
|
|
0.08486126000002514,
|
|
0.07653187899995828,
|
|
0.08565653300001941,
|
|
0.07646637699986059
|
|
],
|
|
"min_s": 0.07516399199994339,
|
|
"median_s": 0.07653187899995828,
|
|
"max_s": 0.08625597499985815,
|
|
"iqr_s": 0.010081185999979425,
|
|
"iqr_over_median": 0.13172531671390064
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 26.317652489729415,
|
|
"min": 23.545887126489543,
|
|
"max": 26.859977067249613
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.9847654776250097,
|
|
"min": 0.8686598408074322,
|
|
"max": 1.000198741851657
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0480169166975069,
|
|
"vectorbt": 0.9999961981465524,
|
|
"raptorbt": 0.9990876848650796
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 10000000,
|
|
"data_digest": "f4e6a3a8823f3768",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0008838890600401106,
|
|
"round_trips_delta": 10171,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853452,
|
|
"final_equity": 516.5774614654839,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.9957181144453853,
|
|
"final_equity": 428.18855546147284,
|
|
"round_trips": 220911,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Re-entry on the exit bar. When a bracket fires intrabar and the entry condition still holds at that bar's close, manifoldbt books two orders on that bar (the stop or target exit, then a fresh entry at the close); vectorbt processes one order per bar and re-enters on the next bar instead. Neither is wrong, and on controlled bars the bracket fills themselves match exactly (see the cross-engine parity suite shipped with the library). The harness counts the affected round-trips so the size of the divergence is measured, not asserted."
|
|
},
|
|
"raptorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.022352514553554532,
|
|
"round_trips_delta": 93295,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853452,
|
|
"final_equity": 516.5774614654839,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.9724817108317907,
|
|
"final_equity": 2751.828916820937,
|
|
"round_trips": 137787,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": "Same fork in the road, taken further: raptorbt does not re-arm at all. Once a bracket closes a position, the entry level being still true is not enough to open another one; it waits for the level to go false and true again. So on the same bars the three engines book a different number of round-trips from the same signal, manifoldbt re-entering on the exit bar, vectorbt on the next bar, raptorbt not until the next crossing. The count of affected round-trips is measured rather than asserted, and it is the same population for both challengers."
|
|
}
|
|
},
|
|
"status": "documented",
|
|
"divergence_scale": {
|
|
"raptorbt": {
|
|
"round_trips": 137787,
|
|
"final_equity": 2751.828916820937
|
|
},
|
|
"manifoldbt": {
|
|
"reentries_on_exit_bar": 93295,
|
|
"round_trips": 231082,
|
|
"share_of_round_trips": 0.4037311430574428,
|
|
"sl_exits": 63245,
|
|
"tp_exits": 39487
|
|
}
|
|
},
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.8068502040000567,
|
|
0.7967224879998867,
|
|
0.7939243590001297,
|
|
0.7900002689998473,
|
|
0.7876182999998491,
|
|
0.7906549809999888,
|
|
0.7919537610000589
|
|
],
|
|
"min_s": 0.7876182999998491,
|
|
"median_s": 0.7919537610000589,
|
|
"max_s": 0.8068502040000567,
|
|
"iqr_s": 0.006722219000039331,
|
|
"iqr_over_median": 0.008488145812390215
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
24.9078087649998,
|
|
25.90321060400015,
|
|
25.31438572000002,
|
|
24.825181309000072,
|
|
24.855272518999982,
|
|
25.89725853599998,
|
|
25.41575723899996
|
|
],
|
|
"min_s": 24.825181309000072,
|
|
"median_s": 25.31438572000002,
|
|
"max_s": 25.90321060400015,
|
|
"iqr_s": 1.0419860169999993,
|
|
"iqr_over_median": 0.04116181322846646
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.8893825309999102,
|
|
0.8786584000001767,
|
|
0.8827479530000346,
|
|
0.8890934060000291,
|
|
0.8824379769998814,
|
|
0.8857742300001519,
|
|
0.8819613980001577
|
|
],
|
|
"min_s": 0.8786584000001767,
|
|
"median_s": 0.8827479530000346,
|
|
"max_s": 0.8893825309999102,
|
|
"iqr_s": 0.007132007999871348,
|
|
"iqr_over_median": 0.008079325446899188
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 31.885135445246974,
|
|
"min": 30.870425069630457,
|
|
"max": 32.754183756922856
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.1136526416472088,
|
|
"min": 1.1022895285775347,
|
|
"max": 1.12543430792199
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0363954066133985,
|
|
"vectorbt": 0.9998934348920596,
|
|
"raptorbt": 1.0016064644921072
|
|
}
|
|
}
|
|
],
|
|
"cold_start": {
|
|
"workload": "sma_cross",
|
|
"bars": 20000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"samples_s": {
|
|
"manifoldbt": [
|
|
0.4424554540000827,
|
|
0.41451248299995314,
|
|
0.413940496999885
|
|
],
|
|
"vectorbt": [
|
|
7.340981547999945,
|
|
7.887811972999998,
|
|
7.206707354000173
|
|
],
|
|
"raptorbt": [
|
|
0.40212875299994266,
|
|
0.3889863320000586,
|
|
0.3910420580000391
|
|
],
|
|
"baseline": [
|
|
0.3473758520001411,
|
|
0.3551300369999808,
|
|
0.3489620369998647
|
|
]
|
|
},
|
|
"median_s": {
|
|
"manifoldbt": 0.41451248299995314,
|
|
"vectorbt": 7.340981547999945,
|
|
"raptorbt": 0.3910420580000391,
|
|
"baseline": 0.3489620369998647
|
|
},
|
|
"engine_share_s": {
|
|
"manifoldbt": 0.06555044600008841,
|
|
"vectorbt": 6.9920195110000805,
|
|
"raptorbt": 0.042080021000174384
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 17.709916707142387,
|
|
"raptorbt": 0.9433782432074146
|
|
}
|
|
},
|
|
"memory": {
|
|
"workload": "sma_cross",
|
|
"bars": 2000000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"manifoldbt": {
|
|
"before_mb": 728.674304,
|
|
"peak_mb": 728.686592,
|
|
"added_mb": 0.012288000000012289,
|
|
"added_mb_per_million_bars": 0.0061440000000061445,
|
|
"seconds": 0.05825765299982777,
|
|
"mode": "memory",
|
|
"engine": "mbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"vectorbt": {
|
|
"before_mb": 614.281216,
|
|
"peak_mb": 864.681984,
|
|
"added_mb": 250.40076800000008,
|
|
"added_mb_per_million_bars": 125.20038400000004,
|
|
"seconds": 4.3868381639999825,
|
|
"mode": "memory",
|
|
"engine": "vbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"raptorbt": {
|
|
"before_mb": 330.174464,
|
|
"peak_mb": 370.70848,
|
|
"added_mb": 40.53401600000001,
|
|
"added_mb_per_million_bars": 20.267008000000004,
|
|
"seconds": 0.161842740000111,
|
|
"mode": "memory",
|
|
"engine": "rbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
}
|
|
},
|
|
"sweeps": null,
|
|
"sweep_reps": null
|
|
},
|
|
"sweeps": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-08-24T09:59:57.098825+00:00",
|
|
"environment": {
|
|
"os": "Linux",
|
|
"os_release": "6.17.0-1022-azure",
|
|
"arch": "x86_64",
|
|
"cpu": "AMD EPYC 7763 64-Core Processor",
|
|
"logical_cores": 4,
|
|
"ram_gb": 16.8,
|
|
"python": "3.12.14",
|
|
"versions": {
|
|
"manifoldbt": "0.19.1",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000222",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/32713305381",
|
|
"commit": "8208a3310e0ceb7ec53e1401b8aa1a4eb9b0a8c7",
|
|
"pinned_cores": null,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
]
|
|
},
|
|
"reference": "manifoldbt",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"reps": 1,
|
|
"results": [
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 100000,
|
|
"data_digest": "b7c2ad8cea687ce0",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.8917489796876906e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166725,
|
|
"final_equity": 106675.52139716671,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.06675521397166517,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.06675521397166521,
|
|
"final_equity": 106675.52139716652,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.005212192999806575
|
|
],
|
|
"min_s": 0.005212192999806575,
|
|
"median_s": 0.005212192999806575,
|
|
"max_s": 0.005212192999806575,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.18328484499988917
|
|
],
|
|
"min_s": 0.18328484499988917,
|
|
"median_s": 0.18328484499988917,
|
|
"max_s": 0.18328484499988917,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.011166662000050565
|
|
],
|
|
"min_s": 0.011166662000050565,
|
|
"median_s": 0.011166662000050565,
|
|
"max_s": 0.011166662000050565,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 35.164631280286606,
|
|
"min": 35.164631280286606,
|
|
"max": 35.164631280286606
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.1424114572244273,
|
|
"min": 2.1424114572244273,
|
|
"max": 2.1424114572244273
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
}
|
|
}
|
|
],
|
|
"cold_start": null,
|
|
"memory": null,
|
|
"sweeps": [
|
|
{
|
|
"bars": 20000,
|
|
"combos": 5000,
|
|
"requested_combos": 5000,
|
|
"grid": {
|
|
"fast": 50,
|
|
"slow": 100
|
|
},
|
|
"data_digest": "ccec9b97c4ca2b6f",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 5000,
|
|
"worst_abs_return_delta": 1.2663481374630692e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
101,
|
|
118
|
|
]
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 5000,
|
|
"worst_abs_return_delta": 1.1102230246251565e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
19,
|
|
113
|
|
]
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 0.4702996930000154,
|
|
"vectorbt": 5.237195704999976,
|
|
"raptorbt": 6.737781942999845
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 11.135868857562288,
|
|
"raptorbt": 14.326570999908403
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 94.05993860000308
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 38.4,
|
|
"vectorbt": 2531.8,
|
|
"raptorbt": 35.1
|
|
},
|
|
"memory_baseline_mb": 2173.6,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
},
|
|
{
|
|
"bars": 20000,
|
|
"combos": 20000,
|
|
"requested_combos": 20000,
|
|
"grid": {
|
|
"fast": 125,
|
|
"slow": 160
|
|
},
|
|
"data_digest": "ccec9b97c4ca2b6f",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"out_of_scope": {
|
|
"vectorbt": {
|
|
"status": "out of scope",
|
|
"reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.",
|
|
"parity_scope": "anchor grid"
|
|
}
|
|
},
|
|
"parity": {
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 20000,
|
|
"worst_abs_return_delta": 1.1102230246251565e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
11,
|
|
733
|
|
]
|
|
},
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 250,
|
|
"worst_abs_return_delta": 2.2707530300536405e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
9,
|
|
78
|
|
],
|
|
"checked_at_combos": 250,
|
|
"scope": "anchor grid, not this grid"
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 1.9359811260001152,
|
|
"raptorbt": 26.944831631999932,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 13.917920619231454
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 96.79905630000576
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 61.6,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 613.2,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
},
|
|
{
|
|
"bars": 200000,
|
|
"combos": 10000,
|
|
"requested_combos": 10000,
|
|
"grid": {
|
|
"fast": 100,
|
|
"slow": 100
|
|
},
|
|
"data_digest": "e89a96644ec074e4",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"raptorbt"
|
|
],
|
|
"metrics": false,
|
|
"tier_before": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
},
|
|
"out_of_scope": {
|
|
"vectorbt": {
|
|
"status": "out of scope",
|
|
"reason": "vectorbt materialises the simulation per combination (measured: 1.57 MB per combination at 20k bars), so this grid would need tens of gigabytes. Running it would measure the swap file.",
|
|
"parity_scope": "anchor grid"
|
|
}
|
|
},
|
|
"parity": {
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 10000,
|
|
"worst_abs_return_delta": 1.1796119636642288e-16,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
7,
|
|
323
|
|
]
|
|
},
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"combos_compared": 250,
|
|
"worst_abs_return_delta": 9.196202827022049e-15,
|
|
"worst_component": "return",
|
|
"worst_pair": [
|
|
11,
|
|
53
|
|
],
|
|
"checked_at_combos": 250,
|
|
"scope": "anchor grid, not this grid"
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"timings": {
|
|
"seconds": {
|
|
"manifoldbt": 9.608373389000008,
|
|
"raptorbt": 151.70980005299998,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 15.789332274147725
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 960.8373389000008
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 81.6,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 1755.2,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
}
|
|
],
|
|
"sweep_reps": 2
|
|
}
|
|
}
|