mirror of
https://github.com/manifoldbt/manifoldbt.git
synced 2026-11-02 07:56:11 +00:00
2497 lines
82 KiB
JSON
2497 lines
82 KiB
JSON
{
|
|
"repo": "manifoldbt/manifoldbt",
|
|
"run_id": "35590549822",
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/35590549822",
|
|
"commit": "f87d71d17400e28e8452161ce8d02a1b3d4afff6",
|
|
"run_started_at": "",
|
|
"conclusion": "success",
|
|
"synced_at": "2026-09-21T11:12:14.685946+00:00",
|
|
"backtests": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-09-21T11:12:02.294800+00:00",
|
|
"environment": {
|
|
"os": "Linux",
|
|
"os_release": "6.17.0-1022-azure",
|
|
"arch": "x86_64",
|
|
"cpu": "INTEL(R) XEON(R) PLATINUM 8573C",
|
|
"logical_cores": 4,
|
|
"ram_gb": 16.8,
|
|
"python": "3.12.14",
|
|
"versions": {
|
|
"manifoldbt": "0.26.0",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000545",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/35590549822",
|
|
"commit": "f87d71d17400e28e8452161ce8d02a1b3d4afff6",
|
|
"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": "81a87f47b436bdf3",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 2.037268131971359e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166537,
|
|
"final_equity": 106675.52139716654,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
},
|
|
"raptorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.005053669999995236,
|
|
0.0034152459999887697,
|
|
0.0046252409999993915,
|
|
0.0033474629999972194,
|
|
0.0045618300000001,
|
|
0.003393371000001366,
|
|
0.004620738999989271
|
|
],
|
|
"min_s": 0.0033474629999972194,
|
|
"median_s": 0.0045618300000001,
|
|
"max_s": 0.005053669999995236,
|
|
"iqr_s": 0.0012318699999980254,
|
|
"iqr_over_median": 0.2700385590865943
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.14127721900000267,
|
|
0.15213777399999628,
|
|
0.23422896399999615,
|
|
0.14445026500000324,
|
|
0.14223840399999688,
|
|
0.14596691200000578,
|
|
0.14399481200000253
|
|
],
|
|
"min_s": 0.14127721900000267,
|
|
"median_s": 0.14445026500000324,
|
|
"max_s": 0.23422896399999615,
|
|
"iqr_s": 0.009899369999999408,
|
|
"iqr_over_median": 0.06853133845063687
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.007398292999994283,
|
|
0.006943006000000196,
|
|
0.006283263000000261,
|
|
0.006145250000002989,
|
|
0.006393403999993552,
|
|
0.005974969999996915,
|
|
0.006558111000003919
|
|
],
|
|
"min_s": 0.005974969999996915,
|
|
"median_s": 0.006393403999993552,
|
|
"max_s": 0.007398292999994283,
|
|
"iqr_s": 0.0007977559999972073,
|
|
"iqr_over_median": 0.12477797429945171
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 43.01531191253388,
|
|
"min": 27.955370849330457,
|
|
"max": 50.6414614935799
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.463944618465641,
|
|
"min": 1.358472563916364,
|
|
"max": 2.0329446253719428
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9689445572188252,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 100000,
|
|
"data_digest": "81a87f47b436bdf3",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 2.037268131971359e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 9.824310693574996e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.019159920541154903,
|
|
"sortino": 0.026757853601561177,
|
|
"volatility": 0.006633443246113983
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.0791054091709309,
|
|
"sharpe": 2.0737338994486847,
|
|
"sortino": 3.9123948298471207,
|
|
"volatility": 0.1694710840205982
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.06675521397166537,
|
|
"final_equity": 106675.52139716654,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093167,
|
|
"sharpe": 2.1142426200536355,
|
|
"sortino": 4.0199603401119175,
|
|
"volatility": 0.17060276779841899
|
|
}
|
|
},
|
|
"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": 7.017364781125071e-16,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": 900,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.0791054091709309,
|
|
"sharpe": 2.0737338994486847,
|
|
"sortino": 3.9123948298471207,
|
|
"volatility": 0.1694710840205982
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.0667552139716674,
|
|
"final_equity": 106675.52139716674,
|
|
"round_trips": 450,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.07910540917093084,
|
|
"sharpe": 0.9692748979846553,
|
|
"sortino": 1.3742016523326892,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.003389882999996985,
|
|
0.0034161779999948294,
|
|
0.0033085970000001907,
|
|
0.0032174290000028805,
|
|
0.003303963999996995,
|
|
0.0032776159999912124,
|
|
0.0037912849999912623
|
|
],
|
|
"min_s": 0.0032174290000028805,
|
|
"median_s": 0.0033085970000001907,
|
|
"max_s": 0.0037912849999912623,
|
|
"iqr_s": 0.00013856200000361696,
|
|
"iqr_over_median": 0.04187938271225204
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.6347757380000019,
|
|
0.5315204759999972,
|
|
0.5372511489999994,
|
|
0.639734954000005,
|
|
0.6419390769999893,
|
|
0.6423402650000014,
|
|
0.5459869999999967
|
|
],
|
|
"min_s": 0.5315204759999972,
|
|
"median_s": 0.6347757380000019,
|
|
"max_s": 0.6423402650000014,
|
|
"iqr_s": 0.10468792799998994,
|
|
"iqr_over_median": 0.16492112368666118
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.006537716999986287,
|
|
0.00833732000000964,
|
|
0.006587505000013039,
|
|
0.0062322440000031065,
|
|
0.00631356800001015,
|
|
0.006186408999994342,
|
|
0.00936762999999985
|
|
],
|
|
"min_s": 0.006186408999994342,
|
|
"median_s": 0.006537716999986287,
|
|
"max_s": 0.00936762999999985,
|
|
"iqr_s": 0.002105076000006534,
|
|
"iqr_over_median": 0.3219894651314747
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 187.25594305188895,
|
|
"min": 144.0110674880034,
|
|
"max": 198.83421017198276
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.9370261161932485,
|
|
"min": 1.8874721749011867,
|
|
"max": 2.4708324486345496
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0063378537453895,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 5.529727786779404e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717537874,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.2029425471753732,
|
|
"final_equity": 120294.25471753732,
|
|
"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.20294254717537874,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.2029425471753787,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.03916600099999812,
|
|
0.03727817800000821,
|
|
0.03721995500001185,
|
|
0.0367240939999931,
|
|
0.03569120699999928,
|
|
0.035471043000001146,
|
|
0.035254019999996444
|
|
],
|
|
"min_s": 0.035254019999996444,
|
|
"median_s": 0.0367240939999931,
|
|
"max_s": 0.03916600099999812,
|
|
"iqr_s": 0.0018071350000070652,
|
|
"iqr_over_median": 0.04920842975751572
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
1.6695071369999965,
|
|
1.7540776779999874,
|
|
1.6676097149999975,
|
|
1.6922064460000001,
|
|
1.6738048590000005,
|
|
1.6384705080000117,
|
|
1.8306165669999928
|
|
],
|
|
"min_s": 1.6384705080000117,
|
|
"median_s": 1.6738048590000005,
|
|
"max_s": 1.8306165669999928,
|
|
"iqr_s": 0.08646796299998982,
|
|
"iqr_over_median": 0.05165952442726766
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.06682055900000705,
|
|
0.06879986199999166,
|
|
0.06578834600000505,
|
|
0.06737495400000171,
|
|
0.06797034600000984,
|
|
0.07040923300002078,
|
|
0.06702352700000347
|
|
],
|
|
"min_s": 0.06578834600000505,
|
|
"median_s": 0.06737495400000171,
|
|
"max_s": 0.07040923300002078,
|
|
"iqr_s": 0.0019793029999846112,
|
|
"iqr_over_median": 0.02937743007564148
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 46.19177699398235,
|
|
"min": 42.62643860423935,
|
|
"max": 51.92646305301289
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.8455800602694827,
|
|
"min": 1.7060858217312067,
|
|
"max": 1.9849778028804652
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9986338663553755,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 5.529727786779404e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 2.1971034684631794e-14,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.004351997254356724,
|
|
"sortino": 0.005762567397806017,
|
|
"volatility": 0.0003655041635125007
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717537874,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099877,
|
|
"sharpe": 0.6827964895753905,
|
|
"sortino": 1.3440329806486435,
|
|
"volatility": 0.16117461702331665
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.2029425471753732,
|
|
"final_equity": 120294.25471753732,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099544,
|
|
"sharpe": 0.6857810066333488,
|
|
"sortino": 1.3518229515166593,
|
|
"volatility": 0.16123354855661198
|
|
}
|
|
},
|
|
"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": 3.6618391141052195e-16,
|
|
"ratio_basis": "native"
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.20294254717537874,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": 9069,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099877,
|
|
"sharpe": 0.6827964895753905,
|
|
"sortino": 1.3440329806486435,
|
|
"volatility": 0.16117461702331665
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.2029425471753787,
|
|
"final_equity": 120294.25471753787,
|
|
"round_trips": 4534,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.15159363779099871,
|
|
"sharpe": 0.3005175738027797,
|
|
"sortino": 0.4254354879123199,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.04035824599999671,
|
|
0.040671241000012515,
|
|
0.03804098799999167,
|
|
0.03519652800000017,
|
|
0.03538972299999443,
|
|
0.03855782499999805,
|
|
0.035458591000008255
|
|
],
|
|
"min_s": 0.03519652800000017,
|
|
"median_s": 0.03804098799999167,
|
|
"max_s": 0.040671241000012515,
|
|
"iqr_s": 0.004968523000002278,
|
|
"iqr_over_median": 0.1306097254888166
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
6.531625524000006,
|
|
6.536260677000001,
|
|
6.510747471000002,
|
|
6.516980752000009,
|
|
6.776771816999997,
|
|
6.749556577000021,
|
|
6.6626904329999945
|
|
],
|
|
"min_s": 6.510747471000002,
|
|
"median_s": 6.536260677000001,
|
|
"max_s": 6.776771816999997,
|
|
"iqr_s": 0.23257582500001206,
|
|
"iqr_over_median": 0.03558239741239317
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.07204957300000103,
|
|
0.071924034999995,
|
|
0.07116192200000171,
|
|
0.07234200699998894,
|
|
0.07106445300001951,
|
|
0.07294213399998739,
|
|
0.07305187599999385
|
|
],
|
|
"min_s": 0.07106445300001951,
|
|
"median_s": 0.07204957300000103,
|
|
"max_s": 0.07305187599999385,
|
|
"iqr_s": 0.0017802119999856814,
|
|
"iqr_over_median": 0.024708154758747228
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 175.05024147498887,
|
|
"min": 160.7096443651176,
|
|
"max": 191.48982367002597
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.891759558532959,
|
|
"min": 1.76842489266489,
|
|
"max": 2.060202448539956
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.999683842131347,
|
|
"raptorbt": 1.0306499437106746
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross",
|
|
"title": "SMA 30/150 crossover, long-only, no cost",
|
|
"bars": 10000000,
|
|
"data_digest": "3c0c54badb16a42c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.3096723705530167e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.30013524943746295,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.3001352494374642,
|
|
"final_equity": 130013.52494374642,
|
|
"round_trips": 46127,
|
|
"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.30013524943746295,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.3001352494374629,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross_metrics"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.3418304279999802,
|
|
0.3405220520000398,
|
|
0.3378247190000252,
|
|
0.33817213400004675,
|
|
0.3405687129999251,
|
|
0.345960300999991,
|
|
0.33462523899993357
|
|
],
|
|
"min_s": 0.33462523899993357,
|
|
"median_s": 0.3405220520000398,
|
|
"max_s": 0.345960300999991,
|
|
"iqr_s": 0.004005708999955004,
|
|
"iqr_over_median": 0.01176343492712929
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
22.01912727299998,
|
|
22.18782434299999,
|
|
21.797792611999967,
|
|
22.231184263000046,
|
|
23.011996479000004,
|
|
21.387440805999972,
|
|
21.34418535000009
|
|
],
|
|
"min_s": 21.34418535000009,
|
|
"median_s": 22.01912727299998,
|
|
"max_s": 23.011996479000004,
|
|
"iqr_s": 0.8437434570000732,
|
|
"iqr_over_median": 0.03831866025111167
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.7586552789999814,
|
|
0.7664155139999593,
|
|
0.7577684819999604,
|
|
0.7659840510000322,
|
|
0.7656085360000588,
|
|
0.7486242530000027,
|
|
0.7375657259999571
|
|
],
|
|
"min_s": 0.7375657259999571,
|
|
"median_s": 0.7586552789999814,
|
|
"max_s": 0.7664155139999593,
|
|
"iqr_s": 0.017359798000029514,
|
|
"iqr_over_median": 0.022882326770219362
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 64.5239717108988,
|
|
"min": 61.82050583312601,
|
|
"max": 67.56932037678125
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.2430818095342038,
|
|
"min": 2.1639021900377586,
|
|
"max": 2.2650714650543216
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0842597654316033,
|
|
"vectorbt": 1.0000029151533216,
|
|
"raptorbt": 1.0036558274824032
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_metrics",
|
|
"title": "SMA 30/150 crossover, with a performance summary",
|
|
"bars": 10000000,
|
|
"data_digest": "3c0c54badb16a42c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.3096723705530167e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 0.0,
|
|
"max_drawdown_rel": 3.562524715042434e-15,
|
|
"advisory_ratio_rel": {
|
|
"sharpe": 0.0014181902447094516,
|
|
"sortino": 0.0015630368843309562,
|
|
"volatility": 0.0002712600423099975
|
|
}
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": 0.30013524943746295,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126699,
|
|
"sharpe": 0.16628266067297076,
|
|
"sortino": 0.32363046285415176,
|
|
"volatility": 0.15595531092911702
|
|
},
|
|
"vectorbt": {
|
|
"total_return": 0.3001352494374642,
|
|
"final_equity": 130013.52494374642,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126677,
|
|
"sharpe": 0.16651881603342994,
|
|
"sortino": 0.3241371010987492,
|
|
"volatility": 0.15591301795726925
|
|
}
|
|
},
|
|
"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.30013524943746295,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126699,
|
|
"sharpe": 0.16628266067297076,
|
|
"sortino": 0.32363046285415176,
|
|
"volatility": 0.15595531092911702
|
|
},
|
|
"raptorbt": {
|
|
"total_return": 0.3001352494374629,
|
|
"final_equity": 130013.52494374629,
|
|
"round_trips": 46127,
|
|
"fills": null,
|
|
"total_fees": 0.0,
|
|
"max_drawdown": -0.6232787775126699,
|
|
"sharpe": 0.07064081213792228,
|
|
"sortino": 0.09993197026249025,
|
|
"volatility": null
|
|
}
|
|
},
|
|
"note": ""
|
|
}
|
|
},
|
|
"status": "exact",
|
|
"paired_with": [
|
|
"sma_cross"
|
|
],
|
|
"timings": {
|
|
"manifoldbt": {
|
|
"samples_s": [
|
|
0.3459932530000174,
|
|
0.34749230800002806,
|
|
0.3346646940000255,
|
|
0.33734381500005384,
|
|
0.3367350629999919,
|
|
0.34082302699994216,
|
|
0.33503739799994037
|
|
],
|
|
"min_s": 0.3346646940000255,
|
|
"median_s": 0.33734381500005384,
|
|
"max_s": 0.34749230800002806,
|
|
"iqr_s": 0.010955855000077008,
|
|
"iqr_over_median": 0.03247682190371642
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
86.35103415100002,
|
|
85.853776713,
|
|
86.21596367000006,
|
|
85.33181503399999,
|
|
85.59102564299997,
|
|
83.53801503199998,
|
|
83.17931679600008
|
|
],
|
|
"min_s": 83.17931679600008,
|
|
"median_s": 85.59102564299997,
|
|
"max_s": 86.35103415100002,
|
|
"iqr_s": 2.677948638000089,
|
|
"iqr_over_median": 0.03128772693027197
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.751387096999963,
|
|
0.7457227779999585,
|
|
0.7401548940000566,
|
|
0.7547077950000585,
|
|
0.7407020250000187,
|
|
0.7270717149999655,
|
|
0.7430661529999725
|
|
],
|
|
"min_s": 0.7270717149999655,
|
|
"median_s": 0.7430661529999725,
|
|
"max_s": 0.7547077950000585,
|
|
"iqr_s": 0.011232202999906349,
|
|
"iqr_over_median": 0.01511602022856068
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 249.57432956357587,
|
|
"min": 245.10672229906038,
|
|
"max": 257.6189398395084
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 2.1996581478657498,
|
|
"min": 2.133282253255995,
|
|
"max": 2.2372065573514015
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0849044735597497,
|
|
"vectorbt": 0.9999313039392977,
|
|
"raptorbt": 1.0033035100038517
|
|
}
|
|
},
|
|
{
|
|
"workload": "ema_rsi_fees",
|
|
"title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee",
|
|
"bars": 100000,
|
|
"data_digest": "81a87f47b436bdf3",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 1.4551915228366853e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 5.0022208597511055e-17
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.015701103422790075,
|
|
"final_equity": 98429.889657721,
|
|
"round_trips": 3176,
|
|
"fills": 6352,
|
|
"total_fees": 1542.3890014306103
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.015701103422788482,
|
|
"final_equity": 98429.88965772114,
|
|
"round_trips": 3176,
|
|
"fills": null,
|
|
"total_fees": 1542.3890014306053
|
|
}
|
|
},
|
|
"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.004454968999880293,
|
|
0.004868517999966571,
|
|
0.00482482000006712,
|
|
0.004147710000097504,
|
|
0.004174709999915649,
|
|
0.004094270999985383,
|
|
0.012716224000087095
|
|
],
|
|
"min_s": 0.004094270999985383,
|
|
"median_s": 0.004454968999880293,
|
|
"max_s": 0.012716224000087095,
|
|
"iqr_s": 0.0007208079998690664,
|
|
"iqr_over_median": 0.16179865671084015
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.15273279000007278,
|
|
0.15578906800010373,
|
|
0.1531284389998291,
|
|
0.14517317600007118,
|
|
0.14751188900004308,
|
|
0.1586384629999884,
|
|
0.14923040200005744
|
|
],
|
|
"min_s": 0.14517317600007118,
|
|
"median_s": 0.15273279000007278,
|
|
"max_s": 0.1586384629999884,
|
|
"iqr_s": 0.008277179000060642,
|
|
"iqr_over_median": 0.05419385712823486
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 34.28369310856636,
|
|
"min": 11.735433568882975,
|
|
"max": 38.74644912380122
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0073392411756703
|
|
}
|
|
},
|
|
{
|
|
"workload": "ema_rsi_fees",
|
|
"title": "EMA 12/26 crossover + RSI(14) filter, 5 bps taker fee",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 7.275957614183426e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 2.1100277081131935e-15
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.15327081570417533,
|
|
"final_equity": 84672.91842958247,
|
|
"round_trips": 31389,
|
|
"fills": 62779,
|
|
"total_fees": 15206.83039822937
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.15327081570418272,
|
|
"final_equity": 84672.91842958174,
|
|
"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.05209021599989683,
|
|
0.05043981199992231,
|
|
0.05140486899995267,
|
|
0.05167013499999484,
|
|
0.05250463100014713,
|
|
0.05470712300007108,
|
|
0.05205941899998834
|
|
],
|
|
"min_s": 0.05043981199992231,
|
|
"median_s": 0.05205941899998834,
|
|
"max_s": 0.05470712300007108,
|
|
"iqr_s": 0.0010997620001944597,
|
|
"iqr_over_median": 0.02112513011708229
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
1.6343571110000994,
|
|
1.7306511780000164,
|
|
1.6442000430001826,
|
|
1.7128162379999594,
|
|
1.6197267600000487,
|
|
1.7213706389998151,
|
|
1.61613817500006
|
|
],
|
|
"min_s": 1.61613817500006,
|
|
"median_s": 1.6442000430001826,
|
|
"max_s": 1.7306511780000164,
|
|
"iqr_s": 0.10164387899976646,
|
|
"iqr_over_median": 0.0618196547509488
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 31.465201323008316,
|
|
"min": 30.849217090879275,
|
|
"max": 34.31121388800343
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0009195664680344
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 100000,
|
|
"data_digest": "81a87f47b436bdf3",
|
|
"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.0027450426551607963,
|
|
"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.0038538870001048053,
|
|
0.002967212999919866,
|
|
0.003300678999949014,
|
|
0.002847756999926787,
|
|
0.0029107029999977385,
|
|
0.00519200799999453,
|
|
0.0032092980000015814
|
|
],
|
|
"min_s": 0.002847756999926787,
|
|
"median_s": 0.0032092980000015814,
|
|
"max_s": 0.00519200799999453,
|
|
"iqr_s": 0.0009431840001070668,
|
|
"iqr_over_median": 0.29389106281392446
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.1407949470001313,
|
|
0.1533677570000691,
|
|
0.14177678999999443,
|
|
0.13856001899989678,
|
|
0.14212285300004623,
|
|
0.23733181000011427,
|
|
0.14085252400013815
|
|
],
|
|
"min_s": 0.13856001899989678,
|
|
"median_s": 0.14177678999999443,
|
|
"max_s": 0.23733181000011427,
|
|
"iqr_s": 0.012572809999937817,
|
|
"iqr_over_median": 0.08868031220017261
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 45.71098696311029,
|
|
"min": 36.53323177257206,
|
|
"max": 51.68747811640453
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0230116421461481
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"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.02986364258908382,
|
|
"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.035491746999923635,
|
|
0.03514518399992994,
|
|
0.035449241999913284,
|
|
0.036298627000178385,
|
|
0.03808956800003216,
|
|
0.034850497999968866,
|
|
0.03556225500005894
|
|
],
|
|
"min_s": 0.034850497999968866,
|
|
"median_s": 0.035491746999923635,
|
|
"max_s": 0.03808956800003216,
|
|
"iqr_s": 0.0011534430002484442,
|
|
"iqr_over_median": 0.03249890742912503
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
1.7415105289999246,
|
|
1.5746316749998641,
|
|
1.7517789269998048,
|
|
1.5595826589999433,
|
|
1.7239511660000062,
|
|
1.5735151029998633,
|
|
1.7207330440000987
|
|
],
|
|
"min_s": 1.5595826589999433,
|
|
"median_s": 1.7207330440000987,
|
|
"max_s": 1.7517789269998048,
|
|
"iqr_s": 0.16799542600006134,
|
|
"iqr_over_median": 0.09763015046746072
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 45.26045467353556,
|
|
"min": 42.965334721676356,
|
|
"max": 49.416541177497955
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.0003689684480397
|
|
}
|
|
},
|
|
{
|
|
"workload": "sma_cross_costs",
|
|
"title": "SMA 30/150 with a 5 bps fee and 2 bps of slippage",
|
|
"bars": 10000000,
|
|
"data_digest": "3c0c54badb16a42c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "exact",
|
|
"expected": "exact",
|
|
"publishable": true,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 7.8580342233181e-15,
|
|
"round_trips_delta": 0,
|
|
"total_fees_vs_capital": 3.1650415621697903e-15
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.3024291776850745,
|
|
"final_equity": 69757.08223149255,
|
|
"round_trips": 46127,
|
|
"fills": 92254,
|
|
"total_fees": 21749.94829446186
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.3024291776850666,
|
|
"final_equity": 69757.08223149333,
|
|
"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.33795670700010305,
|
|
0.33499596499996187,
|
|
0.3349249160000909,
|
|
0.33553543100015304,
|
|
0.3376625039998089,
|
|
0.3347863359999792,
|
|
0.3336536799999976
|
|
],
|
|
"min_s": 0.3336536799999976,
|
|
"median_s": 0.33499596499996187,
|
|
"max_s": 0.33795670700010305,
|
|
"iqr_s": 0.002876167999829704,
|
|
"iqr_over_median": 0.008585679531483406
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
21.45598317500003,
|
|
21.3475697209999,
|
|
21.147578244999977,
|
|
21.42789562100006,
|
|
22.22522451099985,
|
|
21.33992838500012,
|
|
21.85998238000002
|
|
],
|
|
"min_s": 21.147578244999977,
|
|
"median_s": 21.42789562100006,
|
|
"max_s": 22.22522451099985,
|
|
"iqr_s": 0.5200539949998984,
|
|
"iqr_over_median": 0.024269951851465427
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 63.74193355669524,
|
|
"min": 63.14125117223061,
|
|
"max": 65.82082478133974
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.098098717447905,
|
|
"vectorbt": 0.9998397787058828
|
|
}
|
|
},
|
|
{
|
|
"workload": "multi_asset",
|
|
"title": "Five assets in one book, SMA 30/150, 5 bps fee",
|
|
"bars": 100000,
|
|
"data_digest": "81a87f47b436bdf3",
|
|
"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.019926506000047084,
|
|
0.013348905999919225,
|
|
0.012219612999842866,
|
|
0.011852975000010701,
|
|
0.012095613999917987,
|
|
0.015470979000156149,
|
|
0.011496840000063457
|
|
],
|
|
"min_s": 0.011496840000063457,
|
|
"median_s": 0.012219612999842866,
|
|
"max_s": 0.019926506000047084,
|
|
"iqr_s": 0.003618004000145447,
|
|
"iqr_over_median": 0.2960817171699277
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.19317844699980924,
|
|
0.1906031119999625,
|
|
0.18934447000015098,
|
|
0.1869183400001475,
|
|
0.18555547899995872,
|
|
0.17903814400006013,
|
|
0.1828590449999865
|
|
],
|
|
"min_s": 0.17903814400006013,
|
|
"median_s": 0.1869183400001475,
|
|
"max_s": 0.19317844699980924,
|
|
"iqr_s": 0.007744066999975985,
|
|
"iqr_over_median": 0.041430214926849195
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 15.340724249402871,
|
|
"min": 9.694546901466458,
|
|
"max": 15.905156982177468
|
|
}
|
|
},
|
|
"noisy": true,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 0.9942661154953363
|
|
}
|
|
},
|
|
{
|
|
"workload": "multi_asset",
|
|
"title": "Five assets in one book, SMA 30/150, 5 bps fee",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"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": 2.7284841053187848e-17
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.044719709844302735,
|
|
"final_equity": 95528.02901556973,
|
|
"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.16110789000003933,
|
|
0.16026609499999722,
|
|
0.16102433200012456,
|
|
0.16354888399996526,
|
|
0.16558453700008613,
|
|
0.16012236899996424,
|
|
0.16664327900002718
|
|
],
|
|
"min_s": 0.16012236899996424,
|
|
"median_s": 0.16110789000003933,
|
|
"max_s": 0.16664327900002718,
|
|
"iqr_s": 0.005318442000088908,
|
|
"iqr_over_median": 0.03301167931680819
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
2.0621487739999793,
|
|
1.9852154149998569,
|
|
2.0548128950001683,
|
|
1.9918203129998346,
|
|
2.0898364929998934,
|
|
1.9884212959998422,
|
|
2.055756618000032
|
|
],
|
|
"min_s": 1.9852154149998569,
|
|
"median_s": 2.0548128950001683,
|
|
"max_s": 2.0898364929998934,
|
|
"iqr_s": 0.07372747800013713,
|
|
"iqr_over_median": 0.03588038510928806
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 12.418135632256892,
|
|
"min": 12.178745976647923,
|
|
"max": 12.799800022205467
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.2386921180185988,
|
|
"vectorbt": 1.0015454159234438
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 100000,
|
|
"data_digest": "81a87f47b436bdf3",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.01145740341531491,
|
|
"round_trips_delta": 94,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.05756525685929326,
|
|
"final_equity": 94243.47431407067,
|
|
"round_trips": 2309,
|
|
"fills": 4618,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.06902266027460821,
|
|
"final_equity": 93097.73397253918,
|
|
"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.009248235144775827,
|
|
"round_trips_delta": 925,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.05756525685929326,
|
|
"final_equity": 94243.47431407067,
|
|
"round_trips": 2309,
|
|
"fills": 4618,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.06681349200406912,
|
|
"final_equity": 93318.65079959309,
|
|
"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.65079959309
|
|
},
|
|
"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.006417026999997688,
|
|
0.005972167999971134,
|
|
0.005751087999897209,
|
|
0.006330633000061425,
|
|
0.008170594999910463,
|
|
0.005749135000087335,
|
|
0.0059520449999581615
|
|
],
|
|
"min_s": 0.005749135000087335,
|
|
"median_s": 0.005972167999971134,
|
|
"max_s": 0.008170594999910463,
|
|
"iqr_s": 0.0006659390001004795,
|
|
"iqr_over_median": 0.1115070775141788
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.14239295900006255,
|
|
0.13622720499984098,
|
|
0.24924728499991033,
|
|
0.1442627479998464,
|
|
0.13544878700008667,
|
|
0.13847168799998144,
|
|
0.14035351799998352
|
|
],
|
|
"min_s": 0.13544878700008667,
|
|
"median_s": 0.14035351799998352,
|
|
"max_s": 0.24924728499991033,
|
|
"iqr_s": 0.008035543000005418,
|
|
"iqr_over_median": 0.05725216663259101
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.005969301000050109,
|
|
0.00591759799999636,
|
|
0.006453772999975627,
|
|
0.005973884000013641,
|
|
0.0059945570001218584,
|
|
0.00601182700006575,
|
|
0.006009480000102485
|
|
],
|
|
"min_s": 0.00591759799999636,
|
|
"median_s": 0.0059945570001218584,
|
|
"max_s": 0.006453772999975627,
|
|
"iqr_s": 4.252600001564133e-05,
|
|
"iqr_over_median": 0.007094102202177217
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 22.81034374794872,
|
|
"min": 16.577591595418813,
|
|
"max": 43.33915339225643
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.9908626147196399,
|
|
"min": 0.7336744753824598,
|
|
"max": 1.1221829678299093
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.012514504385728,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 1000000,
|
|
"data_digest": "3d9cc9bf5d0fca1b",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.010543837599989565,
|
|
"round_trips_delta": 1092,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.4507044147140229,
|
|
"final_equity": 54929.558528597714,
|
|
"round_trips": 23075,
|
|
"fills": 46151,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.46124825231401245,
|
|
"final_equity": 53875.17476859876,
|
|
"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.10072796246195649,
|
|
"round_trips_delta": 9330,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.4507044147140229,
|
|
"final_equity": 54929.558528597714,
|
|
"round_trips": 23075,
|
|
"fills": 46151,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.3499764522520664,
|
|
"final_equity": 65002.35477479336,
|
|
"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.35477479336
|
|
},
|
|
"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.058244031999947765,
|
|
0.07314594900003613,
|
|
0.06829113300000245,
|
|
0.06851590600012969,
|
|
0.06925924999995914,
|
|
0.0695056790000308,
|
|
0.06853234300001532
|
|
],
|
|
"min_s": 0.058244031999947765,
|
|
"median_s": 0.06853234300001532,
|
|
"max_s": 0.07314594900003613,
|
|
"iqr_s": 0.0012145460000283492,
|
|
"iqr_over_median": 0.017722230801711796
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
1.5590526570001657,
|
|
1.7112131520000275,
|
|
1.5607128480000938,
|
|
1.7040713240000969,
|
|
1.6211463699999058,
|
|
1.702051621999999,
|
|
1.631106927000019
|
|
],
|
|
"min_s": 1.5590526570001657,
|
|
"median_s": 1.631106927000019,
|
|
"max_s": 1.7112131520000275,
|
|
"iqr_s": 0.14335847600000307,
|
|
"iqr_over_median": 0.08789029929734422
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.06928740099988318,
|
|
0.06430734000014127,
|
|
0.07068334899986439,
|
|
0.06451603599998634,
|
|
0.06897606400002587,
|
|
0.06430054599991308,
|
|
0.06953625899996041
|
|
],
|
|
"min_s": 0.06430054599991308,
|
|
"median_s": 0.06897606400002587,
|
|
"max_s": 0.07068334899986439,
|
|
"iqr_s": 0.005228918999819143,
|
|
"iqr_over_median": 0.07580773237245288
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 23.800542278259105,
|
|
"min": 22.853813949755935,
|
|
"max": 26.767594952931212
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 0.9959112176361506,
|
|
"min": 0.8791647504649848,
|
|
"max": 1.1896051598890907
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": null,
|
|
"vectorbt": 1.000056147625808,
|
|
"raptorbt": null
|
|
}
|
|
},
|
|
{
|
|
"workload": "bracket_sl_tp",
|
|
"title": "SMA 10/50 entry with a 15 bps stop / 30 bps target bracket",
|
|
"bars": 10000000,
|
|
"data_digest": "3c0c54badb16a42c",
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"parity": {
|
|
"vectorbt": {
|
|
"status": "documented",
|
|
"expected": "documented",
|
|
"publishable": false,
|
|
"diffs": {
|
|
"final_equity_vs_capital": 0.0008838890600599837,
|
|
"round_trips_delta": 10171,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853453,
|
|
"final_equity": 516.5774614654728,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"total_return": -0.9957181144454053,
|
|
"final_equity": 428.1885554594744,
|
|
"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.022352514553554276,
|
|
"round_trips_delta": 93295,
|
|
"total_fees_vs_capital": 0.0
|
|
},
|
|
"metrics": {
|
|
"manifoldbt": {
|
|
"total_return": -0.9948342253853453,
|
|
"final_equity": 516.5774614654728,
|
|
"round_trips": 231082,
|
|
"fills": 462164,
|
|
"total_fees": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"total_return": -0.972481710831791,
|
|
"final_equity": 2751.8289168209003,
|
|
"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.8289168209003
|
|
},
|
|
"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.6494090600001527,
|
|
0.6685640739999599,
|
|
0.6549084020000464,
|
|
0.6582057959999474,
|
|
0.6573895379999612,
|
|
0.6663824019999538,
|
|
0.6642997929998273
|
|
],
|
|
"min_s": 0.6494090600001527,
|
|
"median_s": 0.6582057959999474,
|
|
"max_s": 0.6685640739999599,
|
|
"iqr_s": 0.011473999999907392,
|
|
"iqr_over_median": 0.017432237864870317
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
22.043078896999987,
|
|
20.863654708000013,
|
|
21.86108615299986,
|
|
21.641297046999853,
|
|
21.114935397999943,
|
|
21.750162930999977,
|
|
21.722141698000087
|
|
],
|
|
"min_s": 20.863654708000013,
|
|
"median_s": 21.722141698000087,
|
|
"max_s": 22.043078896999987,
|
|
"iqr_s": 0.7461507549999169,
|
|
"iqr_over_median": 0.03434977845985663
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.7670860390001053,
|
|
0.7602830050000193,
|
|
0.7651048249999803,
|
|
0.755361129999983,
|
|
0.7626263709998966,
|
|
0.7534882909999396,
|
|
0.7559999599998264
|
|
],
|
|
"min_s": 0.7534882909999396,
|
|
"median_s": 0.7602830050000193,
|
|
"max_s": 0.7670860390001053,
|
|
"iqr_s": 0.009743694999997388,
|
|
"iqr_over_median": 0.012815879002842027
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 32.69930523372259,
|
|
"min": 31.20666443109126,
|
|
"max": 33.94328822113261
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.147606317948685,
|
|
"min": 1.130714569800407,
|
|
"max": 1.1812062477230065
|
|
}
|
|
},
|
|
"noisy": false,
|
|
"cpu_over_wall": {
|
|
"manifoldbt": 1.0478097705433227,
|
|
"vectorbt": 1.0000241275225226,
|
|
"raptorbt": 0.9981297527779238
|
|
}
|
|
}
|
|
],
|
|
"cold_start": {
|
|
"workload": "sma_cross",
|
|
"bars": 20000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"samples_s": {
|
|
"manifoldbt": [
|
|
0.38728589800007285,
|
|
0.37386503099992296,
|
|
0.35496781799997734
|
|
],
|
|
"vectorbt": [
|
|
5.947141594000186,
|
|
5.193604303000029,
|
|
5.075157936999858
|
|
],
|
|
"raptorbt": [
|
|
0.3148407329999827,
|
|
0.3105440090000684,
|
|
0.3067471290000867
|
|
],
|
|
"baseline": [
|
|
0.2868975540000065,
|
|
0.2811006079998606,
|
|
0.27476421400001527
|
|
]
|
|
},
|
|
"median_s": {
|
|
"manifoldbt": 0.37386503099992296,
|
|
"vectorbt": 5.193604303000029,
|
|
"raptorbt": 0.3105440090000684,
|
|
"baseline": 0.2811006079998606
|
|
},
|
|
"engine_share_s": {
|
|
"manifoldbt": 0.09276442300006238,
|
|
"vectorbt": 4.912503695000169,
|
|
"raptorbt": 0.029443401000207814
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 13.891655737658704,
|
|
"raptorbt": 0.8306313328355451
|
|
}
|
|
},
|
|
"memory": {
|
|
"workload": "sma_cross",
|
|
"bars": 2000000,
|
|
"engines": [
|
|
"manifoldbt",
|
|
"vectorbt",
|
|
"raptorbt"
|
|
],
|
|
"manifoldbt": {
|
|
"before_mb": 729.182208,
|
|
"peak_mb": 729.198592,
|
|
"added_mb": 0.016384000000016385,
|
|
"added_mb_per_million_bars": 0.008192000000008193,
|
|
"seconds": 0.06254247700007909,
|
|
"mode": "memory",
|
|
"engine": "mbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"vectorbt": {
|
|
"before_mb": 603.410432,
|
|
"peak_mb": 851.111936,
|
|
"added_mb": 247.701504,
|
|
"added_mb_per_million_bars": 123.850752,
|
|
"seconds": 3.542394757000011,
|
|
"mode": "memory",
|
|
"engine": "vbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
},
|
|
"raptorbt": {
|
|
"before_mb": 328.56064,
|
|
"peak_mb": 344.285184,
|
|
"added_mb": 15.724544000000037,
|
|
"added_mb_per_million_bars": 7.862272000000019,
|
|
"seconds": 0.13715001299988216,
|
|
"mode": "memory",
|
|
"engine": "rbt",
|
|
"workload": "sma_cross",
|
|
"bars": 2000000
|
|
}
|
|
},
|
|
"sweeps": null,
|
|
"sweep_reps": null
|
|
},
|
|
"sweeps": {
|
|
"schema_version": 2,
|
|
"generated_at": "2026-09-21T10:58:44.802851+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.26.0",
|
|
"vectorbt": "0.28.4",
|
|
"raptorbt": "0.9.0",
|
|
"numpy": "2.4.3",
|
|
"numba": "0.64.0",
|
|
"pandas": "2.3.3"
|
|
},
|
|
"runner": "GitHub Actions 1000000544",
|
|
"ci": true,
|
|
"run_url": "https://github.com/manifoldbt/manifoldbt/actions/runs/35590549822",
|
|
"commit": "f87d71d17400e28e8452161ce8d02a1b3d4afff6",
|
|
"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.005395553999989033
|
|
],
|
|
"min_s": 0.005395553999989033,
|
|
"median_s": 0.005395553999989033,
|
|
"max_s": 0.005395553999989033,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"vectorbt": {
|
|
"samples_s": [
|
|
0.36175994199999195
|
|
],
|
|
"min_s": 0.36175994199999195,
|
|
"median_s": 0.36175994199999195,
|
|
"max_s": 0.36175994199999195,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
},
|
|
"raptorbt": {
|
|
"samples_s": [
|
|
0.010196589000003087
|
|
],
|
|
"min_s": 0.010196589000003087,
|
|
"median_s": 0.010196589000003087,
|
|
"max_s": 0.010196589000003087,
|
|
"iqr_s": 0.0,
|
|
"iqr_over_median": 0.0
|
|
}
|
|
},
|
|
"speedup": {
|
|
"vectorbt": {
|
|
"median_of_ratios": 67.0477845279145,
|
|
"min": 67.0477845279145,
|
|
"max": 67.0477845279145
|
|
},
|
|
"raptorbt": {
|
|
"median_of_ratios": 1.8898131684019495,
|
|
"min": 1.8898131684019495,
|
|
"max": 1.8898131684019495
|
|
}
|
|
},
|
|
"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.4678222299999959,
|
|
"vectorbt": 5.234257431999993,
|
|
"raptorbt": 6.649972485000006
|
|
},
|
|
"ratio": {
|
|
"vectorbt": 11.188560731712212,
|
|
"raptorbt": 14.214742392639325
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 93.56444599999918
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 23.2,
|
|
"vectorbt": 2529.9,
|
|
"raptorbt": 36.0
|
|
},
|
|
"memory_baseline_mb": 2167.0,
|
|
"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.8425402459999987,
|
|
"raptorbt": 26.766322265000042,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 14.5268589509008
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 92.12701229999993
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 64.7,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 601.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.31180331600001,
|
|
"raptorbt": 146.38983664900002,
|
|
"vectorbt": null
|
|
},
|
|
"ratio": {
|
|
"raptorbt": 15.720890109165603
|
|
},
|
|
"reps": 2,
|
|
"per_combo_us": 931.180331600001
|
|
},
|
|
"memory": {
|
|
"manifoldbt": 103.7,
|
|
"vectorbt": null,
|
|
"raptorbt": null
|
|
},
|
|
"memory_baseline_mb": 1716.7,
|
|
"tier_after": {
|
|
"pro": true,
|
|
"budget_used": 0,
|
|
"budget_limit": 256
|
|
}
|
|
}
|
|
],
|
|
"sweep_reps": 2
|
|
}
|
|
}
|