diff --git a/docs/api/index.md b/docs/api/index.md index 28ca74b3..30b9fe31 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -161,6 +161,20 @@ Auto-generated from source docstrings. options: show_root_heading: true +## Prediction-Market Fees + +::: ml4t.backtest.prediction_market_fees + options: + show_root_heading: true + members: + - kalshi_fee + - kalshi_order_fees + - forecastex_fee + - polymarket_us_fee + - KalshiCommission + - ForecastExCommission + - PolymarketUSCommission + ## Results ::: ml4t.backtest.result.BacktestResult diff --git a/docs/user-guide/market-impact.md b/docs/user-guide/market-impact.md index 60bb5e3f..1d55c548 100644 --- a/docs/user-guide/market-impact.md +++ b/docs/user-guide/market-impact.md @@ -84,6 +84,66 @@ its opposite is charged once for its full quantity. The fee is allocated between and opening trade records in proportion to their quantities. Partial fills are charged separately when they execute. +### Prediction-Market Venue Fees + +`ml4t.backtest.prediction_market_fees` implements the published fee schedules +of Kalshi, ForecastEx (via IBKR) and Polymarket US. Prices are dollars per +contract in `[0, 1]`; buying NO at `q` is a purchase at `q`. + +| Venue | Fee per fill | Model | +|-------|--------------|-------| +| Kalshi | taker `round_up(M * 0.07 * C * P * (1 - P))`; maker 0, 0.25x or 0.5x taker by series `fee_type` | `KalshiCommission` | +| ForecastEx | 0.01 per contract per side; no IBKR commission | `ForecastExCommission` | +| Polymarket US | taker `0.0695 * C * p * (1 - p)`; maker rebate `0.0125 * C * p * (1 - p)` | `PolymarketUSCommission` | + +Kalshi rounds the trade fee up to 0.000001. A non-direct member's balance is +then aligned to whole cents, so one contract at 0.50 costs 0.02 instead of +0.0175 while 100 contracts cost exactly 1.75; `rounding="cent"` reproduces +this, and `kalshi_order_fees` adds the per-order rebate of accumulated +overpayment. Polymarket US rounds each fill to the cent, half to even. The +engine charges only non-negative fees, so `PolymarketUSCommission` charges a +maker fill 0 and leaves out the rebate. + +Assign a model to the broker before running: + +```python +from ml4t.backtest.prediction_market_fees import KalshiCommission + +engine.broker.commission_model = KalshiCommission( + liquidity="taker", fee_type="quadratic", fee_multiplier=1.0, rounding="cent" +) +``` + +For research over many fills, the vectorized functions take NumPy arrays or +Polars Series and return an array of fees in dollars: + +```python +import polars as pl + +from ml4t.backtest.prediction_market_fees import kalshi_fee, polymarket_us_fee + +fills = pl.DataFrame( + { + "price": [0.50, 0.50, 0.90], + "contracts": [1, 100, 10], + "liquidity": ["taker", "taker", "maker"], + } +) +kalshi = kalshi_fee( + fills["price"], + fills["contracts"], + liquidity=fills["liquidity"], + fee_type="quadratic_with_maker_fees", + rounding="cent", +) +# array([0.02, 1.75, 0.02]) +polymarket = polymarket_us_fee(fills["price"], fills["contracts"], liquidity=fills["liquidity"]) +# array([ 0.017375, 1.7375 , -0.01125 ]) +``` + +Each function's docstring names the venue documents it follows and the date +they were read; schedules change, so check them before relying on a result. + ## Slippage Models Slippage adjusts the configured execution price in the adverse direction. Use the spread model for a bar-only estimate of bid-ask crossing, or a percentage or fixed amount for other execution drag. diff --git a/src/ml4t/backtest/prediction_market_fees.py b/src/ml4t/backtest/prediction_market_fees.py new file mode 100644 index 00000000..4afb3f53 --- /dev/null +++ b/src/ml4t/backtest/prediction_market_fees.py @@ -0,0 +1,526 @@ +"""Trading-fee schedules for prediction-market venues. + +Each venue has a vectorized function for research over arrays of fills and a +``CommissionModel`` for the engine: + +| Venue | Function | Model | +|---|---|---| +| Kalshi | `kalshi_fee`, `kalshi_order_fees` | `KalshiCommission` | +| ForecastEx (via IBKR) | `forecastex_fee` | `ForecastExCommission` | +| Polymarket US | `polymarket_us_fee` | `PolymarketUSCommission` | + +Prices are dollars per contract in ``[0, 1]`` and contracts pay 1.00 at +settlement. Buying NO at price ``q`` is a purchase at ``q``; the quadratic +formulas use ``q * (1 - q)``, which is symmetric, so a fee needs no YES/NO flag. +Contracts are non-negative counts. ``side`` (``"buy"``/``"sell"``) matters only +where a venue's rounding depends on the cash moved (Kalshi balance alignment). +``liquidity`` is ``"taker"`` (the fill removed a resting order) or ``"maker"`` +(the fill executed a resting order). + +The vectorized functions accept scalars, NumPy arrays, Python sequences and +Polars Series, broadcast them against each other and return a float64 +``numpy.ndarray`` of fees in dollars (0-d for all-scalar input). + +Fee figures were read from the venues' published schedules on 2026-10-08. They +change; the module constants name the value in force on that date. +""" + +from typing import Any, Literal + +import numpy as np + +__all__ = [ + "FORECASTEX_EXCHANGE_FEE", + "KALSHI_MAKER_FEE_FACTORS", + "KALSHI_TAKER_RATE", + "POLYMARKET_US_MAKER_REBATE_COEFFICIENT", + "POLYMARKET_US_TAKER_COEFFICIENT", + "ForecastExCommission", + "KalshiCommission", + "KalshiFeeType", + "KalshiRounding", + "Liquidity", + "PolymarketUSCommission", + "PolymarketUSRounding", + "Side", + "forecastex_fee", + "kalshi_fee", + "kalshi_order_fees", + "polymarket_us_fee", +] + +Liquidity = Literal["taker", "maker"] +Side = Literal["buy", "sell"] +KalshiFeeType = Literal["quadratic", "quadratic_with_maker_fees", "quadratic_with_combo_maker_fees"] +KalshiRounding = Literal["exact", "cent", "direct"] +PolymarketUSRounding = Literal["exact", "cent"] + +KALSHI_TAKER_RATE = 0.07 +"""Kalshi general trading fee rate: ``round_up(M * 0.07 * C * P * (1 - P))``.""" + +KALSHI_MAKER_FEE_FACTORS: dict[str, float] = { + "quadratic": 0.0, + "quadratic_with_maker_fees": 0.25, + "quadratic_with_combo_maker_fees": 0.5, +} +"""Maker fee as a multiple of the taker fee, by Kalshi series ``fee_type``.""" + +FORECASTEX_EXCHANGE_FEE = 0.01 +"""ForecastEx transaction fee per contract per side, in force from 2026-03-31.""" + +POLYMARKET_US_TAKER_COEFFICIENT = 0.0695 +"""Polymarket US standard taker coefficient (theta), effective 2026-10-01.""" + +POLYMARKET_US_MAKER_REBATE_COEFFICIENT = 0.0125 +"""Polymarket US maker rebate coefficient (magnitude of theta = -0.0125).""" + +_MICRO = 1_000_000.0 +_KALSHI_BALANCE_PRECISION_MICRO = {"cent": 10_000.0, "direct": 100.0} + +ArrayInput = Any + + +# === Shared helpers === + + +def _floats(name: str, value: ArrayInput) -> np.ndarray: + array = np.asarray(value, dtype=np.float64) + if not np.all(np.isfinite(array)): + raise ValueError(f"{name} must be finite") + return array + + +def _prices(value: ArrayInput) -> np.ndarray: + price = _floats("price", value) + if np.any((price < 0.0) | (price > 1.0)): + raise ValueError("price must be in [0, 1] dollars per contract") + return price + + +def _contracts(value: ArrayInput) -> np.ndarray: + contracts = _floats("contracts", value) + if np.any(contracts < 0.0): + raise ValueError("contracts must be non-negative; pass the direction as side") + return contracts + + +def _labels(name: str, value: ArrayInput, allowed: tuple[str, ...]) -> np.ndarray: + labels = np.asarray(value, dtype=np.str_) + unknown = sorted(set(np.unique(labels).tolist()) - set(allowed)) + if unknown: + raise ValueError(f"{name} must be one of {allowed}, got {unknown}") + return labels + + +def _snap(units: np.ndarray) -> np.ndarray: + """Remove floating-point noise from values that are integers in exact arithmetic. + + ``0.07 * 100 * 0.25 * 1e6`` evaluates to ``1750000.0000000002``; ceiling it + would charge one micro-dollar too much. A value within ``1e-12`` relative of + an integer is treated as that integer. + """ + nearest = np.rint(units) + tolerance = 1e-12 * np.maximum(np.abs(units), 1e3) + return np.where(np.abs(units - nearest) <= tolerance, nearest, units) + + +def _side_from_quantity(quantity: float) -> Side: + return "buy" if quantity >= 0.0 else "sell" + + +# === Kalshi === + + +def _kalshi_components( + price: ArrayInput, + contracts: ArrayInput, + liquidity: ArrayInput, + side: ArrayInput, + fee_type: ArrayInput, + fee_multiplier: ArrayInput, + rounding: str, +) -> tuple[np.ndarray, np.ndarray, float]: + """Return trade fee and rounding fee per fill in micro-dollars, and the precision.""" + p = _prices(price) + c = _contracts(contracts) + multiplier = _floats("fee_multiplier", fee_multiplier) + if np.any(multiplier < 0.0): + raise ValueError("fee_multiplier must be non-negative") + liquidity_labels = _labels("liquidity", liquidity, ("taker", "maker")) + side_labels = _labels("side", side, ("buy", "sell")) + fee_types = np.asarray(fee_type, dtype=np.str_) + if np.any(fee_types == "flat"): + raise ValueError( + "Kalshi fee_type 'flat' uses the Specific Trading Fees Table, which is not modeled" + ) + fee_types = _labels("fee_type", fee_types, tuple(KALSHI_MAKER_FEE_FACTORS)) + if rounding not in ("exact", "cent", "direct"): + raise ValueError(f"rounding must be 'exact', 'cent' or 'direct', got {rounding!r}") + + maker_factor = np.zeros(fee_types.shape) + for name, factor in KALSHI_MAKER_FEE_FACTORS.items(): + maker_factor = np.where(fee_types == name, factor, maker_factor) + factor = np.where(liquidity_labels == "taker", 1.0, maker_factor) + model_fee = multiplier * KALSHI_TAKER_RATE * factor * c * p * (1.0 - p) + trade_fee = np.ceil(_snap(model_fee * _MICRO)) + if rounding == "exact": + return trade_fee, np.zeros_like(trade_fee), 0.0 + + precision = _KALSHI_BALANCE_PRECISION_MICRO[rounding] + notional = _snap(p * c * _MICRO) + revenue = np.where(side_labels == "buy", -notional, notional) + before_alignment = revenue - trade_fee + aligned = np.floor(_snap(before_alignment / precision)) * precision + rounding_fee = before_alignment - aligned + trade_fee, rounding_fee = np.broadcast_arrays(trade_fee, rounding_fee) + return trade_fee, rounding_fee, precision + + +def kalshi_fee( + price: ArrayInput, + contracts: ArrayInput, + *, + liquidity: ArrayInput = "taker", + side: ArrayInput = "buy", + fee_type: ArrayInput = "quadratic", + fee_multiplier: ArrayInput = 1.0, + rounding: KalshiRounding = "exact", +) -> np.ndarray: + """Kalshi trading fee per fill, with each fill treated as its own order. + + Taker fee: ``round_up(M * 0.07 * C * P * (1 - P))`` with ``C`` contracts at + price ``P`` and ``M`` the series ``fee_multiplier``. A maker fill pays a + multiple of the taker formula set by the series ``fee_type``: 0 for + ``quadratic``, 0.25 for ``quadratic_with_maker_fees`` and 0.5 for + ``quadratic_with_combo_maker_fees``. Both ``fee_type`` and ``fee_multiplier`` + are on the series record of Kalshi's API (an event may override them). + Kalshi does not publish the ``flat`` formula in machine-readable form; that + type raises ``ValueError``. + + Rounding: + + - ``"exact"``: the trade fee, rounded up to 0.000001. 100 contracts at 0.50 + pay 1.75; 1 contract at 0.50 pays 0.0175. + - ``"cent"``: what a non-direct (FCM-cleared, retail) member is charged. The + balance change (cash for the contracts minus the trade fee) is aligned + down to 0.01, and the difference is added to the fee. 1 contract at 0.50 + pays 0.02. Kalshi rebates accumulated overpayment across the fills of one + order; this function treats every row as a one-fill order, where no rebate + can arise. Use `kalshi_order_fees` for the fills of one multi-fill order. + - ``"direct"``: as ``"cent"`` with the direct-member precision 0.0001. + + ``side`` changes the result only under ``"cent"`` and ``"direct"``, where a + sub-cent notional is part of the alignment. + + Sources: Kalshi fee schedule, "Fee Schedule for July 2026 - 7.7.26 Update" + (https://kalshi.com/docs/kalshi-fee-schedule.pdf); maker multipliers from + the ``FeeType`` description in https://docs.kalshi.com/openapi.yaml; + rounding from https://docs.kalshi.com/getting_started/fee_rounding. All read + 2026-10-08. + + Args: + price: Execution price in dollars per contract, in ``[0, 1]``. + contracts: Contracts filled, non-negative. + liquidity: ``"taker"`` or ``"maker"``, scalar or per fill. + side: ``"buy"`` or ``"sell"``, scalar or per fill. + fee_type: Series fee type, scalar or per fill. + fee_multiplier: Series fee multiplier ``M``, scalar or per fill. + rounding: ``"exact"``, ``"cent"`` or ``"direct"``. + + Returns: + Fee in dollars per fill. + """ + trade_fee, rounding_fee, _ = _kalshi_components( + price, contracts, liquidity, side, fee_type, fee_multiplier, rounding + ) + return (trade_fee + rounding_fee) / _MICRO + + +def kalshi_order_fees( + price: ArrayInput, + contracts: ArrayInput, + *, + liquidity: ArrayInput = "taker", + side: ArrayInput = "buy", + fee_type: ArrayInput = "quadratic", + fee_multiplier: ArrayInput = 1.0, + rounding: KalshiRounding = "cent", +) -> np.ndarray: + """Net Kalshi fee per fill for the fills of one order, in execution order. + + Each fill pays its trade fee plus a rounding fee that aligns the balance to + the member's precision (see `kalshi_fee`). The rounding fees accumulate per + order, across taker and maker fills alike. Whenever the accumulator holds at + least one precision step, whole steps are rebated on that fill, capped so + the fill's net fee stays non-negative. Three fills that each overpay 0.004 + pay 0.004, 0.004, and on the third fill 0.010 less (accumulator 0.012, + 0.002 carried forward). + + Source: https://docs.kalshi.com/getting_started/fee_rounding (read + 2026-10-08). + + Args: + price: Execution price per fill, in ``[0, 1]``. + contracts: Contracts per fill, non-negative. + liquidity: ``"taker"`` or ``"maker"``, scalar or per fill. + side: ``"buy"`` or ``"sell"``; one order has one side. + fee_type: Series fee type. + fee_multiplier: Series fee multiplier ``M``. + rounding: ``"cent"`` (non-direct member), ``"direct"`` or ``"exact"`` + (no balance alignment, so no accumulator). + + Returns: + One-dimensional array of net fees in dollars, one per fill. + """ + trade_fee, rounding_fee, precision = _kalshi_components( + price, contracts, liquidity, side, fee_type, fee_multiplier, rounding + ) + trade_fee = np.atleast_1d(trade_fee) + rounding_fee = np.atleast_1d(rounding_fee) + if trade_fee.ndim != 1: + raise ValueError("kalshi_order_fees takes the fills of one order as 1-D input") + if precision == 0.0: + return trade_fee / _MICRO + + net = np.empty_like(trade_fee) + accumulator = 0.0 + for index, (fee, overpayment) in enumerate(zip(trade_fee, rounding_fee, strict=True)): + charged = fee + overpayment + accumulator += overpayment + available = np.array([accumulator, charged], dtype=np.float64) / precision + rebate = float(np.floor(_snap(available)).min()) * precision + accumulator -= rebate + net[index] = charged - rebate + return net / _MICRO + + +class KalshiCommission: + """Kalshi trading fee as an engine ``CommissionModel``. + + Each ``calculate`` call is one fill and is treated as a one-fill order: the + per-order rebate of rounding overpayment (`kalshi_order_fees`) needs order + identity, which the protocol does not pass. A positive quantity is a buy, a + negative quantity a sell; buying NO is a buy at the NO price. + + Formula, rounding modes and sources: see `kalshi_fee`. + + Args: + liquidity: ``"taker"`` or ``"maker"`` for every fill. + fee_type: Series ``fee_type``. + fee_multiplier: Series ``fee_multiplier``. + rounding: ``"exact"``, ``"cent"`` (non-direct member) or ``"direct"``. + """ + + def __init__( + self, + liquidity: Liquidity = "taker", + fee_type: KalshiFeeType = "quadratic", + fee_multiplier: float = 1.0, + rounding: KalshiRounding = "exact", + ): + kalshi_fee( + 0.5, + 1.0, + liquidity=liquidity, + fee_type=fee_type, + fee_multiplier=fee_multiplier, + rounding=rounding, + ) + self.liquidity = liquidity + self.fee_type = fee_type + self.fee_multiplier = fee_multiplier + self.rounding = rounding + + def calculate(self, asset: str, quantity: float, price: float) -> float: + return float( + kalshi_fee( + price, + abs(quantity), + liquidity=self.liquidity, + side=_side_from_quantity(quantity), + fee_type=self.fee_type, + fee_multiplier=self.fee_multiplier, + rounding=self.rounding, + ) + ) + + +# === ForecastEx === + + +def forecastex_fee( + price: ArrayInput, + contracts: ArrayInput, + *, + exchange_fee: ArrayInput = FORECASTEX_EXCHANGE_FEE, + broker_commission: ArrayInput = 0.0, +) -> np.ndarray: + """ForecastEx fee per fill: a flat amount per contract per side. + + ForecastEx charges 0.01 per contract per side at execution, "independent of + contract resolution, netting, or settlement"; IBKR charges no commission on + ForecastEx contracts. The fee does not depend on price or liquidity; price + is validated so that the inputs match the other venues. + + Before 2026-03-31 the fee was embedded in prices (a YES and a NO paired at + 1.01) instead of charged explicitly. Prices recorded before that date + already contain it; pass ``exchange_fee=0.0`` for them. Block trades are + exempt from 2026-09-22 to 2026-12-01; pass ``exchange_fee=0.0`` for those + too. + + Sources: ForecastEx fee schedule, CFTC filing + https://www.cftc.gov/filings/orgrules/rules09082624298.pdf; change of model, + https://www.cftc.gov/filings/orgrules/rules03022640231.pdf; IBKR commission, + https://www.interactivebrokers.com/en/pricing/commissions-events.php. All + read 2026-10-08. + + Args: + price: Execution price in ``[0, 1]`` (validated, not used). + contracts: Contracts filled, non-negative. + exchange_fee: Exchange fee per contract. + broker_commission: Broker commission per contract. + + Returns: + Fee in dollars per fill. + """ + p = _prices(price) + c = _contracts(contracts) + per_contract = _floats("exchange_fee", exchange_fee) + _floats( + "broker_commission", broker_commission + ) + if np.any(per_contract < 0.0): + raise ValueError("exchange_fee + broker_commission must be non-negative") + fee = per_contract * c + return np.broadcast_arrays(fee, p)[0].astype(np.float64, copy=True) + + +class ForecastExCommission: + """ForecastEx fee via IBKR as an engine ``CommissionModel``. + + Formula and sources: see `forecastex_fee`. + + Args: + exchange_fee: Exchange fee per contract per side. + broker_commission: Broker commission per contract per side. + """ + + def __init__( + self, + exchange_fee: float = FORECASTEX_EXCHANGE_FEE, + broker_commission: float = 0.0, + ): + forecastex_fee(0.5, 1.0, exchange_fee=exchange_fee, broker_commission=broker_commission) + self.exchange_fee = exchange_fee + self.broker_commission = broker_commission + + def calculate(self, asset: str, quantity: float, price: float) -> float: + return float( + forecastex_fee( + price, + abs(quantity), + exchange_fee=self.exchange_fee, + broker_commission=self.broker_commission, + ) + ) + + +# === Polymarket US === + + +def polymarket_us_fee( + price: ArrayInput, + contracts: ArrayInput, + *, + liquidity: ArrayInput = "taker", + fee_coefficient: ArrayInput = POLYMARKET_US_TAKER_COEFFICIENT, + maker_rebate_coefficient: ArrayInput = POLYMARKET_US_MAKER_REBATE_COEFFICIENT, + rounding: PolymarketUSRounding = "exact", +) -> np.ndarray: + """Polymarket US fee per fill; a maker rebate is a negative fee. + + Taker: ``theta * C * p * (1 - p)`` with ``theta = 0.0695`` (1,000 contracts + at 0.50 pay 17.38 after rounding). Maker: ``-0.0125 * C * p * (1 - p)``, + paid at the trade. ``fee_coefficient`` is the taker theta; pass the + ``fee_coefficient`` column of ml4t-data's ``PolymarketUSProvider`` market + table (the venue's ``feeCoefficient``) to apply a per-market value. + + Rounding: ``"exact"`` returns the formula value; ``"cent"`` rounds each fill + to 0.01 with round-half-to-even, as the venue charges it, so small fees can + round to 0. The venue also caps the sum over one aggressive order's fills + at the rounded cumulative fee; per-fill rounding can exceed that cap by up + to 0.005 per fill. + + Not modeled: the combo taker curve ``C * p * [0.0695 * (1 - p) + 0.06 * + (1 - p)^4]`` and the prior-month taker volume rebates (10%, 25%, 50%). + + Source: Polymarket US fee schedule, https://docs.polymarket.us/fees (read + 2026-10-08). + + Args: + price: Execution price in ``[0, 1]``. + contracts: Contracts filled, non-negative. + liquidity: ``"taker"`` or ``"maker"``, scalar or per fill. + fee_coefficient: Taker theta, scalar or per fill. + maker_rebate_coefficient: Maker rebate magnitude, scalar or per fill. + rounding: ``"exact"`` or ``"cent"``. + + Returns: + Signed fee in dollars per fill: positive is paid, negative is received. + """ + p = _prices(price) + c = _contracts(contracts) + taker = _floats("fee_coefficient", fee_coefficient) + maker = _floats("maker_rebate_coefficient", maker_rebate_coefficient) + if np.any(taker < 0.0) or np.any(maker < 0.0): + raise ValueError("fee_coefficient and maker_rebate_coefficient must be non-negative") + liquidity_labels = _labels("liquidity", liquidity, ("taker", "maker")) + if rounding not in ("exact", "cent"): + raise ValueError(f"rounding must be 'exact' or 'cent', got {rounding!r}") + coefficient = np.where(liquidity_labels == "taker", taker, -maker) + fee = coefficient * c * p * (1.0 - p) + if rounding == "cent": + half_cents = _snap(fee * 200.0) + fee = np.round(half_cents / 2.0) / 100.0 + return np.asarray(fee, dtype=np.float64) + + +class PolymarketUSCommission: + """Polymarket US taker fee as an engine ``CommissionModel``. + + The engine charges only non-negative commissions, so a maker fill is + charged 0 and its rebate (0.0125 x C x p x (1 - p)) is left out, which + overstates maker costs. Use `polymarket_us_fee` where the rebate matters. + + Formula, rounding and sources: see `polymarket_us_fee`. + + Args: + liquidity: ``"taker"`` or ``"maker"`` for every fill. + fee_coefficient: Taker theta of the market. + rounding: ``"exact"`` or ``"cent"``. + """ + + def __init__( + self, + liquidity: Liquidity = "taker", + fee_coefficient: float = POLYMARKET_US_TAKER_COEFFICIENT, + rounding: PolymarketUSRounding = "exact", + ): + polymarket_us_fee( + 0.5, 1.0, liquidity=liquidity, fee_coefficient=fee_coefficient, rounding=rounding + ) + self.liquidity = liquidity + self.fee_coefficient = fee_coefficient + self.rounding = rounding + + def calculate(self, asset: str, quantity: float, price: float) -> float: + if self.liquidity == "maker": + return 0.0 + return float( + polymarket_us_fee( + price, + abs(quantity), + liquidity="taker", + fee_coefficient=self.fee_coefficient, + rounding=self.rounding, + ) + ) diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index a9060759..0aee1886 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -636,6 +636,8 @@ "from ml4t.backtest.execution.rebalancer import TargetWeightExecutor, RebalanceConfig", "from ml4t.backtest.models import NoCommission", "from ml4t.backtest.models import TieredCommission, CombinedCommission", + "from ml4t.backtest.prediction_market_fees import KalshiCommission", + "from ml4t.backtest.prediction_market_fees import kalshi_fee, polymarket_us_fee", "from ml4t.backtest.profiles import list_profiles", "from ml4t.backtest.result import BacktestResult", "from ml4t.backtest.risk.portfolio import MaxDrawdownLimit, RiskManager", @@ -2923,6 +2925,30 @@ "qualname": "TieredCommission", "signature": "(tiers: list[tuple[float, float]])" }, + "ml4t.backtest.prediction_market_fees:KalshiCommission": { + "kind": "class", + "members": { + "calculate": { + "kind": "method", + "signature": "(self, asset: str, quantity: float, price: float) -> float" + } + }, + "module": "ml4t.backtest.prediction_market_fees", + "qualname": "KalshiCommission", + "signature": "(liquidity: Literal['taker', 'maker'] = 'taker', fee_type: Literal['quadratic', 'quadratic_with_maker_fees', 'quadratic_with_combo_maker_fees'] = 'quadratic', fee_multiplier: float = 1.0, rounding: Literal['exact', 'cent', 'direct'] = 'exact')" + }, + "ml4t.backtest.prediction_market_fees:kalshi_fee": { + "kind": "function", + "module": "ml4t.backtest.prediction_market_fees", + "qualname": "kalshi_fee", + "signature": "(price: Any, contracts: Any, *, liquidity: Any = 'taker', side: Any = 'buy', fee_type: Any = 'quadratic', fee_multiplier: Any = 1.0, rounding: Literal['exact', 'cent', 'direct'] = 'exact') -> numpy.ndarray" + }, + "ml4t.backtest.prediction_market_fees:polymarket_us_fee": { + "kind": "function", + "module": "ml4t.backtest.prediction_market_fees", + "qualname": "polymarket_us_fee", + "signature": "(price: Any, contracts: Any, *, liquidity: Any = 'taker', fee_coefficient: Any = 0.0695, maker_rebate_coefficient: Any = 0.0125, rounding: Literal['exact', 'cent'] = 'exact') -> numpy.ndarray" + }, "ml4t.backtest.profiles:list_profiles": { "kind": "function", "module": "ml4t.backtest.profiles", diff --git a/tests/test_prediction_market_fees.py b/tests/test_prediction_market_fees.py new file mode 100644 index 00000000..ed715bc0 --- /dev/null +++ b/tests/test_prediction_market_fees.py @@ -0,0 +1,300 @@ +"""Prediction-market venue fees against the published schedules and worked examples.""" + +from copy import deepcopy +from datetime import datetime, timedelta +from decimal import ROUND_CEILING, ROUND_FLOOR, ROUND_HALF_EVEN, Decimal + +import numpy as np +import polars as pl +import pytest + +from ml4t.backtest import BacktestConfig, DataFeed, Engine, Strategy +from ml4t.backtest.models import CommissionModel, estimate_commission +from ml4t.backtest.prediction_market_fees import ( + ForecastExCommission, + KalshiCommission, + PolymarketUSCommission, + forecastex_fee, + kalshi_fee, + kalshi_order_fees, + polymarket_us_fee, +) +from ml4t.backtest.types import OrderSide + +CENT_PRICES = [k / 100 for k in range(1, 100)] + + +def _kalshi_reference(cents: int, contracts: int, side: str, precision: str | None) -> Decimal: + """Kalshi fee in exact decimal arithmetic, following the fee-rounding page step by step.""" + price = Decimal(cents) / 100 + trade_fee = (Decimal("0.07") * contracts * price * (1 - price)).quantize( + Decimal("0.000001"), ROUND_CEILING + ) + if precision is None: + return trade_fee + revenue = price * contracts * (-1 if side == "buy" else 1) + aligned = (revenue - trade_fee).quantize(Decimal(precision), ROUND_FLOOR) + return revenue - aligned + + +# === Kalshi: formula === + + +def test_kalshi_taker_fee_matches_the_schedule_peak_and_tail(): + # Guards a wrong rate: 0.07 x P x (1 - P) is 0.0175 at 0.50 and 0.0063 at 0.90. + assert kalshi_fee(0.50, 100).item() == 1.75 + assert kalshi_fee(0.50, 1).item() == 0.0175 + assert kalshi_fee(0.90, 1).item() == 0.0063 + + +def test_kalshi_fee_is_symmetric_between_yes_and_no_prices(): + # Buying NO at q is a purchase at q; the fee must not depend on which side is YES. + prices = np.array(CENT_PRICES) + np.testing.assert_array_equal(kalshi_fee(prices, 37), kalshi_fee(1.0 - prices, 37)) + + +def test_kalshi_series_fee_multiplier_scales_the_fee(): + # Guards a dropped multiplier M, scalar or joined per row from series metadata. + assert kalshi_fee(0.50, 100, fee_multiplier=2.0).item() == 3.5 + np.testing.assert_array_equal( + kalshi_fee([0.50, 0.50], [100, 100], fee_multiplier=[1.0, 0.5]), [1.75, 0.875] + ) + + +@pytest.mark.parametrize( + ("fee_type", "expected"), + [ + ("quadratic", 0.0), + ("quadratic_with_maker_fees", 0.4375), + ("quadratic_with_combo_maker_fees", 0.875), + ], +) +def test_kalshi_maker_fee_follows_series_fee_type(fee_type, expected): + # Guards charging makers on taker-only series and using the wrong maker factor. + assert kalshi_fee(0.50, 100, liquidity="maker", fee_type=fee_type).item() == expected + assert kalshi_fee(0.50, 100, liquidity="taker", fee_type=fee_type).item() == 1.75 + + +def test_kalshi_per_row_liquidity_and_fee_type_from_polars(): + fees = kalshi_fee( + pl.Series([0.50, 0.50, 0.50]), + pl.Series([100, 100, 100]), + liquidity=pl.Series(["taker", "maker", "maker"]), + fee_type=pl.Series(["quadratic", "quadratic", "quadratic_with_maker_fees"]), + ) + np.testing.assert_array_equal(fees, [1.75, 0.0, 0.4375]) + + +# === Kalshi: rounding === + + +def test_kalshi_trade_fee_rounds_up_to_a_micro_dollar(): + # 0.07 x 0.055 x 0.945 = 0.00363825: rounding up gives 0.003639, down 0.003638. + assert kalshi_fee(0.055, 1).item() == 0.003639 + + +def test_kalshi_exact_fee_on_the_micro_grid_is_not_bumped_by_float_noise(): + # 0.07 x 100 x 0.25 evaluates to 1.7500000000000002; a naive ceiling charges 1.750001. + assert kalshi_fee(0.50, 100).item() == 1.75 + + +def test_kalshi_cent_rounding_applies_to_the_fill_not_each_contract(): + # 100 contracts at 0.50 cost 50.00 + 1.75 = 51.75, already on the cent grid. + # Rounding each contract's 0.0175 to 0.02 would charge 2.00. + assert kalshi_fee(0.50, 100, rounding="cent").item() == 1.75 + assert kalshi_fee(0.50, 1, rounding="cent").item() == 0.02 + assert kalshi_fee(0.50, 1, rounding="exact").item() == 0.0175 + + +def test_kalshi_cent_rounding_matches_the_published_fcm_example(): + # docs.kalshi.com fee_rounding: buy, revenue -0.055, trade fee 0.003639, total 0.005. + assert kalshi_fee(0.055, 1, side="buy", rounding="cent").item() == 0.005 + + +def test_kalshi_direct_member_precision_is_a_hundredth_of_a_cent(): + # -0.055 - 0.003639 aligns down to -0.0587 at 0.0001 precision: fee 0.0037. + assert kalshi_fee(0.055, 1, rounding="direct").item() == 0.0037 + assert kalshi_fee(0.50, 1, rounding="direct").item() == 0.0175 + + +@pytest.mark.parametrize("rounding", ["exact", "cent", "direct"]) +@pytest.mark.parametrize("side", ["buy", "sell"]) +def test_kalshi_fee_matches_decimal_reference_over_the_price_grid(rounding, side): + precision = {"exact": None, "cent": "0.01", "direct": "0.0001"}[rounding] + for contracts in (1, 3, 7, 100, 2500): + expected = [ + float(_kalshi_reference(cents, contracts, side, precision)) for cents in range(1, 100) + ] + actual = kalshi_fee(CENT_PRICES, contracts, side=side, rounding=rounding) + np.testing.assert_array_equal(actual, expected) + + +def test_kalshi_order_accumulator_rebates_whole_cents_of_overpayment(): + # Each 1-contract fill at 0.10 has trade fee 0.0063 and rounding fee 0.0037. + # After the third fill the accumulator holds 0.0111: 0.01 is rebated, 0.0011 carries. + fills = kalshi_order_fees([0.10, 0.10, 0.10], [1, 1, 1], rounding="cent") + np.testing.assert_allclose(fills, [0.01, 0.01, 0.0], rtol=0, atol=1e-12) + single_fill = kalshi_fee(0.10, 3, rounding="cent").item() + assert fills.sum() == pytest.approx(single_fill, abs=1e-12) + + +def test_kalshi_order_without_alignment_has_no_rebate(): + fills = kalshi_order_fees([0.10, 0.10, 0.10], [1, 1, 1], rounding="exact") + np.testing.assert_array_equal(fills, [0.0063, 0.0063, 0.0063]) + + +@pytest.mark.parametrize( + ("kwargs", "message"), + [ + ({"price": 1.2}, "price"), + ({"price": float("nan")}, "price"), + ({"contracts": -1}, "contracts"), + ({"fee_type": "flat"}, "flat"), + ({"fee_type": "linear"}, "fee_type"), + ({"liquidity": "passive"}, "liquidity"), + ({"side": "short"}, "side"), + ({"fee_multiplier": -1.0}, "fee_multiplier"), + ({"rounding": "up"}, "rounding"), + ], +) +def test_kalshi_rejects_inputs_outside_the_schedule(kwargs, message): + arguments = {"price": 0.5, "contracts": 1} | kwargs + price = arguments.pop("price") + contracts = arguments.pop("contracts") + with pytest.raises(ValueError, match=message): + kalshi_fee(price, contracts, **arguments) + + +# === ForecastEx === + + +def test_forecastex_fee_is_one_cent_per_contract_at_any_price(): + np.testing.assert_array_equal( + forecastex_fee([0.05, 0.50, 0.95], [1, 10, 100]), [0.01, 0.1, 1.0] + ) + + +def test_forecastex_embedded_fee_era_can_be_priced_at_zero(): + assert forecastex_fee(0.5, 10, exchange_fee=0.0).item() == 0.0 + + +# === Polymarket US === + + +def test_polymarket_us_taker_fee_matches_the_schedule(): + assert polymarket_us_fee(0.50, 1).item() == pytest.approx(0.017375, abs=1e-15) + assert polymarket_us_fee(0.50, 1000, rounding="cent").item() == 17.38 + + +def test_polymarket_us_maker_rebate_is_a_negative_fee(): + # Published example: maker at 0.10 on 1,000 contracts receives 1.12. + assert polymarket_us_fee(0.10, 1000, liquidity="maker", rounding="cent").item() == -1.12 + + +def test_polymarket_us_cent_rounding_is_half_to_even_on_exact_values(): + # 0.0695 x 1000 x 0.3 x 0.7 = 14.595 exactly; in floats 14.594999999999997, + # which a naive round(x, 2) turns into 14.59. 6.255 rounds to 6.26 (even). + fees = polymarket_us_fee([0.30, 0.10, 0.90], 1000, rounding="cent") + np.testing.assert_array_equal(fees, [14.60, 6.26, 6.26]) + # 0.125 rounds down to the even cent, where half-up would give 0.13. + assert polymarket_us_fee(0.5, 1, fee_coefficient=0.5, rounding="cent").item() == 0.12 + + +def test_polymarket_us_cent_rounding_matches_decimal_reference(): + for contracts in (1, 10, 100, 1000, 12345): + expected = [ + float( + ( + Decimal("0.0695") * contracts * Decimal(k) / 100 * (1 - Decimal(k) / 100) + ).quantize(Decimal("0.01"), ROUND_HALF_EVEN) + ) + for k in range(1, 100) + ] + np.testing.assert_array_equal( + polymarket_us_fee(CENT_PRICES, contracts, rounding="cent"), expected + ) + + +def test_polymarket_us_uses_the_per_market_fee_coefficient(): + fees = polymarket_us_fee([0.5, 0.5], [100, 100], fee_coefficient=[0.0695, 0.10]) + np.testing.assert_allclose(fees, [1.7375, 2.5], rtol=0, atol=1e-12) + + +# === CommissionModel adapters === + + +@pytest.mark.parametrize( + ("model", "quantity", "price", "expected"), + [ + (KalshiCommission(), 100, 0.50, 1.75), + (KalshiCommission(rounding="cent"), 1, 0.50, 0.02), + (KalshiCommission(rounding="cent"), -1, 0.055, 0.005), + (KalshiCommission(liquidity="maker"), 100, 0.50, 0.0), + ( + KalshiCommission(liquidity="maker", fee_type="quadratic_with_maker_fees"), + 100, + 0.5, + 0.4375, + ), + (KalshiCommission(fee_multiplier=2.0), 100, 0.50, 3.5), + (ForecastExCommission(), -25, 0.40, 0.25), + (PolymarketUSCommission(rounding="cent"), 1000, 0.50, 17.38), + (PolymarketUSCommission(liquidity="maker"), 1000, 0.10, 0.0), + ], +) +def test_commission_models_charge_the_venue_fee(model, quantity, price, expected): + assert isinstance(model, CommissionModel) + assert model.calculate("EVT", quantity, price) == pytest.approx(expected, abs=1e-12) + assert estimate_commission(deepcopy(model), "EVT", quantity, price) == pytest.approx( + expected, abs=1e-12 + ) + + +def test_commission_model_rejects_invalid_configuration_at_construction(): + with pytest.raises(ValueError, match="flat"): + KalshiCommission(fee_type="flat") # type: ignore[arg-type] + with pytest.raises(ValueError, match="rounding"): + PolymarketUSCommission(rounding="direct") # type: ignore[arg-type] + + +def test_engine_charges_kalshi_cent_fee_on_each_fill(): + class BuyThenSell(Strategy): + def on_data(self, timestamp, data, context, broker): + if timestamp == datetime(2024, 1, 1): + broker.submit_order("EVT", 1, OrderSide.BUY) + elif timestamp == datetime(2024, 1, 3): + broker.submit_order("EVT", 100, OrderSide.BUY) + + dates = [datetime(2024, 1, 1) + timedelta(days=i) for i in range(5)] + prices = pl.DataFrame( + { + "timestamp": dates, + "asset": ["EVT"] * len(dates), + "open": [0.5] * len(dates), + "high": [0.5] * len(dates), + "low": [0.5] * len(dates), + "close": [0.5] * len(dates), + "volume": [100000] * len(dates), + } + ) + engine = Engine( + feed=DataFeed(prices_df=prices), + strategy=BuyThenSell(), + config=BacktestConfig(initial_cash=1000), + ) + engine.broker.commission_model = KalshiCommission(rounding="cent") + result = engine.run() + + assert [fill.commission for fill in result.fills] == [0.02, 1.75] + + +def test_negative_fee_parameters_are_rejected(): + with pytest.raises(ValueError, match="non-negative"): + forecastex_fee(0.5, 1, exchange_fee=-0.01) + with pytest.raises(ValueError, match="non-negative"): + polymarket_us_fee(0.5, 1, maker_rebate_coefficient=-0.0125) + + +def test_kalshi_order_fees_takes_one_order_as_one_dimension(): + with pytest.raises(ValueError, match="1-D"): + kalshi_order_fees([[0.5, 0.5]], [[1, 1]]) diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index 9c8f4ada..bf0ddd7f 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -63,7 +63,7 @@ "version": "3.1.1" } }, - "generated_at": "2026-09-24T01:09:13.329860+00:00", + "generated_at": "2026-10-08T19:42:55.916972+00:00", "input_policy": { "float_quantum": "0.00000001", "rounding": "ROUND_HALF_EVEN", @@ -704,7 +704,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.4247171190800145, + "duration_seconds": 2.3915587529772893, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -1361,7 +1361,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -1374,7 +1374,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -2034,7 +2034,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.42568556801416, + "duration_seconds": 2.389512272027787, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -2691,7 +2691,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -2704,7 +2704,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -2861,7 +2861,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.5785939740017056, + "duration_seconds": 2.4279953169752844, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3009,7 +3009,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -3022,7 +3022,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -3179,7 +3179,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.407202239963226, + "duration_seconds": 2.380415769002866, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3327,7 +3327,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -3340,7 +3340,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -4010,7 +4010,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.4113599320407957, + "duration_seconds": 2.554190814960748, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -4671,7 +4671,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -4684,7 +4684,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -5354,7 +5354,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.921618398046121, + "duration_seconds": 2.4330581699614413, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -6015,7 +6015,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -6028,7 +6028,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -6688,7 +6688,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.5871748520294204, + "duration_seconds": 2.4299100119969808, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -7345,7 +7345,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -7358,7 +7358,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -8018,7 +8018,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.438635880011134, + "duration_seconds": 2.4053515450214036, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -8675,7 +8675,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -8688,7 +8688,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -8892,7 +8892,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.4125146430451423, + "duration_seconds": 2.409221087989863, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9093,7 +9093,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -9106,7 +9106,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -9367,7 +9367,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 2.48359670501668, + "duration_seconds": 2.404560345050413, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9625,7 +9625,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "27979784dbb2f9dd6cf72c0d89ea956d49003ed83a57ed254cb6a2cbd234b6a5", @@ -9638,7 +9638,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -10298,7 +10298,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.392537266947329, + "duration_seconds": 2.4635453099617735, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -10955,7 +10955,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -10968,7 +10968,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -11172,7 +11172,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.7538477249909192, + "duration_seconds": 2.409709703992121, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11373,7 +11373,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "15f4500f48791f0c67d7c57f2554d0689a35a6dd71e07a8117de510acf106770", @@ -11386,7 +11386,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -11533,7 +11533,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.384882851038128, + "duration_seconds": 2.4244371740496717, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11677,7 +11677,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -11690,7 +11690,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -11837,7 +11837,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.417551827034913, + "duration_seconds": 2.405442788032815, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11981,7 +11981,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -11994,7 +11994,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -12141,7 +12141,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.3937213680474088, + "duration_seconds": 2.391603188996669, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -12285,7 +12285,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -12298,7 +12298,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -12901,7 +12901,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.486586573999375, + "duration_seconds": 2.430224950017873, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -13501,7 +13501,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "647d9a4a1a219599288faf756e995322ffee249ad29d3fbb88d3b1859249421a", @@ -13514,7 +13514,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -47804,7 +47804,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.5340354420477524, + "duration_seconds": 2.5086717620142736, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -82091,7 +82091,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -82104,7 +82104,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -82764,7 +82764,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 3.3456006130436435, + "duration_seconds": 3.3318582020001486, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -83421,7 +83421,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -83434,7 +83434,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -84094,7 +84094,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 3.4563437330070883, + "duration_seconds": 3.481427848979365, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -84751,7 +84751,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -84764,7 +84764,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -84921,7 +84921,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 3.7107325709657744, + "duration_seconds": 3.3575980329769664, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85069,7 +85069,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -85082,7 +85082,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -85239,7 +85239,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 3.3568190570222214, + "duration_seconds": 3.374126337002963, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85387,7 +85387,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "3b0720d05e9e5869aa6f01432d17918e2db8c0d80810310e6c39c8bf82d1aee0", @@ -85400,7 +85400,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -86070,7 +86070,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 3.4058225370245054, + "duration_seconds": 3.347590653982479, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -86731,7 +86731,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -86744,7 +86744,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -86774,7 +86774,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 5.058012902736664e-06, + "duration_seconds": 4.765985067933798e-06, "framework": "vectorbt_oss", "framework_result": null, "ml4t_result": null, @@ -87418,7 +87418,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 3.3862659139558673, + "duration_seconds": 3.372510668996256, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -88075,7 +88075,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -88088,7 +88088,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -88748,7 +88748,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 3.4436761640245095, + "duration_seconds": 3.54929475300014, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89405,7 +89405,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -89418,7 +89418,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -89622,7 +89622,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 3.4993690520059317, + "duration_seconds": 3.7352145859622397, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89823,7 +89823,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -89836,7 +89836,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -90097,7 +90097,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 3.474260456976481, + "duration_seconds": 3.9740366640035063, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -90355,7 +90355,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "27979784dbb2f9dd6cf72c0d89ea956d49003ed83a57ed254cb6a2cbd234b6a5", @@ -90368,7 +90368,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -91028,7 +91028,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 3.4526096960762516, + "duration_seconds": 3.429924627998844, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -91685,7 +91685,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -91698,7 +91698,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -91902,7 +91902,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 4.293192793964408, + "duration_seconds": 3.5622921240283176, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92103,7 +92103,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "85ef0c7c62fc2cf1f841196fce585253cbfa5fe4d3beb0e6c204003994d7f28f", @@ -92116,7 +92116,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -92263,7 +92263,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 3.6954419559333473, + "duration_seconds": 3.6319940899848007, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92407,7 +92407,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -92420,7 +92420,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -92567,7 +92567,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 4.190676840022206, + "duration_seconds": 3.538389565947, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92711,7 +92711,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -92724,7 +92724,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -92871,7 +92871,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 3.4919412350282073, + "duration_seconds": 3.5529292059945874, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -93015,7 +93015,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -93028,7 +93028,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -93631,7 +93631,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 3.4726691340329126, + "duration_seconds": 3.5450143619673327, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -94231,7 +94231,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "b5511731b0b2768bf962b3ac1d81c21a82f96d04896692f85bef5e5030ce2b1c", @@ -94244,7 +94244,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -128534,7 +128534,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.9416198300896212, + "duration_seconds": 3.6728255189955235, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -162821,7 +162821,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -162834,7 +162834,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -163514,7 +163514,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 0.26726809109095484, + "duration_seconds": 0.20569746801629663, "framework": "backtrader", "framework_result": { "capabilities": { @@ -164193,7 +164193,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -164206,7 +164206,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -164886,7 +164886,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 0.3663969690678641, + "duration_seconds": 0.2201554150087759, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165565,7 +165565,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -165578,7 +165578,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -165736,7 +165736,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 0.2969786908943206, + "duration_seconds": 0.2052952780504711, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165885,7 +165885,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -165898,7 +165898,7 @@ }, "input_digest": "02743db0d03a02ec414e579929e5e4729b5f99124ab2a41bb234adf93626f62a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -166056,7 +166056,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 0.26376285299193114, + "duration_seconds": 0.19165132701164111, "framework": "backtrader", "framework_result": { "capabilities": { @@ -166205,7 +166205,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -166218,7 +166218,7 @@ }, "input_digest": "c013a16b8902a5599e53c27dae34849fcf327b4e89ec69d00c951903578f948a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -166908,7 +166908,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 0.24508818506728858, + "duration_seconds": 0.2087343970197253, "framework": "backtrader", "framework_result": { "capabilities": { @@ -167589,7 +167589,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -167602,7 +167602,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -168292,7 +168292,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 0.21455272403545678, + "duration_seconds": 0.2079234800185077, "framework": "backtrader", "framework_result": { "capabilities": { @@ -168973,7 +168973,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -168986,7 +168986,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -169666,7 +169666,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 0.20543705392628908, + "duration_seconds": 0.20813855802407488, "framework": "backtrader", "framework_result": { "capabilities": { @@ -170345,7 +170345,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -170358,7 +170358,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -171038,7 +171038,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 0.20719261898193508, + "duration_seconds": 0.20751268602907658, "framework": "backtrader", "framework_result": { "capabilities": { @@ -171717,7 +171717,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -171730,7 +171730,7 @@ }, "input_digest": "465e20dbdd050a15410d58b7391e304491566407369632fbda07da88e4cc1cee", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -171936,7 +171936,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 0.2017657730029896, + "duration_seconds": 0.2043633599532768, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172139,7 +172139,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -172152,7 +172152,7 @@ }, "input_digest": "0857d4181ff37765143cd13fb7b67ead75a163a9ece87f9d258bb436175f2568", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -172416,7 +172416,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 0.19875362305901945, + "duration_seconds": 0.2127545650000684, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172677,7 +172677,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -172690,7 +172690,7 @@ }, "input_digest": "23496f457ab5fcdf8c02626db8af05c791278cc307dff08599f673c376e9116c", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -173360,7 +173360,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 0.21421630796976388, + "duration_seconds": 0.2172998600290157, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174027,7 +174027,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -174040,7 +174040,7 @@ }, "input_digest": "24a69cd2961c5f77332e19aa92432884a792bd64d1e045dac33f1922902e3ba3", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -174246,7 +174246,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 0.20441574498545378, + "duration_seconds": 0.20394259301247075, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174449,7 +174449,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "573f73f81275679129b0b0cda5fdf37aa7c8dadf009a5f5aca55fb7be9f9985e", @@ -174462,7 +174462,7 @@ }, "input_digest": "06b9362c086c33e65085233ecbe78d43de5c0f00950eb8b19d6df6e89ba76d3b", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -174610,7 +174610,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 0.1959168459288776, + "duration_seconds": 0.19762610900215805, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174755,7 +174755,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -174768,7 +174768,7 @@ }, "input_digest": "8948480a577fa0d6a769f0af879559553b872df5c12ebbdc621237db201f1d99", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -174916,7 +174916,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 0.1969940010458231, + "duration_seconds": 0.19581121404189616, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175061,7 +175061,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -175074,7 +175074,7 @@ }, "input_digest": "ea9583aa3a0de9f4e92d22968932fd83ac3e7d6e8d8a3e4f689e59868390c7d2", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -175222,7 +175222,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 0.193323764950037, + "duration_seconds": 0.2017260870197788, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175367,7 +175367,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -175380,7 +175380,7 @@ }, "input_digest": "a11960a1bd3f521902fe84af312597b4c7928f97c2dd5b0b37b898d5a00ce3e6", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -175992,7 +175992,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 0.34429927996825427, + "duration_seconds": 0.3256040040287189, "framework": "backtrader", "framework_result": { "capabilities": { @@ -176601,7 +176601,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6a425065c946d387fafc9cb9978bb86d7754e617273669247cf1149fbd23cc03", @@ -176614,7 +176614,7 @@ }, "input_digest": "ffd7241a6fbac9130b1d3b499285d0df2610825316987918d110592cbf847c7d", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -212104,7 +212104,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 0.5432185269892216, + "duration_seconds": 0.5484234970062971, "framework": "backtrader", "framework_result": { "capabilities": { @@ -247593,7 +247593,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -247606,7 +247606,7 @@ }, "input_digest": "4fb3be3cba6d7c832eeb1fd8c72523b5260ea67fa5ecf3bceeb8e21256e0f998", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -247981,7 +247981,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.3009805569890887, + "duration_seconds": 1.5950836910051294, "framework": "zipline", "framework_result": { "capabilities": { @@ -248357,7 +248357,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -248370,7 +248370,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -248745,7 +248745,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.2011894549941644, + "duration_seconds": 1.5548907099873759, "framework": "zipline", "framework_result": { "capabilities": { @@ -249121,7 +249121,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -249134,7 +249134,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -249291,7 +249291,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.1290805600583553, + "duration_seconds": 1.5306314430199564, "framework": "zipline", "framework_result": { "capabilities": { @@ -249443,7 +249443,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "16de00f1f72fcdd0199f55a77aaf5fe9c2e99450ae25a5350bd854eebf3896f5", @@ -249456,7 +249456,7 @@ }, "input_digest": "2ade3aa0a65bc5315f2297bc8bbc19b45dfdb8db50e52d56fc85ecb4a82facdd", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -249613,7 +249613,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.340645650983788, + "duration_seconds": 1.5279214510228485, "framework": "zipline", "framework_result": { "capabilities": { @@ -249765,7 +249765,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "16de00f1f72fcdd0199f55a77aaf5fe9c2e99450ae25a5350bd854eebf3896f5", @@ -249778,7 +249778,7 @@ }, "input_digest": "f576ca0b7380cdcf6eb6c99d5b8467e796d9811d6fb1cd66191df1688a948b62", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -250163,7 +250163,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.2611100990325212, + "duration_seconds": 1.6210316250217147, "framework": "zipline", "framework_result": { "capabilities": { @@ -250543,7 +250543,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -250556,7 +250556,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -250941,7 +250941,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.198857027105987, + "duration_seconds": 1.5706110470346175, "framework": "zipline", "framework_result": { "capabilities": { @@ -251321,7 +251321,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -251334,7 +251334,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -251709,7 +251709,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.2210966009879485, + "duration_seconds": 1.5523726060055196, "framework": "zipline", "framework_result": { "capabilities": { @@ -252085,7 +252085,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -252098,7 +252098,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -252473,7 +252473,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.1789409660268575, + "duration_seconds": 1.5809831559890881, "framework": "zipline", "framework_result": { "capabilities": { @@ -252849,7 +252849,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -252862,7 +252862,7 @@ }, "input_digest": "1e10efa2535c6df89cf6723633fd6f36e07a7f3449632f4aebaa518c1afade05", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -253066,7 +253066,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.3980092089623213, + "duration_seconds": 1.568807870033197, "framework": "zipline", "framework_result": { "capabilities": { @@ -253271,7 +253271,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -253284,7 +253284,7 @@ }, "input_digest": "52803556b6f294e3ad1223585e297f6dab81add8ca8cf22db7ed227dc14fe627", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -253314,7 +253314,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 3.7349527701735497e-06, + "duration_seconds": 3.0050287023186684e-06, "framework": "zipline", "framework_result": null, "ml4t_result": null, @@ -253673,7 +253673,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.306697252090089, + "duration_seconds": 1.607480824983213, "framework": "zipline", "framework_result": { "capabilities": { @@ -254049,7 +254049,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "8901a4a7a750c26fb43ceb5d89b4c6ccf9279503da8659b8398cce30d90c8d9c", @@ -254062,7 +254062,7 @@ }, "input_digest": "8a8791a9d96df21d21b4fa14ebf111ea1417ec8424fd87ac9b4b79515ca6c952", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -254266,7 +254266,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.269118699012324, + "duration_seconds": 1.5682583909947425, "framework": "zipline", "framework_result": { "capabilities": { @@ -254471,7 +254471,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "1d86423ea9c4ce2c32fc3b60b01566b4a0fe7f5629ee4cf2bf6899fd4d728f69", @@ -254484,7 +254484,7 @@ }, "input_digest": "ad5a0b9abf3e7e3ae35e06811443d816a29ac95b66e0bc7ce6b49a175f1e5fce", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -254631,7 +254631,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.2137621820438653, + "duration_seconds": 1.5618097010301426, "framework": "zipline", "framework_result": { "capabilities": { @@ -254779,7 +254779,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -254792,7 +254792,7 @@ }, "input_digest": "bc94952cbe0b0c493e4a5599ddcd00a92412a9c8c838ea8e5c02d84d217baf0c", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -254939,7 +254939,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.3711717680562288, + "duration_seconds": 1.5311189439962618, "framework": "zipline", "framework_result": { "capabilities": { @@ -255087,7 +255087,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -255100,7 +255100,7 @@ }, "input_digest": "a0bd681ff924f45192415219403b02e639df271a2aa5987bb9b1e263b2d8c88a", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -255247,7 +255247,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.1742781409993768, + "duration_seconds": 1.513668409024831, "framework": "zipline", "framework_result": { "capabilities": { @@ -255395,7 +255395,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -255408,7 +255408,7 @@ }, "input_digest": "ce9cac417809758597595322703b30800145707fa0db44bd7f2cd0775790c114", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -255783,7 +255783,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.765984929050319, + "duration_seconds": 2.052965320996009, "framework": "zipline", "framework_result": { "capabilities": { @@ -256159,7 +256159,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "94534fbfeca18ae041b780a18fbfe6884c21c0ce8c84d15d1d8e2096ba59cce7", @@ -256172,7 +256172,7 @@ }, "input_digest": "88cfc732983d3fa783e181fd4c97f8d95f7833e20dd03de0c201aaa85e83ca8b", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { @@ -275471,7 +275471,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.0084816509624943, + "duration_seconds": 2.34652952500619, "framework": "zipline", "framework_result": { "capabilities": { @@ -294771,7 +294771,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", + "engine": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4d2cacb23e64dacdbb2eda228691671d3a5d327dbbdd899de310551b244bae54", @@ -294784,7 +294784,7 @@ }, "input_digest": "6fdd33a401576a2adde590f2f8d5986f5893e4663336033ba6c0f8f221d5d526", "ml4t": { - "commit": "fde7254403b60f4a556c5f7beabaf62274f1ae13", + "commit": "16e7ffabc15360de01638d662160eb41ef7d34d8", "dirty": false }, "python": { diff --git a/validation/REAL_STRATEGY_PERFORMANCE.json b/validation/REAL_STRATEGY_PERFORMANCE.json index 5f1b87fe..9d39e67c 100644 --- a/validation/REAL_STRATEGY_PERFORMANCE.json +++ b/validation/REAL_STRATEGY_PERFORMANCE.json @@ -1,5 +1,5 @@ { - "correctness_evidence_generated_at": "2026-09-24T01:50:22.858146+00:00", + "correctness_evidence_generated_at": "2026-10-08T20:00:49.510846+00:00", "environment": { "cpu_count": 24, "frameworks": { @@ -101,6 +101,50 @@ }, "generated_at": "2026-09-24T05:37:41.451299+00:00", "provenance": { + "certified_equivalent_sources": [ + { + "certified_at": "2026-10-08T19:28:11.762869+00:00", + "correctness_evidence_generated_at": "2026-10-08T19:27:55.214328+00:00", + "correctness_evidence_sha256": "8818058c974a2beac7edc59013224bb0fd818f828e656dac5f5a41650a704aa5", + "correctness_pairs_passed": 17, + "engine_source_sha256": "b1ebee1ef59f82269fb69cb4103927398254bfa5d8ad620a23c588260de99aca", + "ml4t_commit": "a1649d9f4271c56dcb1de9688b97218f8c50cb13", + "reason": "The only engine source change is the new module src/ml4t/backtest/prediction_market_fees.py. Nothing in src/ml4t/backtest or the real-strategy runners imports it (grep finds no import outside the module itself), so it is never loaded by the timed region, result = engine.run() in validation/real_strategy_runner.py, and cannot move an engine timing. Real-strategy correctness was rebuilt under this source at f349264: 17/17 pass with no compared value moved.", + "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" + } + }, + { + "certified_at": "2026-10-08T20:00:56.038473+00:00", + "correctness_evidence_generated_at": "2026-10-08T20:00:49.510846+00:00", + "correctness_evidence_sha256": "3f26dc66ec0874de379a4fe97fa149ccf262688901a7b6aa2c3a973e4376a861", + "correctness_pairs_passed": 17, + "engine_source_sha256": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f", + "ml4t_commit": "e76e95d5b3ca5ef1daf833c82b9548e1db726fed", + "reason": "The engine source differs from the measured one only by the new module src/ml4t/backtest/prediction_market_fees.py. Nothing in src/ml4t/backtest or the real-strategy runners imports it, so it is never loaded in the timed region (result = engine.run() in validation/real_strategy_runner.py) and cannot move an engine timing. Real-strategy correctness was rebuilt under this source at 5b7a27e: 17/17 pass.", + "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": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe", "sources": { "backtrader": "a456cc3bf9ed6708d239f21ed2c2495a3c19a9a8306634fee24619c2c0484459", diff --git a/validation/REAL_STRATEGY_RESULTS.json b/validation/REAL_STRATEGY_RESULTS.json index 6ea17fa4..592faaf0 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-24T01:50:22.858146+00:00", + "generated_at": "2026-10-08T20:00:49.510846+00:00", "provenance": { "adapters": { "backtrader": "a456cc3bf9ed6708d239f21ed2c2495a3c19a9a8306634fee24619c2c0484459", @@ -131,24 +131,24 @@ }, "machine": "x86_64", "ml4t": { - "commit": "0524f8ecef19a83d8950b4cfc6fb6a384ec459cf", + "commit": "e76e95d5b3ca5ef1daf833c82b9548e1db726fed", "dirty": false, - "engine_source_sha256": "553e3e351f2de59bc17fc4f42b67e4e4f923d059b44eecd6a69e114df4b4a8fe" + "engine_source_sha256": "2a0d9b9b0570f22772090e2204b97fb7aa970b99ca6814b63f443b47539bf41f" }, - "platform": "Linux-6.8.0-139-generic-x86_64-with-glibc2.39", + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.43", "python": "3.12.11" }, "records": [ { "case_study": "etfs", "engine_seconds": { - "framework": 1.1340462770313025, - "ml4t": 1.2943288600072265, + "framework": 0.3412680019973777, + "ml4t": 0.419192252040375, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "44f1ffaf162456369fa006ef5aa075a20423127a3f827dd4211adec1fa442cd6", - "ml4t_manifest_sha256": "6471618270dbf4dfa8fed409e074fb3ff96647d8e12a856b089de3cf982a82f9" + "framework_manifest_sha256": "1b7f4eca0fd6eafcc14c5bb97a60150810c4517972671ab93d963f507bff1b3a", + "ml4t_manifest_sha256": "abab1d59ba06a1216da8c0be69ad19670c277eec2bc467c42aebcc790d5d6eb3" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -209,13 +209,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 1.0902336100116372, - "ml4t": 1.2939870660193264, + "framework": 0.18416030501248315, + "ml4t": 0.4282481879927218, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "4bda15d8c20b681d468a1f54c81a967f7fb9a12d6a0fe65bcf122b433c0e4025", - "ml4t_manifest_sha256": "ce8e5c941b9682e822e6b7653a81ea4b635228ffe6f9fd9868d625d46a7b68e6" + "framework_manifest_sha256": "48aa6691ec1a296142101db639e8ba5966ad83490de0b58e646620ff022cfd2c", + "ml4t_manifest_sha256": "064b493228789906039cbd462d3297059d48f56ceed0a4c1c5e691475ed7134c" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -276,13 +276,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 23.003436908009462, - "ml4t": 1.1710805310867727, + "framework": 9.737538582005072, + "ml4t": 0.4487659599981271, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "2c321c02039c5d16ae30a4bc677b4779dbc8719896fa16262a10f9be9aedae95", - "ml4t_manifest_sha256": "4c34a465e1ed166eabe4b33c1905409e1b440b81fdebb918473b06b1d47458ef" + "framework_manifest_sha256": "7f1e9cecc4feeced81af2ee7d99123196536bce1e5fb292631d7d250d19834d7", + "ml4t_manifest_sha256": "d83bebda06df2b217689c872082582b19a7b09d459578458a08de55273b37a7e" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -353,13 +353,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 15.617935788934119, - "ml4t": 1.7292126989923418, + "framework": 4.807452238979749, + "ml4t": 0.6355875970330089, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "9259f755de4a5deefaf89e6a6d13647061193db0e49d89e7631314b1c3e65c0d", - "ml4t_manifest_sha256": "d9a6f6210dd5d378d9a244c73772aefdaffbed945a6add5e611c2b2a0d2716e8" + "framework_manifest_sha256": "26775814326860feebb8fc359492b58f601240a811916b2797219907b443ae11", + "ml4t_manifest_sha256": "a4aaa05edad9e296818a7687a24b7f502d0eecdd796bfde3215fab866f9ecd21" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -420,13 +420,13 @@ { "case_study": "etfs", "engine_seconds": { - "framework": 7.2253005559323356, - "ml4t": 2.232580687967129, + "framework": 2.9700952940038405, + "ml4t": 0.7646393330069259, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "8dfa63a34ca4f69adfe5a5ebb667ab74114c5545dd05097870b37f2ce3dd2161", - "ml4t_manifest_sha256": "7b8426a090590cd9e9a96977c308de245349e8f5d94d95721a621d74885483ef" + "framework_manifest_sha256": "bccc2fa584afc9759bca5b77f912a2d9df9b7bb22f446d458c32978932f48064", + "ml4t_manifest_sha256": "89ee685f46b21e64bac1fc900cc473735ddfb9a23e02cda8714bf73358f5d657" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -515,13 +515,13 @@ { "case_study": "cme_futures", "engine_seconds": { - "framework": 1.0428278229665011, - "ml4t": 0.9311261599650607, + "framework": 0.37743046099785715, + "ml4t": 0.4161097949836403, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "65264b17b19a01dfa389029873603b9fe9a5d04db757d9070167364c94a936da", - "ml4t_manifest_sha256": "0a0960be223d66a24b88568160bdca9e3f5adb2b17bc58954ce24bfd223192ba" + "framework_manifest_sha256": "95f831f02c6990a73c4e08b41587dfee3103c8587f2121d5ea2878d841d70c0a", + "ml4t_manifest_sha256": "82e4d2ded6a373d2b5b7cf3f0ec696c54c4405ceecd4fc49c0c067d8f4368370" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -589,13 +589,13 @@ { "case_study": "cme_futures", "engine_seconds": { - "framework": 5.8616829010425135, - "ml4t": 1.1937822529580444, + "framework": 2.6640014040167443, + "ml4t": 0.4422138170339167, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "ec546c132593e7167baf8ccb5069ce7fb46ecc6af57d32dfdf7cde8cef87fd41", - "ml4t_manifest_sha256": "5258c7bd6e49a847afd875cf7346eb2f4b4fcd462bce579535a80d81de891fa8" + "framework_manifest_sha256": "4fe816c44263c0729af1af1d26ab47f6237abdab9c10f02dff3b506a3869d700", + "ml4t_manifest_sha256": "33cac6b620a39bf3ed2a5845ab86d7bbed89dbf8d16606812634fea1deda4716" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -708,13 +708,13 @@ { "case_study": "crypto_perps_funding", "engine_seconds": { - "framework": 8.64055325195659, - "ml4t": 1.861964081064798, + "framework": 2.87804518698249, + "ml4t": 0.7094007299747318, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "fc1ddaaf85d1bce9f43e6f7afd2fb9c7398bf4b2cdbb703e5fc670fe5f7e98ad", - "ml4t_manifest_sha256": "7b84318804e49728015771eae24b58a82c63963fd5e77167bb7765987f3d5707" + "framework_manifest_sha256": "5b5873188d1f8731a57f302831809599bcdf6ec72dd225ffc1e6ca0b40b72745", + "ml4t_manifest_sha256": "5badb0761f0665e00873f7490c775bcaf0bcdf2e0c5943c09d968da3632dcd89" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -785,13 +785,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 1.0617584569845349, - "ml4t": 0.2712107199477032, + "framework": 0.39610078401165083, + "ml4t": 0.15986847499152645, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "63b30da67c7b8315b1bfa355479d78d083046543cabb8f49e5fa0083a6338697", - "ml4t_manifest_sha256": "84ed03c40397d27e5024027ee66d0c0647774d4a26548960ca0fa062dc14036c" + "framework_manifest_sha256": "087843d9c025881cebdead1a7d6d8e04b10468bb25d85c4f606a18f845ef740b", + "ml4t_manifest_sha256": "0d6e8b530cbefe03afc171edc470f0ee8c9f13e5298284754b9baec75fecdc19" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -852,13 +852,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.43417372403200716, - "ml4t": 0.367529945098795, + "framework": 0.2652946129674092, + "ml4t": 0.16622454696334898, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "7bae5d5874974aaacab017c970db33df1b65beb918449084be6d774057063007", - "ml4t_manifest_sha256": "5a17717ceebcf9ac1cedd534815b60da584f6c3fb654671fd98420ea3e1b37d7" + "framework_manifest_sha256": "9bc9c3020fda3549d772d6de2464138cc0ff710c845c29e2ca363e1a54e13b4f", + "ml4t_manifest_sha256": "f357b758231290582fcd6f6321ef9e3b7122ef4b8ad23f11c4c259bc9a87895f" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -919,13 +919,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 1.0406507139559835, - "ml4t": 0.17209112795535475, + "framework": 0.4294113659998402, + "ml4t": 0.16142100398428738, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "09a6ccdf1c3c28051988e232e8515975f5cdec92f14efd98ffaa2a93dcef8902", - "ml4t_manifest_sha256": "32edb292c16b71cb2fb06225d6cef7e34409cbdbd26b62cfe1dc1718412703ea" + "framework_manifest_sha256": "79035767c67ffb9b102972fd70dcfd0562e021680186b37e4cb9db606591d019", + "ml4t_manifest_sha256": "a96b2a7f38e901f8fbe2c908b850196fd0c166021d38b0c50145dee15730f15a" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1003,13 +1003,13 @@ { "case_study": "fx_pairs", "engine_seconds": { - "framework": 0.9791555179981515, - "ml4t": 0.17271842202171683, + "framework": 1.0083705990109593, + "ml4t": 0.16377678205026314, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "b08f5d5fb24c7ea3b6a2545c86cdc49b94050eb136be545ffae0714ccd76cfe4", - "ml4t_manifest_sha256": "ebb575c8a173bb875d61ae646d6f96a978305ffe733ac4820935f83591139b0e" + "framework_manifest_sha256": "6c63ce8dee1eec909a0d06ae7629d93aa3a71edd04ba657edb110bb9212b32f3", + "ml4t_manifest_sha256": "152e463ac94d3efbb2578a37020663a84ee8172ee4e21f17960c311d3494f0fe" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1080,13 +1080,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 1.2900436379713938, - "ml4t": 38.869148430996574, + "framework": 1.1930540719768032, + "ml4t": 32.499565685982816, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "acdc68f862f8ba07917fd16a59a19ec5ac6825b8a26f5ec8c16bc96c9bf4a1e7", - "ml4t_manifest_sha256": "88ae2e84f8d3187a4f5d84e78fe8441f5bc652cb08ce4d5591018edbc50d5587" + "framework_manifest_sha256": "f9883ea4e6e1f8662b829ddcdb1253490d75539610560497265080ffd691c7b0", + "ml4t_manifest_sha256": "5a8db1c911ee80b7d7cae056eb63737549775edd095b62ef13749f419c780c90" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1147,13 +1147,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 37.01605061593, - "ml4t": 26.629379056044854, + "framework": 18.31070233299397, + "ml4t": 30.549421797972172, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "ef2984a8e6e6d7a5f9803333535f28fa8c6e35f6bb225b57a57139c9153e6136", - "ml4t_manifest_sha256": "eb964c1f9ed81c7c94b7c50da65faa242e1474c697b63ceb54acd77b01a5dba5" + "framework_manifest_sha256": "19fc47421629cc12e8f3512eed860e65bd196cc5942868631a264235bc0ca43f", + "ml4t_manifest_sha256": "556adb7916408a4fa2eda366cf092e065141c651a32c7f8d8e126ee83a09f9b2" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1214,13 +1214,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 616.757336596027, - "ml4t": 89.94735079002567, + "framework": 529.6449827509932, + "ml4t": 23.223136416985653, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "8095a3f577941a4e25156608891932c18d177d6f9668122f0e9cad2b025b5280", - "ml4t_manifest_sha256": "15b5f87860d12c3f895c827d10bc867361a1e63347db0b96d69472775e161691" + "framework_manifest_sha256": "a8c7c16c5db2812fc6539aa23b2c8a59301495c61b431eac49ed9cd3f9e75588", + "ml4t_manifest_sha256": "c64aa4bcea4da2ee90444168ad8b4b709b12f04836f3ec00c3ce1343bd363af6" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1291,13 +1291,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 344.35249897500034, - "ml4t": 80.43836854794063, + "framework": 106.2881790450192, + "ml4t": 23.548457249999046, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "072b1be44da81fd4cff02b38297784a617978175db3aeab1e2bb3a1ddb0ff7e0", - "ml4t_manifest_sha256": "d641a7796c7bb76ceff56fb7333ab04085f77b259f1b1040c51cbefa33407bfe" + "framework_manifest_sha256": "d31da8742d55417f1464e65fc47f46fc8f3ab1bf5464e92035a0684776b6369e", + "ml4t_manifest_sha256": "e118a86cee6fd760435d909cbf5469b59be0d50fa2e7e1c6a18d943041ba65fd" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner", @@ -1358,13 +1358,13 @@ { "case_study": "us_equities_panel", "engine_seconds": { - "framework": 50.57741306605749, - "ml4t": 28.115149467950687, + "framework": 53.311729563982226, + "ml4t": 29.1640200560214, "single_run_diagnostic_only": true }, "evidence": { - "framework_manifest_sha256": "65de260c3f364fabc16a83a1c87339abee1c408fbb735782456942289fd3105b", - "ml4t_manifest_sha256": "5149fb64bc949f7b8a05ea34dc50b6be9dca9715bebc78d1891bf9e753c15f39" + "framework_manifest_sha256": "bd404a4e3ace9eac084d842c777a780702ff9d26a17113599ec0b3c3de5189dc", + "ml4t_manifest_sha256": "5fb49877e497b4541ed7a1d6293c65b6364a3c6637d4d7595b18032703b29acc" }, "excluded_surfaces": { "accepted_unfilled_orders": "not exposed by every native runner",