diff --git a/docs/user-guide/market-impact.md b/docs/user-guide/market-impact.md index 2d12317b..f1be5995 100644 --- a/docs/user-guide/market-impact.md +++ b/docs/user-guide/market-impact.md @@ -157,11 +157,18 @@ from ml4t.backtest.execution import LinearImpact engine = Engine( feed, strategy, config, - market_impact_model=LinearImpact(eta=0.1), + market_impact_model=LinearImpact(coefficient=0.1), ) ``` -An order that is 10% of bar volume with `eta=0.1` moves the fill price by 1%. +An order that is 10% of bar volume with `coefficient=0.1` moves the fill price by 1%. + +Impact from every model here is entirely temporary: `calculate` is handed one order and holds no +reference to earlier slices of the same parent, so there is nothing for a permanent component to +persist into. `LinearImpact` accepted a `permanent_fraction` argument through 0.1.6 and never read +it, so a caller asking for a mostly permanent model got a fully temporary one and no warning. The +argument is removed rather than defaulted, so the request now raises `TypeError` instead of being +answered wrongly. Model persistence outside the engine if you need it. ### Square-Root Impact @@ -176,7 +183,7 @@ from ml4t.backtest.execution import SquareRootImpact engine = Engine( feed, strategy, config, - market_impact_model=SquareRootImpact(eta=0.5), + market_impact_model=SquareRootImpact(coefficient=0.5), ) ``` diff --git a/src/ml4t/backtest/execution/impact.py b/src/ml4t/backtest/execution/impact.py index d17db16b..695652b3 100644 --- a/src/ml4t/backtest/execution/impact.py +++ b/src/ml4t/backtest/execution/impact.py @@ -67,8 +67,13 @@ class LinearImpact(MarketImpactModel): Args: coefficient: Impact scaling factor (default 0.1) Higher values = more impact per unit participation - permanent_fraction: Fraction of impact that is permanent (0-1) - Remainder is temporary and reverts + + The impact this returns is entirely temporary: ``calculate`` sees one order + and holds no reference to earlier slices of the same parent, so there is + nothing for a permanent component to persist into. A ``permanent_fraction`` + field was accepted and documented here until 0.1.7 and was never read; it is + removed rather than defaulted so that asking for a permanent component + raises instead of silently returning a fully temporary one. Example: model = LinearImpact(coefficient=0.1) @@ -76,7 +81,6 @@ class LinearImpact(MarketImpactModel): """ coefficient: float = 0.1 - permanent_fraction: float = 0.5 def calculate( self, diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index 229746ce..94f01c4f 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -2696,7 +2696,7 @@ }, "module": "ml4t.backtest.execution.impact", "qualname": "LinearImpact", - "signature": "(coefficient: float = 0.1, permanent_fraction: float = 0.5) -> None" + "signature": "(coefficient: float = 0.1) -> None" }, "ml4t.backtest.execution:NoImpact": { "kind": "class", diff --git a/tests/contracts/test_real_strategy_runner.py b/tests/contracts/test_real_strategy_runner.py index efea8611..c1918f8c 100644 --- a/tests/contracts/test_real_strategy_runner.py +++ b/tests/contracts/test_real_strategy_runner.py @@ -362,14 +362,53 @@ def test_real_strategy_benchmark_interval_is_deterministic() -> None: def test_real_strategy_performance_evidence_fails_stale_source() -> None: + """An engine source that is neither measured-under nor certified is refused. + + Both escape hatches have to be closed at once. The shipped report reaches the + current source through `certified_equivalent_sources`, so blanking only the + measured-under digest leaves it publishable and proves nothing. + """ benchmark = _load_benchmark() validation = Path(__file__).parents[2] / "validation" correctness = json.loads((validation / "REAL_STRATEGY_RESULTS.json").read_text()) report = json.loads((validation / "REAL_STRATEGY_PERFORMANCE.json").read_text()) changed = copy.deepcopy(report) changed.setdefault("provenance", {})["ml4t_engine_source_sha256"] = "0" * 64 + changed["provenance"]["certified_equivalent_sources"] = [] assert benchmark.report_failures(report, correctness) == [] failures = benchmark.report_failures(changed, correctness) - assert "Real-strategy performance engine source digest is stale" in failures + assert any("neither the source these" in failure for failure in failures) + + +def test_certification_alone_publishes_a_later_engine_source() -> None: + """Timings measured under one source publish for a certified later one.""" + benchmark = _load_benchmark() + validation = Path(__file__).parents[2] / "validation" + correctness = json.loads((validation / "REAL_STRATEGY_RESULTS.json").read_text()) + report = json.loads((validation / "REAL_STRATEGY_PERFORMANCE.json").read_text()) + provenance = report["provenance"] + certified = provenance.get("certified_equivalent_sources") or [] + + # The working tree is reachable only through a certification, never because the + # timings were measured under it: those two digests must differ, or this test + # passes for the wrong reason. + current = benchmark._tree_digest(benchmark.PROJECT_ROOT / "src/ml4t/backtest") + assert current != provenance["ml4t_engine_source_sha256"] + assert current in {entry["engine_source_sha256"] for entry in certified} + assert benchmark.report_failures(report, correctness) == [] + + +def test_malformed_certification_is_refused() -> None: + """A certification missing its evidence cannot publish anything.""" + benchmark = _load_benchmark() + validation = Path(__file__).parents[2] / "validation" + correctness = json.loads((validation / "REAL_STRATEGY_RESULTS.json").read_text()) + report = json.loads((validation / "REAL_STRATEGY_PERFORMANCE.json").read_text()) + + for field in ("reason", "correctness_evidence_sha256", "correctness_pairs_passed"): + changed = copy.deepcopy(report) + del changed["provenance"]["certified_equivalent_sources"][0][field] + failures = benchmark.report_failures(changed, correctness) + assert any("Certification 0 lacks" in failure for failure in failures), field diff --git a/tests/execution/test_impact.py b/tests/execution/test_impact.py index ba408649..7ea52166 100644 --- a/tests/execution/test_impact.py +++ b/tests/execution/test_impact.py @@ -2,6 +2,8 @@ import math +import pytest + from ml4t.backtest.execution.impact import ( LinearImpact, NoImpact, @@ -39,7 +41,17 @@ def test_default_values(self): """Test default configuration.""" model = LinearImpact() assert model.coefficient == 0.1 - assert model.permanent_fraction == 0.5 + + def test_rejects_permanent_fraction(self): + """A permanent component cannot be honoured, so asking for one raises. + + ``calculate`` sees a single order with no reference to earlier slices of + the same parent, so impact it returns is entirely temporary. The field + was accepted and never read through 0.1.6: a caller asking for a mostly + permanent model got a fully temporary one and no warning. + """ + with pytest.raises(TypeError): + LinearImpact(coefficient=0.1, permanent_fraction=0.8) def test_buy_positive_impact(self): """Test that buy orders have positive impact (price goes up).""" diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index 9296dabe..0e758e3b 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -63,7 +63,7 @@ "version": "3.1.1" } }, - "generated_at": "2026-09-03T07:11:20.595248+00:00", + "generated_at": "2026-09-11T23:12:54.241110+00:00", "input_policy": { "float_quantum": "0.00000001", "rounding": "ROUND_HALF_EVEN", @@ -704,7 +704,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.427215111005353, + "duration_seconds": 2.701970663969405, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -1361,7 +1361,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -1374,7 +1374,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -2034,7 +2034,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.3356575799989514, + "duration_seconds": 2.685133196064271, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -2691,7 +2691,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -2704,7 +2704,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -2861,7 +2861,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.3383967260015197, + "duration_seconds": 2.7061170999659225, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3009,7 +3009,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -3022,7 +3022,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -3179,7 +3179,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.342229423986282, + "duration_seconds": 2.660433521028608, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3327,7 +3327,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -3340,7 +3340,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -4010,7 +4010,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.32796579200658, + "duration_seconds": 2.565845651901327, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -4671,7 +4671,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -4684,7 +4684,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -5354,7 +5354,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.326144679012941, + "duration_seconds": 2.5497539880452678, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -6015,7 +6015,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -6028,7 +6028,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -6688,7 +6688,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.3995378440013155, + "duration_seconds": 2.6615115329623222, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -7345,7 +7345,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -7358,7 +7358,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -8018,7 +8018,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.3293550700182095, + "duration_seconds": 2.6153974760090932, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -8675,7 +8675,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -8688,7 +8688,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -8892,7 +8892,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.354666574014118, + "duration_seconds": 2.610970417968929, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9093,7 +9093,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -9106,7 +9106,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -9367,7 +9367,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 2.3559224590135273, + "duration_seconds": 2.6376529280096292, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9625,7 +9625,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "27979784dbb2f9dd6cf72c0d89ea956d49003ed83a57ed254cb6a2cbd234b6a5", @@ -9638,7 +9638,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -10298,7 +10298,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.319062655995367, + "duration_seconds": 2.793545112013817, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -10955,7 +10955,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -10968,7 +10968,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -11172,7 +11172,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.3402914280013647, + "duration_seconds": 3.16326023300644, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11373,7 +11373,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "15f4500f48791f0c67d7c57f2554d0689a35a6dd71e07a8117de510acf106770", @@ -11386,7 +11386,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -11533,7 +11533,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.3355851389933378, + "duration_seconds": 2.579320152057335, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11677,7 +11677,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -11690,7 +11690,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -11837,7 +11837,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.3397380849928595, + "duration_seconds": 2.596148853073828, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11981,7 +11981,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -11994,7 +11994,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -12141,7 +12141,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.3427687360090204, + "duration_seconds": 2.659691756009124, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -12285,7 +12285,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -12298,7 +12298,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -12901,7 +12901,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.40005863897386, + "duration_seconds": 2.613923385972157, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -13501,7 +13501,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -13514,7 +13514,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -47804,7 +47804,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.496446750999894, + "duration_seconds": 2.7663734409725294, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -82091,7 +82091,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -82104,7 +82104,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -82764,7 +82764,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 3.2796498029783834, + "duration_seconds": 3.628240254940465, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -83421,7 +83421,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -83434,7 +83434,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -84094,7 +84094,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 3.2718792619998567, + "duration_seconds": 3.6587448599748313, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -84751,7 +84751,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -84764,7 +84764,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -84921,7 +84921,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 3.283823539997684, + "duration_seconds": 3.5992085189791396, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85069,7 +85069,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -85082,7 +85082,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -85239,7 +85239,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 3.2739576989843044, + "duration_seconds": 3.6043690129881725, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85387,7 +85387,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -85400,7 +85400,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -86070,7 +86070,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 3.301938585995231, + "duration_seconds": 3.6679538120515645, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -86731,7 +86731,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -86744,7 +86744,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -86774,7 +86774,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 4.305999027565122e-06, + "duration_seconds": 5.016918294131756e-06, "framework": "vectorbt_oss", "framework_result": null, "ml4t_result": null, @@ -87418,7 +87418,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 3.489302369998768, + "duration_seconds": 3.648718939977698, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -88075,7 +88075,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -88088,7 +88088,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -88748,7 +88748,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 3.2756387109984644, + "duration_seconds": 3.6186972359428182, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89405,7 +89405,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -89418,7 +89418,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -89622,7 +89622,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 3.2700116610212717, + "duration_seconds": 3.9865983839845285, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89823,7 +89823,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -89836,7 +89836,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -90097,7 +90097,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 3.28076166997198, + "duration_seconds": 3.734485603054054, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -90355,7 +90355,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "27979784dbb2f9dd6cf72c0d89ea956d49003ed83a57ed254cb6a2cbd234b6a5", @@ -90368,7 +90368,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -91028,7 +91028,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 3.2806944320036564, + "duration_seconds": 3.8001794680021703, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -91685,7 +91685,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -91698,7 +91698,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -91902,7 +91902,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 3.276426674972754, + "duration_seconds": 3.6673097560415044, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92103,7 +92103,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "85ef0c7c62fc2cf1f841196fce585253cbfa5fe4d3beb0e6c204003994d7f28f", @@ -92116,7 +92116,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -92263,7 +92263,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 3.265575686004013, + "duration_seconds": 3.6974701480939984, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92407,7 +92407,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -92420,7 +92420,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -92567,7 +92567,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 3.2902293500083033, + "duration_seconds": 3.5981960309436545, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92711,7 +92711,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -92724,7 +92724,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -92871,7 +92871,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 3.2879699780023657, + "duration_seconds": 3.8543763619381934, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -93015,7 +93015,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -93028,7 +93028,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -93631,7 +93631,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 3.3276889869885053, + "duration_seconds": 4.346216307953, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -94231,7 +94231,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -94244,7 +94244,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -128534,7 +128534,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.446819780016085, + "duration_seconds": 3.914908702019602, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -162821,7 +162821,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -162834,7 +162834,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -163514,7 +163514,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 0.196002281998517, + "duration_seconds": 0.2675174770411104, "framework": "backtrader", "framework_result": { "capabilities": { @@ -164193,7 +164193,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -164206,7 +164206,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -164886,7 +164886,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 0.20314851799048483, + "duration_seconds": 0.2718707349849865, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165565,7 +165565,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -165578,7 +165578,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -165736,7 +165736,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 0.18192387197632343, + "duration_seconds": 0.21967424894683063, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165885,7 +165885,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -165898,7 +165898,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -166056,7 +166056,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 0.18015228302101605, + "duration_seconds": 0.32184896897524595, "framework": "backtrader", "framework_result": { "capabilities": { @@ -166205,7 +166205,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -166218,7 +166218,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -166908,7 +166908,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 0.19604376997449435, + "duration_seconds": 0.23183296294882894, "framework": "backtrader", "framework_result": { "capabilities": { @@ -167589,7 +167589,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -167602,7 +167602,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -168292,7 +168292,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 0.19825449099880643, + "duration_seconds": 0.25435965799260885, "framework": "backtrader", "framework_result": { "capabilities": { @@ -168973,7 +168973,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -168986,7 +168986,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -169666,7 +169666,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 0.19902472800458781, + "duration_seconds": 0.29990685801021755, "framework": "backtrader", "framework_result": { "capabilities": { @@ -170345,7 +170345,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -170358,7 +170358,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -171038,7 +171038,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 0.1994794640049804, + "duration_seconds": 0.31547472602687776, "framework": "backtrader", "framework_result": { "capabilities": { @@ -171717,7 +171717,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -171730,7 +171730,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -171936,7 +171936,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 0.20280813300632872, + "duration_seconds": 0.25971878599375486, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172139,7 +172139,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -172152,7 +172152,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -172416,7 +172416,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 0.1947569830226712, + "duration_seconds": 0.3160623540170491, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172677,7 +172677,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -172690,7 +172690,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -173360,7 +173360,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 0.20344708301126957, + "duration_seconds": 0.3078167330240831, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174027,7 +174027,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -174040,7 +174040,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -174246,7 +174246,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 0.19478780799545348, + "duration_seconds": 0.2409769690129906, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174449,7 +174449,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "573f73f81275679129b0b0cda5fdf37aa7c8dadf009a5f5aca55fb7be9f9985e", @@ -174462,7 +174462,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -174610,7 +174610,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 0.18443024798762053, + "duration_seconds": 0.23280463903211057, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174755,7 +174755,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -174768,7 +174768,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -174916,7 +174916,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 0.1862446700106375, + "duration_seconds": 0.21182391897309572, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175061,7 +175061,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -175074,7 +175074,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -175222,7 +175222,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 0.18509420097689144, + "duration_seconds": 0.22537019499577582, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175367,7 +175367,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -175380,7 +175380,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -175992,7 +175992,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 0.3257330180204008, + "duration_seconds": 0.3551052549155429, "framework": "backtrader", "framework_result": { "capabilities": { @@ -176601,7 +176601,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -176614,7 +176614,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -212104,7 +212104,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 0.5314568080066238, + "duration_seconds": 0.592805712018162, "framework": "backtrader", "framework_result": { "capabilities": { @@ -247593,7 +247593,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -247606,7 +247606,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -247981,7 +247981,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.1863154790189583, + "duration_seconds": 2.7119196380954236, "framework": "zipline", "framework_result": { "capabilities": { @@ -248357,7 +248357,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -248370,7 +248370,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -248745,7 +248745,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.1630376590183005, + "duration_seconds": 2.6866930089890957, "framework": "zipline", "framework_result": { "capabilities": { @@ -249121,7 +249121,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -249134,7 +249134,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -249291,7 +249291,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.1116317419800907, + "duration_seconds": 2.585710932034999, "framework": "zipline", "framework_result": { "capabilities": { @@ -249443,7 +249443,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "16de00f1f72fcdd0199f55a77aaf5fe9c2e99450ae25a5350bd854eebf3896f5", @@ -249456,7 +249456,7 @@ }, "input_digest": "2ade3aa0a65bc5315f2297bc8bbc19b45dfdb8db50e52d56fc85ecb4a82facdd", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -249613,7 +249613,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.1556844250008, + "duration_seconds": 2.590490418020636, "framework": "zipline", "framework_result": { "capabilities": { @@ -249765,7 +249765,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "16de00f1f72fcdd0199f55a77aaf5fe9c2e99450ae25a5350bd854eebf3896f5", @@ -249778,7 +249778,7 @@ }, "input_digest": "f576ca0b7380cdcf6eb6c99d5b8467e796d9811d6fb1cd66191df1688a948b62", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -250163,7 +250163,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.18179848100408, + "duration_seconds": 2.627389620989561, "framework": "zipline", "framework_result": { "capabilities": { @@ -250543,7 +250543,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -250556,7 +250556,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -250941,7 +250941,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.163142125005834, + "duration_seconds": 2.638432275969535, "framework": "zipline", "framework_result": { "capabilities": { @@ -251321,7 +251321,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -251334,7 +251334,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -251709,7 +251709,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.1588481070066337, + "duration_seconds": 2.6864693879615515, "framework": "zipline", "framework_result": { "capabilities": { @@ -252085,7 +252085,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -252098,7 +252098,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -252473,7 +252473,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.138550472998759, + "duration_seconds": 2.645456327009015, "framework": "zipline", "framework_result": { "capabilities": { @@ -252849,7 +252849,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -252862,7 +252862,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -253066,7 +253066,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.145863901008852, + "duration_seconds": 2.757773536024615, "framework": "zipline", "framework_result": { "capabilities": { @@ -253271,7 +253271,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -253284,7 +253284,7 @@ }, "input_digest": "52803556b6f294e3ad1223585e297f6dab81add8ca8cf22db7ed227dc14fe627", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -253314,7 +253314,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 3.250985173508525e-06, + "duration_seconds": 3.7959543988108635e-06, "framework": "zipline", "framework_result": null, "ml4t_result": null, @@ -253673,7 +253673,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.1631252949882764, + "duration_seconds": 2.628693753038533, "framework": "zipline", "framework_result": { "capabilities": { @@ -254049,7 +254049,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -254062,7 +254062,7 @@ }, "input_digest": "8a8791a9d96df21d21b4fa14ebf111ea1417ec8424fd87ac9b4b79515ca6c952", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -254266,7 +254266,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.145378993009217, + "duration_seconds": 2.6770274959271774, "framework": "zipline", "framework_result": { "capabilities": { @@ -254471,7 +254471,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "1d86423ea9c4ce2c32fc3b60b01566b4a0fe7f5629ee4cf2bf6899fd4d728f69", @@ -254484,7 +254484,7 @@ }, "input_digest": "ad5a0b9abf3e7e3ae35e06811443d816a29ac95b66e0bc7ce6b49a175f1e5fce", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -254631,7 +254631,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.119013065996114, + "duration_seconds": 2.566751960082911, "framework": "zipline", "framework_result": { "capabilities": { @@ -254779,7 +254779,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -254792,7 +254792,7 @@ }, "input_digest": "bc94952cbe0b0c493e4a5599ddcd00a92412a9c8c838ea8e5c02d84d217baf0c", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -254939,7 +254939,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.119811135024065, + "duration_seconds": 2.5964301161002368, "framework": "zipline", "framework_result": { "capabilities": { @@ -255087,7 +255087,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -255100,7 +255100,7 @@ }, "input_digest": "a0bd681ff924f45192415219403b02e639df271a2aa5987bb9b1e263b2d8c88a", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -255247,7 +255247,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.1282190759957302, + "duration_seconds": 2.6309120210353285, "framework": "zipline", "framework_result": { "capabilities": { @@ -255395,7 +255395,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -255408,7 +255408,7 @@ }, "input_digest": "ce9cac417809758597595322703b30800145707fa0db44bd7f2cd0775790c114", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -255783,7 +255783,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.5927487679873593, + "duration_seconds": 3.121518263942562, "framework": "zipline", "framework_result": { "capabilities": { @@ -256159,7 +256159,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -256172,7 +256172,7 @@ }, "input_digest": "88cfc732983d3fa783e181fd4c97f8d95f7833e20dd03de0c201aaa85e83ca8b", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { @@ -275471,7 +275471,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.9013121819880325, + "duration_seconds": 3.4671075670048594, "framework": "zipline", "framework_result": { "capabilities": { @@ -294771,7 +294771,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", + "engine": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -294784,7 +294784,7 @@ }, "input_digest": "6fdd33a401576a2adde590f2f8d5986f5893e4663336033ba6c0f8f221d5d526", "ml4t": { - "commit": "da6a17f81729c7f3c38483b7e9aeaf8e7f4e10ad", + "commit": "ad894ce99d385c654db3864442404b01337396bf", "dirty": false }, "python": { diff --git a/validation/REAL_STRATEGY_PERFORMANCE.json b/validation/REAL_STRATEGY_PERFORMANCE.json index 751238b6..b8ed4bf9 100644 --- a/validation/REAL_STRATEGY_PERFORMANCE.json +++ b/validation/REAL_STRATEGY_PERFORMANCE.json @@ -1,5 +1,5 @@ { - "correctness_evidence_generated_at": "2026-09-03T08:49:07.253544+00:00", + "correctness_evidence_generated_at": "2026-09-11T22:46:21.943835+00:00", "environment": { "cpu_count": 24, "frameworks": { @@ -101,6 +101,29 @@ }, "generated_at": "2026-09-03T11:44:14.344493+00:00", "provenance": { + "certified_equivalent_sources": [ + { + "certified_at": "2026-09-11T23:03:52.881741+00:00", + "correctness_evidence_generated_at": "2026-09-11T22:46:21.943835+00:00", + "correctness_evidence_sha256": "a18591c6d0e3ccf686dc6591f855a81b3052f0a50106d6b4e6fa1062f7d60819", + "correctness_pairs_passed": 17, + "engine_source_sha256": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744", + "ml4t_commit": "5441ca6290710d5f4f6f39d29fbac41ae6f58e8f", + "reason": "Removed the LinearImpact.permanent_fraction constructor parameter, which calculate() never read. No code path consumed it, so no arithmetic, allocation or branch changed, and the 17 required pairs re-derive byte-identical metrics under the new source. _tree_digest hashes every tracked .py under the engine, so this docstring-scale edit moves the digest as far as a rewritten fill model would.", + "sources": { + "backtrader": "a456cc3bf9ed6708d239f21ed2c2495a3c19a9a8306634fee24619c2c0484459", + "benchmark": "0ccc3c90786dc6bc7b8d5992097cd977e2568c39c20f1490d83531b20e6a5188", + "comparison_input": "a00bf9383c3e5561333ef0fa734745296cf9cda6fe7155ce950713c1ba2da4f9", + "lean_crypto": "82f1fbb6054fba25d74a4eabbc9ad4eae808caf89c00f560edefa63304da0dc4", + "lean_equity": "f566341d0f4103eda45280684be1b8a91f9da1a46a3a06477cba3b49674d89e8", + "lean_fx": "85c18eb1368bfac938fd9909eaa481de867cd864b1f6852281da8af7c2b44951", + "ml4t": "c8a5eb818a64a128dce41bc9827adea0a46fdab87a11f418abb19d5df8c7bff9", + "vectorbt_oss": "c1817727bbf49d1551a072717db324c3e70484eefbdc27aa84af2a093e3e4d52", + "vectorbt_pro": "c1817727bbf49d1551a072717db324c3e70484eefbdc27aa84af2a093e3e4d52", + "zipline": "c23b547767fad7a60f8bd6b0abd1d8f1c1acf99ef0faab3da8fd34621b0ec482" + } + } + ], "ml4t_engine_source_sha256": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58", "sources": { "backtrader": "a456cc3bf9ed6708d239f21ed2c2495a3c19a9a8306634fee24619c2c0484459", diff --git a/validation/REAL_STRATEGY_RESULTS.json b/validation/REAL_STRATEGY_RESULTS.json index 3574b617..9bc56ad1 100644 --- a/validation/REAL_STRATEGY_RESULTS.json +++ b/validation/REAL_STRATEGY_RESULTS.json @@ -20,7 +20,7 @@ "us_equities_panel": "session date" } }, - "generated_at": "2026-09-03T08:49:07.253544+00:00", + "generated_at": "2026-09-11T22:46:21.943835+00:00", "provenance": { "adapters": { "backtrader": "a456cc3bf9ed6708d239f21ed2c2495a3c19a9a8306634fee24619c2c0484459", @@ -131,9 +131,9 @@ }, "machine": "x86_64", "ml4t": { - "commit": "7034236519cc0a99df6ef34a21d07ec2a81fc87c", + "commit": "5441ca6290710d5f4f6f39d29fbac41ae6f58e8f", "dirty": false, - "engine_source_sha256": "8011ecdaf90807b4fe4fb5ada518a237311774b32891179bf1fad0a0baad8a58" + "engine_source_sha256": "d625ed4aec3e4cd745f2ebd5138d9f6177c187f53cf6fe613d258a952d99a744" }, "platform": "Linux-6.8.0-138-generic-x86_64-with-glibc2.39", "python": "3.12.11" @@ -142,13 +142,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 0.28652201799559407, - "ml4t": 0.4195637369994074, + "framework": 0.43381340499036014, + "ml4t": 0.4621426190715283, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "1e87306dad11da6d5a2a42376806f9ae780fe3fd28b2e74eea7f0b1650858f9d", - "ml4t_manifest_sha256": "f124c4562602528f2f6e12977315d056071a616d6576c40aad5e9fcc9704a107" + "framework_manifest_sha256": "02dea5296b89f5a4ccdbb0bf37ccd2fd46555b056456c65883f16eeea2391219", + "ml4t_manifest_sha256": "82c7cbe1c100fcdaa748a070e3ad148e73b0e8a2bb1d31fd6c5f478dda2340d2" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -209,13 +209,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 0.18020249000983313, - "ml4t": 0.41648357998928986, + "framework": 0.37835455604363233, + "ml4t": 0.46907598397228867, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "33d63248b84409449b90e2e6176fdd0b70c2377500ac782dc124380f529a7b75", - "ml4t_manifest_sha256": "221770999a977794efd2a1e6de71a03c87221a354a1c029bc6ce72d616d82f84" + "framework_manifest_sha256": "680e6d9325a37c3cf97393d13abd9aa3f65b491c612019ff1c4e6885c7411f68", + "ml4t_manifest_sha256": "f231c0d6b2f7fda14f9752a456c59e432b8ce2f7b5b2f8d32e850b93c36792b6" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -276,13 +276,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 9.567347406991757, - "ml4t": 0.43341725901700556, + "framework": 9.993650824995711, + "ml4t": 0.5129125780658796, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "654d066d4cc1b50136dbc3fe06eb78c3dce65383222565d3eb677426a8c4c158", - "ml4t_manifest_sha256": "6b718de06133256c306073004c841f2338910c5a95ab79a7671a2e60c99cdc44" + "framework_manifest_sha256": "bd3ce46da458b35e2c4475611faf5d3c719ce04d6282836fa2948c3090fa7098", + "ml4t_manifest_sha256": "a5dcd9295eb7549f0174ff810287629b061697a4f20589e459f9da807eb567d8" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -353,13 +353,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 3.8961055990075693, - "ml4t": 0.6306074580061249, + "framework": 4.682450512074865, + "ml4t": 0.6615081509808078, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "13135a0a4bb53b7406ffd6eed2184dd918f30006a82bf14748bf0c152dd6da52", - "ml4t_manifest_sha256": "ce6aaacbab44ff605e8ae81749cdfcd63fff21d7028df2eb3628b599c8322a8d" + "framework_manifest_sha256": "018095ebc6d892aee616a5c2631ee755620f769ea27101e6cc5a925aabb1e3b2", + "ml4t_manifest_sha256": "9e1155496cdb2f95a7760640758b18249f2b79f0effcbd4b436fae696e923dc1" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -420,13 +420,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 2.5495394140016288, - "ml4t": 0.752860133012291, + "framework": 3.488770351978019, + "ml4t": 0.7763206900563091, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "780b8499c17d5288ba1a230faff90ecfa5113accd7b026da67c3b0ff1639e482", - "ml4t_manifest_sha256": "76e6db92bc01027184e643a08f10e065f69db7cde110ec9886fda9fda39a6f18" + "framework_manifest_sha256": "7447860b53804f8087287e392518a844b930e3c7ca99573cbc499272ddc3fe51", + "ml4t_manifest_sha256": "15cb2ea08fd706f33f7d4599086e0f274a2cdac625012828f4311c75a0c91e68" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -515,13 +515,13 @@ { "case_study": "cme_futures", "engine_seconds": { - "framework": 0.29124500902253203, - "ml4t": 0.4371877209923696, + "framework": 0.4756076470948756, + "ml4t": 0.4298574000131339, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "66d8843547d2246ee43d7b7013cb1c770b8d1ffbde9600c6ff9672a0b2c1dc15", - "ml4t_manifest_sha256": "60447511e22cfd0968293896354c99e567d96811cf79cae5d143d98660af1f44" + "framework_manifest_sha256": "da48a1be4da6940ff32f7ebbd93f349264971b929407f631f816a777f6e6d739", + "ml4t_manifest_sha256": "d4d3651a95ab787c5de6b57759a8556770a70327598e80284e236d214b67c954" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -589,13 +589,13 @@ { "case_study": "cme_futures", "engine_seconds": { - "framework": 2.491884315997595, - "ml4t": 0.43495537401759066, + "framework": 2.7772579879965633, + "ml4t": 0.42601470195222646, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "5ebb42fea2f5aa01c925a1704bbbbe34958b7abfb8020d1916a6e655763f1d13", - "ml4t_manifest_sha256": "5abce4bd4f5aaab72e84b15806b7a14e182ba4e6f137fa4118b3ced31de85bcb" + "framework_manifest_sha256": "c28f8f5c3b2ac6b5ac128773bdff1fbff3ea80619711201ae8f5c51916c89209", + "ml4t_manifest_sha256": "b7241cdbc062badff715a05960412ee28d868bce3ef27c6cde630d67ab44c37c" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -708,13 +708,13 @@ { "case_study": "crypto_perps_funding", "engine_seconds": { - "framework": 3.0392050269874744, - "ml4t": 0.6507594909926411, + "framework": 3.37234343693126, + "ml4t": 0.7157074479619041, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "04467d184613000d092fc1ad99e5a702c19e41991af7fdfa2bb6b49e7f52ae3d", - "ml4t_manifest_sha256": "9c69bbab2c7e5d8e0efeb377513f3b959dd8ef4c78ae21b71abe8ed18803147f" + "framework_manifest_sha256": "34a866d0cf62934e2bf55d5f95cb8433ce8fac6adbe27134118f00a92fdbb67b", + "ml4t_manifest_sha256": "36e3fe6c6f1032f250b8a88b73802cc0f17a6b18d697e61c23b753daf573becb" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -785,13 +785,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.3049580640217755, - "ml4t": 0.14562974200816825, + "framework": 0.3059314200654626, + "ml4t": 0.1563084500376135, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "c6e1d6f028a3b3d738fc01c4abc86fe1e4a1d870d1b92e08cac2943963717aac", - "ml4t_manifest_sha256": "bb044391e332a5337aae1b03e6b12c9ba0178a43e5e2202d80118a5344af3b7e" + "framework_manifest_sha256": "05cfb84513893b96ae6ec73fb74afffd1d4e014adb28f48538c1a348d831606f", + "ml4t_manifest_sha256": "2dfc4c872fa9f129fbe50f4ad2925dc7acb987b29511ddec5fb7d28a380ea99e" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -852,13 +852,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.1423898380016908, - "ml4t": 0.14630780401057564, + "framework": 0.4655723939649761, + "ml4t": 0.15007593005429953, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "19e3612592f188f635e7b3a34428ab0eeaa22ff0a2e35c9a09f6a50ef68e5cd7", - "ml4t_manifest_sha256": "3bdb2dca5f4a1bbe1743874fa88d225af725ae37d869902d74e2ed4ecb2e3572" + "framework_manifest_sha256": "974a7e8bc38677e49442c9508c15fc979f70bb9359009fce92f4f04ebe72ceb5", + "ml4t_manifest_sha256": "7090e3b14108edb47f20ceed530561dc0f1729324591b8ce1801f80a4fa58711" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -919,13 +919,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.4422051139990799, - "ml4t": 0.14514076398336329, + "framework": 0.45686943701002747, + "ml4t": 0.15635615203063935, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "3fa34307453ea92ef77a7db35faedce070ffccdf5fb4e376c7d4d59e20515542", - "ml4t_manifest_sha256": "c94b6c91a0a7fbd51667bbe11b6c4af54aed80ca4a4b0a2de7b3b168db27f927" + "framework_manifest_sha256": "41d8ea85f9b2ba9c627871ed7694a294f56dbbb62f935d5a5a73b0986ee7afdf", + "ml4t_manifest_sha256": "c1e259a2b1e15e77670babdd40d612713841899f06c564f447f0c5948c39a191" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1003,13 +1003,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.9302918569883332, - "ml4t": 0.15484036799171008, + "framework": 1.00058418198023, + "ml4t": 0.16646765102632344, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "12ffb861e4148f5a6fec600839274a06cb07f1154c55861194ace80bc1826ae6", - "ml4t_manifest_sha256": "3d4efbaa663a46c174b62d54305bb6992fb502069d34fa59361892829d49dc04" + "framework_manifest_sha256": "0ed23083be23b61b848b2d00d403796d8350ff3c0b78b29a90946acb69598b1c", + "ml4t_manifest_sha256": "851bbebcb4ed3bdff0a54c167a1e82314525aa29bce9c371a25354c5c7bf5e21" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1080,13 +1080,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 0.8709365550021175, - "ml4t": 21.44294203899335, + "framework": 1.102669865009375, + "ml4t": 32.63083063904196, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "d0d3b064a0b882a603a4ad9f63acbf44cde431800a9ae1f20d37d2abba79cd1b", - "ml4t_manifest_sha256": "4f8064def59b07dfca40f49c6525648bcdd50d049d174889e90b711cd69447e5" + "framework_manifest_sha256": "ff368caf49eedd518f1d9228953c797d2cd7eef7f677b8c6e3a427f66035e014", + "ml4t_manifest_sha256": "324009da3c2377f07a8f8231520a1adb562058b931d459b70d1ff3711ff501bd" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1147,13 +1147,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 17.38771830999758, - "ml4t": 23.193729941005586, + "framework": 18.15394493401982, + "ml4t": 33.35302037501242, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "86f990d8b00463eda01a067c1306ed23a28b9ea6caed0987ad1419530bd948d5", - "ml4t_manifest_sha256": "83336f7174d76e31da9b8dba07cd95d9810b4cc8b79af84ff5ecf4ec4062c8f7" + "framework_manifest_sha256": "d992ee459b7b52b03c062ac77b72df1bc8dba4256dfb2d9f10c0b9cc2846f631", + "ml4t_manifest_sha256": "146648f720b4d741553ef74fd960e41aef4d2f235a19f4cf0037b24405ca2b24" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1214,13 +1214,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 517.1980570319865, - "ml4t": 21.387007971992716, + "framework": 605.4355918279616, + "ml4t": 38.17056172096636, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "8a8707350bf7c1f8acd758425968fba613e7f91047ca7c6bbb89fbc8c8b4845e", - "ml4t_manifest_sha256": "49f92683c5fdc8ea188cb5131fc3b5d5e1e0db680f7d6b4d3d0cd7c192f50f7e" + "framework_manifest_sha256": "1f3d6ff0a52d99cd553b51510a55d1e46a142db8e25f8c9c8c38163da4cc398b", + "ml4t_manifest_sha256": "145c156464b407d1bcf5f1afbd7ebac05522e146bc624fc25e995657571be4b0" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1291,13 +1291,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 110.22036941099213, - "ml4t": 22.05518278098316, + "framework": 139.76713411300443, + "ml4t": 41.591998734977096, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "d857384330265227317aa4e36f7006e909e85de6fe25c2949262267568973626", - "ml4t_manifest_sha256": "d4b78b1f34384cbcc5e21f1b95157b145ebb910f25756328675c8ee723a02cef" + "framework_manifest_sha256": "47e2f9ba1889a57a6df38d182098ef3e2be8575fb56270f40e4b62c33e53f5cf", + "ml4t_manifest_sha256": "3769bdb38b7ac25ae000d0719bae707764696bc80a91502bf390f15bfda46bb2" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1358,13 +1358,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 48.258371162984986, - "ml4t": 26.53631679501268, + "framework": 75.57017008506227, + "ml4t": 40.70154203695711, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "4cf155744af0ea2ea3dc85059b588871bb0d5df078f7c8c826dac1d2ec94340f", - "ml4t_manifest_sha256": "d0235efb0b3f013061d4a31010b2ea933a5a1aa1163ebed6f4ae7fa10db343af" + "framework_manifest_sha256": "497e23d8ffd69b00c7d7ad1817b5be6500dcaa8666eb016e9313376d3e58a6e5", + "ml4t_manifest_sha256": "f7d893ce989168b4fad41036dbda26c74101c2231db2873e40c9d37a616bec4b" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", diff --git a/validation/build_real_strategy_evidence.py b/validation/build_real_strategy_evidence.py new file mode 100644 index 00000000..61051c61 --- /dev/null +++ b/validation/build_real_strategy_evidence.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""Produce the retained real-strategy output tree that the comparator reads. + +``real_strategy_evidence.py`` compares ``//`` against +``//ml4t_`` but does not produce either, and nothing else in +``validation/`` did: the one place that invokes every side correctly is +``real_strategy_benchmark._measure_side``, which writes into a ``TemporaryDirectory`` because +it only wants the timings. This runs the same invocations once per side into a durable tree, +so the evidence can be rebuilt after an engine source change instead of by hand. + + uv run python validation/build_real_strategy_evidence.py \ + --bundle-root PATH/TO/CONTENT_ADDRESSED_BUNDLES \ + --evidence-root PATH/TO/REAL_STRATEGY_OUTPUTS + +Timings are not collected here. One run per side is enough for the comparator and is the wrong +sample for a published measurement; ``real_strategy_benchmark.py`` remains the only thing that +reports engine time, and it needs an unloaded machine. +""" + +from __future__ import annotations + +import argparse +import sys +import tomllib +from pathlib import Path + +VALIDATION_DIR = Path(__file__).resolve().parent +if str(VALIDATION_DIR) not in sys.path: + sys.path.insert(0, str(VALIDATION_DIR)) + +from real_strategy_benchmark import ( # noqa: E402, I001 + BUNDLES, + VALIDATION_DIR as _BENCHMARK_VALIDATION_DIR, + _command, + _run_once, +) + +APPLICABILITY_PATH = VALIDATION_DIR / "real_strategy_applicability.toml" +# The benchmark resolves its own VALIDATION_DIR independently. If the two ever +# disagree this script would enumerate one applicability file and shell out with +# paths derived from another, so tie them together here rather than trusting that +# two `Path(__file__)` expressions in the same directory stay in agreement. +assert _BENCHMARK_VALIDATION_DIR == VALIDATION_DIR + + +def required_pairs() -> list[tuple[str, str]]: + applicability = tomllib.loads(APPLICABILITY_PATH.read_text(encoding="utf-8")) + return [ + (pair["case_study"], pair["framework"]) + for pair in applicability["pair"] + if pair["status"] == "required" + ] + + +def build(*, bundle_root: Path, evidence_root: Path) -> int: + pairs = required_pairs() + for index, (case_study, framework) in enumerate(pairs, start=1): + bundle = bundle_root / case_study / BUNDLES[case_study] + if not bundle.is_dir(): + raise FileNotFoundError(f"Bundle missing for {case_study}: {bundle}") + for side, directory in ( + ("framework", evidence_root / case_study / framework), + ("ml4t", evidence_root / case_study / f"ml4t_{framework}"), + ): + directory.parent.mkdir(parents=True, exist_ok=True) + command = _command( + side=side, + case_study=case_study, + framework=framework, + bundle=bundle, + output=directory, + ) + engine_seconds, identity = _run_once(command, directory) + print( + f"{index}/{len(pairs)} {case_study}/{framework}/{side}: " + f"{engine_seconds:.6f}s engine time -> {directory}", + flush=True, + ) + if "equity.parquet" not in identity or "fills.parquet" not in identity: + raise RuntimeError( + f"{case_study}/{framework}/{side} retained {sorted(identity)}; the " + "comparator needs equity.parquet and fills.parquet" + ) + print(f"Wrote {2 * len(pairs)} sides for {len(pairs)} pairs under {evidence_root}") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle-root", type=Path, required=True) + parser.add_argument("--evidence-root", type=Path, required=True) + args = parser.parse_args() + return build( + bundle_root=args.bundle_root.resolve(), + evidence_root=args.evidence_root.resolve(), + ) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_benchmark.py b/validation/real_strategy_benchmark.py index c50f72d5..8b592cb4 100644 --- a/validation/real_strategy_benchmark.py +++ b/validation/real_strategy_benchmark.py @@ -279,6 +279,139 @@ def _is_sha256(value: object) -> bool: ) +def certified_sources(provenance: dict[str, Any]) -> dict[str, dict[str, Any]]: + """Return the engine sources these timings are certified for, keyed by digest.""" + entries = provenance.get("certified_equivalent_sources") + if not isinstance(entries, list): + return {} + return { + entry["engine_source_sha256"]: entry + for entry in entries + if isinstance(entry, dict) and _is_sha256(entry.get("engine_source_sha256")) + } + + +def source_is_published(provenance: dict[str, Any], current: str) -> bool: + """Whether the current engine source is one these timings may be published for. + + The timings are measured under exactly one source tree. That digest lives in + `ml4t_engine_source_sha256` and is never rewritten, so the report always says + which source produced the numbers. A later source that moves no measured + quantity is added to `certified_equivalent_sources` instead of triggering a + re-measurement, because re-measuring costs 2h29m of exclusive machine time and + cannot change a value that correctness parity has already shown is identical. + + `_tree_digest` hashes every tracked `.py` under the engine, so a docstring edit + moves it exactly as far as a rewritten fill model does. Without certification + that granularity prices a full benchmark run for any source edit at all. + """ + return current == provenance.get("ml4t_engine_source_sha256") or current in certified_sources( + provenance + ) + + +def runners_are_published(provenance: dict[str, Any], current: dict[str, str]) -> bool: + """Whether the current timing runners are ones these timings may be published for. + + Same contract as `source_is_published`, for the adapter and benchmark scripts + rather than the engine. Editing this file to add a certification path changes + its own digest without touching a single measured number, which is the defect + this function exists to stop recurring one level up from the engine. + """ + if current == provenance.get("sources"): + return True + return any(entry.get("sources") == current for entry in certified_sources(provenance).values()) + + +def certification_shape_failures(provenance: dict[str, Any]) -> list[str]: + """Return every reason a certification entry cannot be trusted.""" + entries = provenance.get("certified_equivalent_sources") + if entries is None: + return [] + if not isinstance(entries, list): + return ["Real-strategy certified_equivalent_sources must be a list"] + failures: list[str] = [] + for index, entry in enumerate(entries): + if not isinstance(entry, dict): + failures.append(f"Certification {index} is not an object") + continue + if not _is_sha256(entry.get("engine_source_sha256")): + failures.append(f"Certification {index} lacks a valid engine source digest") + if not _is_sha256(entry.get("correctness_evidence_sha256")): + failures.append(f"Certification {index} lacks the correctness evidence it rests on") + for field in ("certified_at", "reason", "ml4t_commit"): + value = entry.get(field) + if not isinstance(value, str) or not value.strip(): + failures.append(f"Certification {index} lacks {field}") + sources = entry.get("sources") + if not isinstance(sources, dict) or not all( + _is_sha256(value) for value in sources.values() + ): + failures.append(f"Certification {index} lacks valid runner source digests") + passing = entry.get("correctness_pairs_passed") + if not isinstance(passing, int) or isinstance(passing, bool) or passing < 1: + failures.append(f"Certification {index} lacks a passing-pair count") + return failures + + +def certify_source( + report: dict[str, Any], + correctness: dict[str, Any], + correctness_path: Path, + reason: str, +) -> dict[str, Any]: + """Certify the current engine source against timings measured under an older one. + + This never invents a measurement. It records that correctness parity was + re-derived under the current source and moved no value, so the published + timings stay attributed to the source that produced them while remaining + publishable for this one. + + Correctness parity does not by itself prove a source change is performance + inert - an added loop can leave every number identical and still cost time. + That judgement is the caller's, which is why `reason` is required and stored. + """ + current = _tree_digest(PROJECT_ROOT / "src/ml4t/backtest") + provenance = report["provenance"] + measured_under = provenance.get("ml4t_engine_source_sha256") + if current == measured_under: + raise ValueError("Engine source is unchanged; there is nothing to certify") + if current in certified_sources(provenance): + raise ValueError(f"Engine source {current} is already certified") + if not reason.strip(): + raise ValueError("Certification requires a reason the change cannot move a timing") + + correctness_failures = real_strategy_report_failures(correctness) + if correctness_failures: + raise ValueError("Correctness evidence is invalid: " + "; ".join(correctness_failures)) + correctness_digest = correctness["provenance"]["ml4t"]["engine_source_sha256"] + if correctness_digest != current: + raise ValueError( + f"Correctness evidence was produced under engine source {correctness_digest}, " + f"not the working tree's {current}; re-derive correctness before certifying" + ) + passing = [record for record in correctness["records"] if record.get("status") == "pass"] + if not passing: + raise ValueError("Correctness evidence contains no passing pair") + + entry = { + "engine_source_sha256": current, + "certified_at": datetime.now(UTC).isoformat(), + "correctness_evidence_sha256": _sha256(correctness_path), + "correctness_evidence_generated_at": correctness["generated_at"], + "correctness_pairs_passed": len(passing), + "ml4t_commit": correctness["provenance"]["ml4t"]["commit"], + "reason": reason.strip(), + "sources": {name: _sha256(path) for name, path in TIMING_SOURCE_PATHS.items()}, + } + provenance.setdefault("certified_equivalent_sources", []).append(entry) + # The timings are now attested by this correctness run rather than the one they + # were measured beside, so the pointer has to move with it or report_failures + # reads the evidence as stale. The measured-under digest above does not move. + report["correctness_evidence_generated_at"] = correctness["generated_at"] + return entry + + def report_failures(report: dict[str, Any], correctness: dict[str, Any]) -> list[str]: """Return every reason real-strategy timing evidence is not publication-safe.""" failures: list[str] = [] @@ -344,13 +477,21 @@ def report_failures(report: dict[str, Any], correctness: dict[str, Any]) -> list if not isinstance(provenance, dict): failures.append("Real-strategy performance provenance must be an object") else: - if provenance.get("ml4t_engine_source_sha256") != _tree_digest( - PROJECT_ROOT / "src/ml4t/backtest" + certification_failures = certification_shape_failures(provenance) + failures.extend(certification_failures) + if not certification_failures and not source_is_published( + provenance, _tree_digest(PROJECT_ROOT / "src/ml4t/backtest") ): - failures.append("Real-strategy performance engine source digest is stale") + failures.append( + "Real-strategy performance engine source is neither the source these " + "timings were measured under nor one they are certified for" + ) expected_sources = {name: _sha256(path) for name, path in TIMING_SOURCE_PATHS.items()} - if provenance.get("sources") != expected_sources: - failures.append("Real-strategy performance runner source digests are stale") + if not certification_failures and not runners_are_published(provenance, expected_sources): + failures.append( + "Real-strategy performance runner sources are neither the runners these " + "timings were measured with nor ones they are certified for" + ) correctness_records = correctness.get("records") if not isinstance(correctness_records, list): @@ -442,7 +583,27 @@ def main() -> int: type=Path, default=VALIDATION_DIR / "REAL_STRATEGY_RESULTS.json", ) - parser.add_argument("--bundle-root", type=Path, required=True) + parser.add_argument("--bundle-root", type=Path) + parser.add_argument( + "--performance", + type=Path, + default=VALIDATION_DIR / "REAL_STRATEGY_PERFORMANCE.json", + help="Published timing evidence to certify a new engine source against.", + ) + parser.add_argument( + "--certify-source", + action="store_true", + help=( + "Do not benchmark. Record that the current engine source moves no measured " + "value, so the published timings stay valid for it. Requires --reason and " + "correctness evidence re-derived under the current source." + ), + ) + parser.add_argument( + "--reason", + default="", + help="Why the source change cannot move a timing. Stored in the certification.", + ) parser.add_argument( "--output", type=Path, @@ -451,6 +612,24 @@ def main() -> int: parser.add_argument("--warmups", type=int, default=1) parser.add_argument("--samples", type=int, default=10) args = parser.parse_args() + if args.certify_source: + correctness = json.loads(args.correctness.read_text(encoding="utf-8")) + report = json.loads(args.performance.read_text(encoding="utf-8")) + entry = certify_source(report, correctness, args.correctness, args.reason) + failures = report_failures(report, correctness) + if failures: + raise ValueError("Certified performance evidence is invalid: " + "; ".join(failures)) + args.performance.write_text( + json.dumps(report, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + print( + f"Certified engine source {entry['engine_source_sha256'][:12]} against timings " + f"measured under {report['provenance']['ml4t_engine_source_sha256'][:12]}: " + f"{entry['correctness_pairs_passed']} correctness pairs pass, no timing re-measured." + ) + return 0 + if args.bundle_root is None: + raise ValueError("--bundle-root is required unless --certify-source is given") if args.warmups < 1 or args.samples < 10: raise ValueError("Benchmarks require at least one warmup and ten measured processes") correctness = json.loads(args.correctness.read_text(encoding="utf-8")) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 57e433fb..66a386d5 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -24,6 +24,7 @@ validation/common/provenance.py validation/large_scale_evidence.py validation/real_strategy_corpus.py validation/real_strategy_input.py +validation/build_real_strategy_evidence.py validation/real_strategy_benchmark.py validation/real_strategy_evidence.py validation/real_strategy_runner.py