{
  "metadata": {
    "suite": "backtest",
    "runtime": {
      "generated_at_utc": "2026-03-27T16:31:53.866252+00:00",
      "python_version": "3.13.5",
      "python_implementation": "CPython",
      "python_executable": "/Users/pratikbhadane/Work/Projects/ferro-ta/.venv/bin/python3",
      "platform": "macOS-26.3.1-arm64-arm-64bit-Mach-O",
      "system": "Darwin",
      "release": "25.3.0",
      "machine": "arm64",
      "processor": "arm",
      "cpu_model": "Apple M3 Max",
      "cpu_count_logical": 14,
      "total_memory_bytes": 38654705664
    },
    "git": {
      "commit": "2d776b6f908fd1a4f30a696972b7df5e5fe2ca00",
      "dirty": true,
      "branch": "main"
    },
    "build": {
      "rustc": "rustc 1.93.1 (01f6ddf75 2026-02-11)\nbinary: rustc\ncommit-hash: 01f6ddf7588f42ae2d7eb0a2f21d44e8e96674cf\ncommit-date: 2026-02-11\nhost: aarch64-apple-darwin\nrelease: 1.93.1\nLLVM version: 21.1.8",
      "cargo": "cargo 1.93.1 (083ac5135 2025-12-15)",
      "cargo_release_profile": {
        "lto": true,
        "codegen-units": 1
      },
      "rustflags": null,
      "cargo_build_rustflags": null,
      "maturin_flags": null
    },
    "packages": {
      "numpy": "2.2.6",
      "ferro-ta": "1.0.6"
    }
  },
  "results": {
    "backtest_core_single": [
      {
        "n_bars": 10000,
        "ferro_ta_ms": 0.024,
        "ferro_ta_mbars_s": 415.9388,
        "vectorbt_ms": 1.2843,
        "speedup_vs_vectorbt": 53.4187
      },
      {
        "n_bars": 100000,
        "ferro_ta_ms": 0.1964,
        "ferro_ta_mbars_s": 509.1209,
        "vectorbt_ms": 3.047,
        "speedup_vs_vectorbt": 15.5129
      }
    ],
    "backtest_ohlcv_core": [
      {
        "n_bars": 10000,
        "ferro_ta_ms": 0.0573,
        "ferro_ta_mbars_s": 174.4166
      },
      {
        "n_bars": 100000,
        "ferro_ta_ms": 0.7068,
        "ferro_ta_mbars_s": 141.4927
      }
    ],
    "performance_metrics": [
      {
        "n_bars": 10000,
        "ferro_ta_ms": 0.2182,
        "numpy_partial_ms": 0.0496,
        "speedup_vs_numpy": 0.2272,
        "note": "numpy_partial only computes sharpe+max_dd (2/23 metrics)"
      },
      {
        "n_bars": 100000,
        "ferro_ta_ms": 3.0303,
        "numpy_partial_ms": 0.351,
        "speedup_vs_numpy": 0.1158,
        "note": "numpy_partial only computes sharpe+max_dd (2/23 metrics)"
      }
    ],
    "multi_asset": [
      {
        "n_bars": 10000,
        "n_assets": 50,
        "parallel_ms": 2.4245,
        "serial_ms": 4.1751,
        "loop_ms": 2.0349,
        "parallel_speedup_vs_loop": 0.8393,
        "parallel_speedup_vs_serial": 1.722
      },
      {
        "n_bars": 100000,
        "n_assets": 50,
        "parallel_ms": 24.0349,
        "serial_ms": 47.9311,
        "loop_ms": 24.7476,
        "parallel_speedup_vs_loop": 1.0297,
        "parallel_speedup_vs_serial": 1.9942
      }
    ],
    "monte_carlo": [
      {
        "n_bars": 10000,
        "n_sims": 500,
        "ferro_ta_ms": 3.862,
        "numpy_loop_ms": 51.1589,
        "speedup_vs_numpy": 13.2469
      },
      {
        "n_bars": 100000,
        "n_sims": 500,
        "ferro_ta_ms": 26.0019,
        "numpy_loop_ms": 310.582,
        "speedup_vs_numpy": 11.9446
      }
    ],
    "engine_full_pipeline": [
      {
        "n_bars": 10000,
        "ferro_ta_ms": 0.4402,
        "description": "Full pipeline: signals + OHLCV fill + 23 metrics + trades + drawdown"
      },
      {
        "n_bars": 100000,
        "ferro_ta_ms": 4.445,
        "description": "Full pipeline: signals + OHLCV fill + 23 metrics + trades + drawdown"
      }
    ],
    "walk_forward_indices": [
      {
        "n_bars": 10000,
        "train_bars": 2000,
        "test_bars": 500,
        "ferro_ta_us": 0.333
      },
      {
        "n_bars": 100000,
        "train_bars": 20000,
        "test_bars": 5000,
        "ferro_ta_us": 0.292
      }
    ],
    "kelly_fraction": [
      {
        "n_calls": 1000,
        "ferro_ta_us": 86.458
      }
    ]
  }
}
