quantbt-engine 1.0.8__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/CHANGELOG.md +47 -0
- {quantbt_engine-1.0.8/src/quantbt_engine.egg-info → quantbt_engine-1.1.0}/PKG-INFO +123 -19
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/README.md +120 -18
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/pyproject.toml +12 -4
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/__init__.py +193 -1
- quantbt_engine-1.1.0/src/quantbt/api/__init__.py +5 -0
- quantbt_engine-1.1.0/src/quantbt/api/event_driven.py +223 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/__init__.py +20 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/_native_event_rust.py +802 -130
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_event.py +1530 -163
- quantbt_engine-1.1.0/src/quantbt/backends/native_portfolio_package.py +335 -0
- quantbt_engine-1.1.0/src/quantbt/backends/native_strategy_ir.py +1152 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/__init__.py +122 -0
- quantbt_engine-1.1.0/src/quantbt/core/accounting_contracts.py +437 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/event.py +156 -3
- quantbt_engine-1.1.0/src/quantbt/core/event_contracts.py +387 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/execution_contract.py +34 -2
- quantbt_engine-1.1.0/src/quantbt/core/execution_trace.py +420 -0
- quantbt_engine-1.1.0/src/quantbt/core/generated_native_event_contracts.py +13 -0
- quantbt_engine-1.1.0/src/quantbt/core/generated_product_contracts.py +29 -0
- quantbt_engine-1.1.0/src/quantbt/core/instrument_contracts.py +275 -0
- quantbt_engine-1.1.0/src/quantbt/core/native_event_capabilities.py +139 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/native_event_parity.py +39 -5
- quantbt_engine-1.1.0/src/quantbt/core/native_event_promotion.py +615 -0
- quantbt_engine-1.1.0/src/quantbt/core/package_execution_contracts.py +223 -0
- quantbt_engine-1.1.0/src/quantbt/core/portfolio_execution_contracts.py +244 -0
- quantbt_engine-1.1.0/src/quantbt/core/product_contracts.py +179 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/reactive.py +23 -3
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/endpoint.py +38 -0
- quantbt_engine-1.1.0/src/quantbt/engine_spi/__init__.py +48 -0
- quantbt_engine-1.1.0/src/quantbt/engine_spi/errors.py +4 -0
- quantbt_engine-1.1.0/src/quantbt/engine_spi/native_event.py +515 -0
- quantbt_engine-1.1.0/src/quantbt/engine_spi/protocol.py +71 -0
- quantbt_engine-1.1.0/src/quantbt/engine_spi/registry.py +26 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/engines.py +75 -17
- quantbt_engine-1.1.0/src/quantbt/errors.py +72 -0
- quantbt_engine-1.1.0/src/quantbt/planning/__init__.py +62 -0
- quantbt_engine-1.1.0/src/quantbt/planning/capabilities.py +68 -0
- quantbt_engine-1.1.0/src/quantbt/planning/fingerprints.py +44 -0
- quantbt_engine-1.1.0/src/quantbt/planning/models.py +265 -0
- quantbt_engine-1.1.0/src/quantbt/planning/output.py +91 -0
- quantbt_engine-1.1.0/src/quantbt/planning/resolve.py +162 -0
- quantbt_engine-1.1.0/src/quantbt/preparation/__init__.py +38 -0
- quantbt_engine-1.1.0/src/quantbt/preparation/cache.py +165 -0
- quantbt_engine-1.1.0/src/quantbt/preparation/models.py +193 -0
- quantbt_engine-1.1.0/src/quantbt/preparation/native_event.py +396 -0
- quantbt_engine-1.1.0/src/quantbt/preparation/native_execution.py +754 -0
- quantbt_engine-1.1.0/src/quantbt/results/__init__.py +21 -0
- quantbt_engine-1.1.0/src/quantbt/results/raw.py +158 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/__init__.py +40 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/commands.py +224 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/context.py +195 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/driver.py +147 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/native_ir.py +455 -0
- quantbt_engine-1.1.0/src/quantbt/strategies/requirements.py +175 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0/src/quantbt_engine.egg-info}/PKG-INFO +123 -19
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/SOURCES.txt +42 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/requires.txt +3 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34c_native_event_single_pass.py +7 -6
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46c_import_graph.py +17 -2
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46f_packaging_release.py +6 -3
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47a_grid_adapter.py +9 -2
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47c_grid_parity.py +9 -2
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47d_grid_optimizer.py +9 -2
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48a_release_surfaces.py +18 -5
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48f_release_gate.py +3 -3
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase50_nested_mode1_causal.py +3 -0
- quantbt_engine-1.1.0/tests/test_phase55a_native_distribution.py +183 -0
- quantbt_engine-1.1.0/tests/test_phase55b_public_release.py +170 -0
- quantbt_engine-1.1.0/tests/test_release_channel_policy.py +49 -0
- quantbt_engine-1.0.8/src/quantbt/core/native_event_capabilities.py +0 -121
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/LICENSE +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/MANIFEST.in +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/setup.cfg +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/_dependency.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/backend.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/instruments.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/options.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/reports.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_option.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_portfolio.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_vectorized.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backtester.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/compare_phase9_parity.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/gamma_scalping_backtestsample.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/profile_phase7.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_arbitrage_phase_e.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_optimization_overhead.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_options_engine.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_pct_equity_nautilus_smoke.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase12_arbitrage_cert.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase12_benchmark_nautilus_cert.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase13_portfolio_report.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase13_wfo_cache.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase14_service_loop.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase15a_nautilus_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase15b_synthetic_depth.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase16_performance_debt.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase30e_reactive_runner.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase31_intrabar.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34a_native_event_memory.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34b_native_event_prepared_score.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34c_native_event_single_pass.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase49b_wfo_performance.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase7.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_portfolio_real_parity.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/arbitrage.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/basket.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/constraints.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/engine.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/execution_depth.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_kernel.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_reference.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_session.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/market_tape.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/order_compiler.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/orders.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/portfolio.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/preprocessor.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/results.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/schema.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/scopes.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/structured_orders.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/types.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/vectorized.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/options_analytics.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/performance.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/callbacks.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/candidate_selection.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/config.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/constraints.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluator.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/arbitrage.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/generic.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/grid_dca.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/intrabar.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/native_event.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/options.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/portfolio.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/signal.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/multiseed.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/objectives.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/optimizer.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/result.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/samplers.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/space.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/cache.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/conventions.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/data.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/execution.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/fees.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/greeks.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/hedging.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/iv.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/ledger.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/lifecycle.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/margin.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/packages.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/pricing.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/schema.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/selectors.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/strategy.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/surface.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/tape.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/templates/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/templates/packages.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/portfolio.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/py.typed +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/arbitrage_audit.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_bundle.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_diagnostics.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/parity.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/portfolio_audit.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/portfolio_nautilus.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/fast.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/modes.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/__init__.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/plots.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/themes.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/walkforward.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/dependency_links.txt +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/top_level.txt +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_endpoint.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_metrics_intraday_scope.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_core.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_evaluators.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_integration.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_phase33b.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_samplers.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_pct_equity_nautilus_smoke.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase0_baseline.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_native_portfolio_backend.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_native_portfolio_full_surface.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_engine_spec.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_institutional_scenarios.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_nautilus_validation.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_real_parity_script.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase12_arbitrage_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase12_benchmark_nautilus_cert.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase13_arbitrage_certification_cleanup.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase13_portfolio_report_parity.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase14_service_loop_benchmark.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase14c_prepared_report_levels.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase15a_nautilus_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase15b_synthetic_depth.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase16_prepared_service_context.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase1_schema.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase2_native_vectorized.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30a_native_event_lifecycle_contract.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30b_native_event_lifecycle_kernel.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30c_native_event_endpoint_lifecycle.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30d_native_event_reactive_runner.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30e_native_event_incremental_runner.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31_merge_blockers.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31a_execution_correctness_contract.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31b_market_tape_intrabar_oracle.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31c_intrabar_kernel.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31d_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31h_intrabar_session_reference.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34a_native_event_artifacts.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34b_native_event_prepared_score.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase3_native_event.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase42_packaging_layout.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase42c_ci_release.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase45a_source_tree_sync.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase45d_native_event_zero_object.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46a_correctness_certification.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46b_score_rss.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48b_release_hygiene.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48c_event_driven_facade.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase49a_walkforward_schedules.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase49b_wfo_performance.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase4_basket.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_1_nautilus_report_bundle.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_arbitrage_audit.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_institutional_simulations.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_portfolio_audit.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_debt_domain_validation.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_endpoint_depth.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_nautilus_depth.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_nautilus_adapter.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase6_public_api.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase7_benchmark_suite.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_a.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_b.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_c.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_d.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_e.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_f.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_g.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_h.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase9_performance_parity.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_pre48e_native_event_fast_paths.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_real.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_real_endpoints.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_shared_quantity_constraints.py +0 -0
- {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_walkforward_phase1.py +0 -0
|
@@ -2,6 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `quantbt-engine` are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.1.0] - Unreleased
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Renamed the governed public release line to `1.1.0` and synchronized package
|
|
10
|
+
metadata, runtime version, generated core/native contracts, lockfile, and
|
|
11
|
+
release documentation.
|
|
12
|
+
- Prepared the governed public `quantbt-native==0.4.1` companion contract for
|
|
13
|
+
Linux x86_64 / CPython 3.11-3.13. The core declares an exact,
|
|
14
|
+
platform-marked dependency; unsupported platforms keep Python/Numba.
|
|
15
|
+
- Added a native-first, wheel-only manylinux OIDC release workflow and a six-row
|
|
16
|
+
Ubuntu 22.04/24.04 Poetry consumer proof. The core release preflights the
|
|
17
|
+
matching public native artifact before it can publish.
|
|
18
|
+
- Kept public release certification self-contained by excluding private,
|
|
19
|
+
out-of-tree Grid integration fixtures from its test shard profile.
|
|
20
|
+
- Updated release, install, capability, troubleshooting, and handoff docs to
|
|
21
|
+
state that supported users receive a pre-built wheel rather than compiling
|
|
22
|
+
Rust locally.
|
|
23
|
+
|
|
24
|
+
### Compatibility
|
|
25
|
+
|
|
26
|
+
- No endpoint signature, execution policy, promotion threshold, or domain
|
|
27
|
+
accounting behavior changes in this packaging-only phase.
|
|
28
|
+
|
|
29
|
+
## [1.0.9] - 2026-08-21
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Direct PyPI discovery and installation guidance in the repository README.
|
|
34
|
+
- Release-preparation guidance for the governed Rust-first routes, exact
|
|
35
|
+
installed-wheel certification, and the matching core/native compatibility
|
|
36
|
+
contract.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- Promoted the bounded Rust-first public policy for certified static command
|
|
41
|
+
tapes, Native Strategy IR, batch, and causal-fold workloads while preserving
|
|
42
|
+
Python authority for callbacks, reactive strategies, generic portfolio,
|
|
43
|
+
basket, arbitrage, and options routes.
|
|
44
|
+
- Updated the core product registry to the `1.0.9` release line. The staged
|
|
45
|
+
`quantbt-native` companion remains unpublished and capability-gated.
|
|
46
|
+
|
|
47
|
+
### Verification
|
|
48
|
+
|
|
49
|
+
- Source-mirror, generated-product-contract, documentation-link, build, and
|
|
50
|
+
installed-wheel release checks are required from the final tagged commit.
|
|
51
|
+
|
|
5
52
|
## [1.0.8] - 2026-08-12
|
|
6
53
|
|
|
7
54
|
### Changed
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantbt-engine
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Transparent, high-performance quantitative backtesting engine
|
|
5
5
|
Author-email: Vu Cong Minh <vugioan11022002@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/BobbyAxerol/quantbt
|
|
8
|
+
Project-URL: PyPI, https://pypi.org/project/quantbt-engine/
|
|
8
9
|
Project-URL: Repository, https://github.com/BobbyAxerol/quantbt
|
|
9
10
|
Project-URL: Issues, https://github.com/BobbyAxerol/quantbt/issues
|
|
10
11
|
Project-URL: Documentation, https://github.com/BobbyAxerol/quantbt/tree/main/docs
|
|
@@ -26,6 +27,7 @@ License-File: LICENSE
|
|
|
26
27
|
Requires-Dist: numpy<2.3,>=2.2.6
|
|
27
28
|
Requires-Dist: pandas<2.4,>=2.3.3
|
|
28
29
|
Requires-Dist: numba<0.66,>=0.65.1
|
|
30
|
+
Requires-Dist: quantbt-native==0.4.1; sys_platform == "linux" and platform_machine == "x86_64" and implementation_name == "cpython" and python_version >= "3.11" and python_version < "3.14"
|
|
29
31
|
Provides-Extra: optimization
|
|
30
32
|
Requires-Dist: optuna<4.9,>=4.8.0; extra == "optimization"
|
|
31
33
|
Requires-Dist: arch<8.1,>=8.0.0; extra == "optimization"
|
|
@@ -51,6 +53,7 @@ Dynamic: license-file
|
|
|
51
53
|
# QuantBT
|
|
52
54
|
|
|
53
55
|

|
|
56
|
+
[](https://pypi.org/project/quantbt-engine/)
|
|
54
57
|

|
|
55
58
|

|
|
56
59
|

|
|
@@ -68,6 +71,10 @@ The goal is simple: make alpha research fast enough for iteration, strict
|
|
|
68
71
|
enough for institutional-style review, and readable enough that stakeholders can
|
|
69
72
|
audit how a result was produced.
|
|
70
73
|
|
|
74
|
+
QuantBT is published on [PyPI as `quantbt-engine`](https://pypi.org/project/quantbt-engine/).
|
|
75
|
+
Install the current public release with `pip install --upgrade quantbt-engine`;
|
|
76
|
+
the import remains `from quantbt import QuantBTEndpoint`.
|
|
77
|
+
|
|
71
78
|
Current portfolio status: `native_portfolio` is the default multi-symbol
|
|
72
79
|
backend. It supports long/short, market-neutral, directional, equal-weight,
|
|
73
80
|
risk-parity, and beta-neutral portfolio modes, with live-equity sizing and
|
|
@@ -79,7 +86,7 @@ historical reproduction.
|
|
|
79
86
|
- One public API for notebooks, services, portfolio research, and validation.
|
|
80
87
|
- Native vectorized engines for fast sweeps and large parameter grids.
|
|
81
88
|
- Native event-driven engines for market/limit orders, fills, baskets, and
|
|
82
|
-
|
|
89
|
+
package execution, with Rust auto-promotion limited to certified workloads.
|
|
83
90
|
- Prepared service contexts for repeated signal/portfolio replays on the same
|
|
84
91
|
market tape without re-normalizing pandas data each run.
|
|
85
92
|
- Native portfolio engine with target weights, target notionals, target units,
|
|
@@ -115,6 +122,7 @@ bt = QuantBTEndpoint.event_driven(
|
|
|
115
122
|
input_mode="strategy", # strategy | orders
|
|
116
123
|
profile="research", # research | optimize | audit
|
|
117
124
|
backend="auto", # auto | python | rust
|
|
125
|
+
execution_contract="event_lifecycle_v3_next_open",
|
|
118
126
|
initial_capital=20_000,
|
|
119
127
|
leverage=5,
|
|
120
128
|
fee_rate=0.0005, # one-way fee per fill
|
|
@@ -133,6 +141,21 @@ event artifacts. For an upstream order planner, switch to
|
|
|
133
141
|
backend follows the release policy; `rust` is an explicit request for the
|
|
134
142
|
optional capability-gated native wheel.
|
|
135
143
|
|
|
144
|
+
An arbitrary `strategy=...` callback remains a Python-authoritative route,
|
|
145
|
+
including when `backend="auto"` and a local native wheel is installed. The
|
|
146
|
+
current automatic Rust routes are a pre-built static V2/V3 command tape with
|
|
147
|
+
at least 10,000 bars, or a bounded `NativeStrategyIR` request with at least
|
|
148
|
+
2,000 bars. Inspect `result.metadata["native_event_promotion_v1"]` to see the
|
|
149
|
+
resolved backend, threshold, policy rule, and fallback reason for every run.
|
|
150
|
+
|
|
151
|
+
The compatibility default is the frozen
|
|
152
|
+
`event_lifecycle_v2_next_bar_close` behavior. Select
|
|
153
|
+
`event_lifecycle_v3_next_open` for real next-open market fills, favorable
|
|
154
|
+
limit-gap improvement, adverse stop-gap execution, and conservative flagged
|
|
155
|
+
stop-limit ambiguity. V3 requires an `open` column and is parity-tested across
|
|
156
|
+
the Python and Rust backends. The machine-readable registry and audit fields
|
|
157
|
+
are documented in [Native Event Contract Registry](docs/contracts/contract_registry.md).
|
|
158
|
+
|
|
136
159
|
The strategy owns signal generation and look-ahead control. QuantBT owns the
|
|
137
160
|
causal order lifecycle and accounting. Advanced users can still call
|
|
138
161
|
`native_event_strategy(...)` or `native_event_lifecycle(...)` directly when a
|
|
@@ -270,7 +293,71 @@ selection semantics inside `walkforward.py`. Read
|
|
|
270
293
|
`benchmarks/results/optimization_overhead.md` for signal, intrabar, portfolio,
|
|
271
294
|
arbitrage/grid/options fallback examples and benchmark details.
|
|
272
295
|
|
|
273
|
-
###
|
|
296
|
+
### Current governed Rust routes and benchmark evidence
|
|
297
|
+
|
|
298
|
+
Rust is execution-authoritative only where the public request, accounting
|
|
299
|
+
contract, installed-wheel parity corpus, and promotion policy have all been
|
|
300
|
+
certified. The generated Stage-B policy has this deliberately narrow scope:
|
|
301
|
+
|
|
302
|
+
| Route | Rust behavior with a matching companion | Public default elsewhere |
|
|
303
|
+
|---|---|---|
|
|
304
|
+
| Static V2/V3 `OrderCommand` tape | `auto` at 10,000+ bars | Python |
|
|
305
|
+
| Bounded Native Strategy IR, batch, causal-fold scorer | `auto` at 2,000+ bars | Python |
|
|
306
|
+
| `run_portfolio_target_market(...)` | explicit Rust helper | no generic endpoint promotion |
|
|
307
|
+
| `run_atomic_package_market(...)` | explicit Rust helper | no generic endpoint promotion |
|
|
308
|
+
| Python callback/reactive, generic portfolio/basket/arbitrage/options | not promoted | Python |
|
|
309
|
+
|
|
310
|
+
The bounded Rust strategy IR covers precomputed signal targets, structural
|
|
311
|
+
Grid levels, periodic DCA, and fixed bracket/OCO transitions. Python callbacks,
|
|
312
|
+
reactive strategies, and generic portfolio/package/arbitrage execution remain
|
|
313
|
+
Python compatibility routes by design.
|
|
314
|
+
|
|
315
|
+
Phase 54B.3 also certifies two intentionally explicit Rust helpers,
|
|
316
|
+
`run_portfolio_target_market(...)` and `run_atomic_package_market(...)`, for
|
|
317
|
+
linear quote-settled gross-cross `target_units` and one ordered same-bar
|
|
318
|
+
all-or-none market package respectively. They do not change generic endpoint
|
|
319
|
+
routing or claim venue-native multi-leg execution; the bounded contract,
|
|
320
|
+
parity corpus, and benchmark evidence are documented in
|
|
321
|
+
[`docs/native_event_rust_full_contract.md`](docs/native_event_rust_full_contract.md).
|
|
322
|
+
On the governed 2,000-bar x 8-symbol fixture, their Rust score paths measured
|
|
323
|
+
3.594 ms (556,551 bars/s) for target units and 3.512 ms (569,514 bars/s) for
|
|
324
|
+
the atomic package, versus Python event-oracle score paths of 33.493 ms and
|
|
325
|
+
19.735 ms respectively. These are bounded direct-route measurements; audit
|
|
326
|
+
report adaptation is intentionally timed and reported separately.
|
|
327
|
+
|
|
328
|
+
The local five-repeat public-route evidence below passed exact Python/Rust
|
|
329
|
+
canonical-trace and accounting parity before timing. It is deliberately not a
|
|
330
|
+
universal Rust speed claim: static public facade time is dominated by common
|
|
331
|
+
Python preparation/report adaptation, while typed IR score and shared batch
|
|
332
|
+
avoid those per-scenario costs.
|
|
333
|
+
|
|
334
|
+
| Workload | Bars | Rust median | Rust throughput | Python median | Python throughput |
|
|
335
|
+
|---|---:|---:|---:|---:|---:|
|
|
336
|
+
| Static public compact | 10,000 | 63.612 ms | 157,203 bars/s | 53.606 ms | 186,545 bars/s |
|
|
337
|
+
| Static public audit | 10,000 | 6.024 s | 1,660 bars/s | 5.924 s | 1,688 bars/s |
|
|
338
|
+
| Native IR score | 2,000 | 0.741 ms | 2.70M bars/s | 31.565 ms | 63,361 bars/s |
|
|
339
|
+
| Native IR batch, 64 scenarios | 128,000 | 11.379 ms | 11.25M bars/s | - | - |
|
|
340
|
+
| Native IR causal fold, 64 scenarios | 64,000 | 7.386 ms | 8.67M bars/s | - | - |
|
|
341
|
+
|
|
342
|
+
The Rust IR score has one boundary call, zero Python callbacks, and no audit
|
|
343
|
+
replay. Batch/fold execution has one boundary call and zero prepared-market
|
|
344
|
+
copies per scenario; its repeated-run RSS delta was 8-16 KiB on this host. An
|
|
345
|
+
audit result is intentionally a cold reporting path: its typed Rust output is
|
|
346
|
+
adapted to the normal `BacktestResultV2` without rerunning execution. Full
|
|
347
|
+
evidence is in
|
|
348
|
+
[`phase54b2/public_routes.md`](benchmarks/native_event/results/phase54b2/public_routes.md)
|
|
349
|
+
and the support boundary is in
|
|
350
|
+
[`docs/native_strategy_ir.md`](docs/native_strategy_ir.md).
|
|
351
|
+
|
|
352
|
+
Phase 54B.4 adds an installed-wheel release gate, rather than a new speed
|
|
353
|
+
claim. It proves clean core-only fallback, exact core/native-pair handshake,
|
|
354
|
+
promotion decisions, and Python/Rust accounting parity for every governed
|
|
355
|
+
route. The `1.1.0` / `quantbt-native==0.4.1` release pair adds a pre-built
|
|
356
|
+
Linux x86_64 CPython 3.11-3.13 companion; it is published native-first and
|
|
357
|
+
proved through a public Poetry consumer matrix. See the
|
|
358
|
+
[native release handoff](docs/migration/native_release_handoff.md).
|
|
359
|
+
|
|
360
|
+
### Historical Phase 46F package and dual-backend release evidence
|
|
274
361
|
|
|
275
362
|
The core distribution is packaged as `quantbt-engine` and imports as
|
|
276
363
|
`quantbt`. Its release gate is independent from the optional experimental Rust
|
|
@@ -278,9 +365,9 @@ wheel:
|
|
|
278
365
|
|
|
279
366
|
| Release artifact | Current status | Backend policy |
|
|
280
367
|
|---|---|---|
|
|
281
|
-
| `quantbt-engine
|
|
282
|
-
| `quantbt-native` PyO3 wheel |
|
|
283
|
-
| `quantbt-engine[native]` |
|
|
368
|
+
| `quantbt-engine` wheel/sdist | governed core release | all existing endpoints remain available |
|
|
369
|
+
| `quantbt-native` PyO3 wheel | exact Linux x86_64 CPython 3.11-3.13 companion | Stage-B `auto` only for certified static/IR/batch rows |
|
|
370
|
+
| `quantbt-engine[native]` | compatibility alias | matching companion is a direct platform dependency |
|
|
284
371
|
|
|
285
372
|
The committed Phase 46F rerun compares the same prepared static tape and keeps
|
|
286
373
|
Python/Rust accounting parity at 100%:
|
|
@@ -352,8 +439,9 @@ and a SHA256 release manifest. The TestPyPI workflow is manual and OIDC
|
|
|
352
439
|
protected; it must be run with an unused matching RC version/tag and reviewed
|
|
353
440
|
before production PyPI publication. See
|
|
354
441
|
[`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
|
|
355
|
-
`
|
|
356
|
-
|
|
442
|
+
This historical `1.0.8` release evidence intentionally excluded
|
|
443
|
+
`quantbt-native`; `auto` remained Python and explicit Rust remained
|
|
444
|
+
capability-gated.
|
|
357
445
|
|
|
358
446
|
### Phase 48C stable event-driven facade evidence
|
|
359
447
|
|
|
@@ -387,7 +475,10 @@ The release workflow is documented in
|
|
|
387
475
|
[`docs/release_packaging.md`](docs/release_packaging.md): build and inspect
|
|
388
476
|
wheel/sdist, run clean-install and `pip check`, publish an RC to TestPyPI with
|
|
389
477
|
OIDC, then publish the final core package through the protected PyPI
|
|
390
|
-
environment. The
|
|
478
|
+
environment. The native companion scope, rollback controls, and installed-wheel
|
|
479
|
+
certification handoff are in
|
|
480
|
+
[`docs/migration/native_release_handoff.md`](docs/migration/native_release_handoff.md).
|
|
481
|
+
The exact handoff fields and artifact-hash procedure are in
|
|
391
482
|
[`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
|
|
392
483
|
No long-lived token is required. Native optimization remains an
|
|
393
484
|
open, domain-preserving roadmap for portfolio, arbitrage, options, vectorized,
|
|
@@ -455,8 +546,10 @@ Phase 48E also reduced the static explicit Rust score to `0.000302s`
|
|
|
455
546
|
scalar Rust output contract and prepared command-tape reuse, so they are
|
|
456
547
|
reported separately from callback execution. Rust and Python fingerprints,
|
|
457
548
|
fees, positions, fills, events, rejection counters, and final equity passed.
|
|
458
|
-
|
|
459
|
-
|
|
549
|
+
At Phase 48E this historical benchmark had `auto` pinned to Python. The later
|
|
550
|
+
Phase 54B.2 local Stage-B policy promotes only the certified static/IR/batch
|
|
551
|
+
rows documented above; `[native]` remains empty until a public native-wheel
|
|
552
|
+
matrix is clean-install certified.
|
|
460
553
|
|
|
461
554
|
### Phase 48E.1 native production-closure evidence
|
|
462
555
|
|
|
@@ -487,9 +580,12 @@ facade; it is not a universal Rust speed claim.
|
|
|
487
580
|
|
|
488
581
|
Phase 48E.1 also locks typed API 0.4 step results, count-only score sinks,
|
|
489
582
|
reusable SoA audit buffers, separate command/lifecycle/fill reports, compact
|
|
490
|
-
validated Rust order state, and reset/
|
|
491
|
-
the
|
|
492
|
-
|
|
583
|
+
validated Rust order state, and reset/lifecycle parity. This paragraph records
|
|
584
|
+
the historical pre-promotion state; the current Stage-B policy is the bounded
|
|
585
|
+
static/IR/batch policy above. The `native` extra remains a compatibility alias;
|
|
586
|
+
Phase 55A instead prepares a direct, platform-marked dependency for the
|
|
587
|
+
CPython 3.11/3.12/3.13 Linux x86_64 wheel matrix. It becomes public only after
|
|
588
|
+
the Phase 55B clean-install workflow passes.
|
|
493
589
|
|
|
494
590
|
Ecosystem positioning:
|
|
495
591
|
|
|
@@ -654,13 +750,13 @@ fills, positions, account state, and performance report.
|
|
|
654
750
|
Install the released core package:
|
|
655
751
|
|
|
656
752
|
```bash
|
|
657
|
-
pip install quantbt-engine
|
|
753
|
+
pip install --upgrade quantbt-engine
|
|
658
754
|
```
|
|
659
755
|
|
|
660
756
|
Optional optimization, reports, and third-party validation:
|
|
661
757
|
|
|
662
758
|
```bash
|
|
663
|
-
pip install "quantbt-engine[optimization,reports,validation]
|
|
759
|
+
pip install --upgrade "quantbt-engine[optimization,reports,validation]"
|
|
664
760
|
```
|
|
665
761
|
|
|
666
762
|
Walk-forward parameter search specifically requires the `optimization` extra.
|
|
@@ -690,9 +786,12 @@ feature is under development:
|
|
|
690
786
|
pip install -e /root/bobby/pool_alpha/quantbt
|
|
691
787
|
```
|
|
692
788
|
|
|
693
|
-
|
|
694
|
-
`pip install quantbt-engine==1.0
|
|
695
|
-
`from quantbt import QuantBTEndpoint`.
|
|
789
|
+
For reproducible deployments, pin the governed release, for example
|
|
790
|
+
`pip install quantbt-engine==1.1.0`, and keep the unchanged import
|
|
791
|
+
`from quantbt import QuantBTEndpoint`. On supported Linux, the exact pre-built
|
|
792
|
+
native companion resolves automatically; it does not require a new import or
|
|
793
|
+
endpoint API. The release order and Poetry proof are in the
|
|
794
|
+
[TestPyPI release checklist](docs/testpypi_release_checklist.md).
|
|
696
795
|
|
|
697
796
|
## Quick Start
|
|
698
797
|
|
|
@@ -898,6 +997,11 @@ backend, endpoint, or strategy route to use.
|
|
|
898
997
|
| Pair, basket, hedge-ratio package behavior | [Pair and basket guide](docs/pair_basket_guide.md) |
|
|
899
998
|
| Causal WFO schedules, outer-OOS claims, and audit metadata | [Causal WFO guide](docs/walkforward_causal.md) |
|
|
900
999
|
| Walk-forward methodology and anti-leakage scoring | [Walk-forward methodology](docs/walkforward_methodology_vi.md) |
|
|
1000
|
+
| Opt-in Rust strategy templates, batch scoring, and causal OOS batch folds | [Native strategy IR and batch](docs/native_strategy_ir.md) |
|
|
1001
|
+
| Python/Rust plan ownership and backend routing | [Execution-plan architecture](docs/architecture/execution-plan.md) |
|
|
1002
|
+
| Exact staged core/native pair and maturity matrix | [Generated native compatibility](docs/contracts/generated_product_compatibility.md) |
|
|
1003
|
+
| Build, clean-install, and verify local native wheels | [Native companion installation](docs/native/install.md) |
|
|
1004
|
+
| Workload-scoped benchmark methodology | [Benchmarking governance](docs/performance/benchmarking.md) |
|
|
901
1005
|
| Runnable smoke templates | [Examples index](examples/README.md) |
|
|
902
1006
|
|
|
903
1007
|
Key examples:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# QuantBT
|
|
2
2
|
|
|
3
3
|

|
|
4
|
+
[](https://pypi.org/project/quantbt-engine/)
|
|
4
5
|

|
|
5
6
|

|
|
6
7
|

|
|
@@ -18,6 +19,10 @@ The goal is simple: make alpha research fast enough for iteration, strict
|
|
|
18
19
|
enough for institutional-style review, and readable enough that stakeholders can
|
|
19
20
|
audit how a result was produced.
|
|
20
21
|
|
|
22
|
+
QuantBT is published on [PyPI as `quantbt-engine`](https://pypi.org/project/quantbt-engine/).
|
|
23
|
+
Install the current public release with `pip install --upgrade quantbt-engine`;
|
|
24
|
+
the import remains `from quantbt import QuantBTEndpoint`.
|
|
25
|
+
|
|
21
26
|
Current portfolio status: `native_portfolio` is the default multi-symbol
|
|
22
27
|
backend. It supports long/short, market-neutral, directional, equal-weight,
|
|
23
28
|
risk-parity, and beta-neutral portfolio modes, with live-equity sizing and
|
|
@@ -29,7 +34,7 @@ historical reproduction.
|
|
|
29
34
|
- One public API for notebooks, services, portfolio research, and validation.
|
|
30
35
|
- Native vectorized engines for fast sweeps and large parameter grids.
|
|
31
36
|
- Native event-driven engines for market/limit orders, fills, baskets, and
|
|
32
|
-
|
|
37
|
+
package execution, with Rust auto-promotion limited to certified workloads.
|
|
33
38
|
- Prepared service contexts for repeated signal/portfolio replays on the same
|
|
34
39
|
market tape without re-normalizing pandas data each run.
|
|
35
40
|
- Native portfolio engine with target weights, target notionals, target units,
|
|
@@ -65,6 +70,7 @@ bt = QuantBTEndpoint.event_driven(
|
|
|
65
70
|
input_mode="strategy", # strategy | orders
|
|
66
71
|
profile="research", # research | optimize | audit
|
|
67
72
|
backend="auto", # auto | python | rust
|
|
73
|
+
execution_contract="event_lifecycle_v3_next_open",
|
|
68
74
|
initial_capital=20_000,
|
|
69
75
|
leverage=5,
|
|
70
76
|
fee_rate=0.0005, # one-way fee per fill
|
|
@@ -83,6 +89,21 @@ event artifacts. For an upstream order planner, switch to
|
|
|
83
89
|
backend follows the release policy; `rust` is an explicit request for the
|
|
84
90
|
optional capability-gated native wheel.
|
|
85
91
|
|
|
92
|
+
An arbitrary `strategy=...` callback remains a Python-authoritative route,
|
|
93
|
+
including when `backend="auto"` and a local native wheel is installed. The
|
|
94
|
+
current automatic Rust routes are a pre-built static V2/V3 command tape with
|
|
95
|
+
at least 10,000 bars, or a bounded `NativeStrategyIR` request with at least
|
|
96
|
+
2,000 bars. Inspect `result.metadata["native_event_promotion_v1"]` to see the
|
|
97
|
+
resolved backend, threshold, policy rule, and fallback reason for every run.
|
|
98
|
+
|
|
99
|
+
The compatibility default is the frozen
|
|
100
|
+
`event_lifecycle_v2_next_bar_close` behavior. Select
|
|
101
|
+
`event_lifecycle_v3_next_open` for real next-open market fills, favorable
|
|
102
|
+
limit-gap improvement, adverse stop-gap execution, and conservative flagged
|
|
103
|
+
stop-limit ambiguity. V3 requires an `open` column and is parity-tested across
|
|
104
|
+
the Python and Rust backends. The machine-readable registry and audit fields
|
|
105
|
+
are documented in [Native Event Contract Registry](docs/contracts/contract_registry.md).
|
|
106
|
+
|
|
86
107
|
The strategy owns signal generation and look-ahead control. QuantBT owns the
|
|
87
108
|
causal order lifecycle and accounting. Advanced users can still call
|
|
88
109
|
`native_event_strategy(...)` or `native_event_lifecycle(...)` directly when a
|
|
@@ -220,7 +241,71 @@ selection semantics inside `walkforward.py`. Read
|
|
|
220
241
|
`benchmarks/results/optimization_overhead.md` for signal, intrabar, portfolio,
|
|
221
242
|
arbitrage/grid/options fallback examples and benchmark details.
|
|
222
243
|
|
|
223
|
-
###
|
|
244
|
+
### Current governed Rust routes and benchmark evidence
|
|
245
|
+
|
|
246
|
+
Rust is execution-authoritative only where the public request, accounting
|
|
247
|
+
contract, installed-wheel parity corpus, and promotion policy have all been
|
|
248
|
+
certified. The generated Stage-B policy has this deliberately narrow scope:
|
|
249
|
+
|
|
250
|
+
| Route | Rust behavior with a matching companion | Public default elsewhere |
|
|
251
|
+
|---|---|---|
|
|
252
|
+
| Static V2/V3 `OrderCommand` tape | `auto` at 10,000+ bars | Python |
|
|
253
|
+
| Bounded Native Strategy IR, batch, causal-fold scorer | `auto` at 2,000+ bars | Python |
|
|
254
|
+
| `run_portfolio_target_market(...)` | explicit Rust helper | no generic endpoint promotion |
|
|
255
|
+
| `run_atomic_package_market(...)` | explicit Rust helper | no generic endpoint promotion |
|
|
256
|
+
| Python callback/reactive, generic portfolio/basket/arbitrage/options | not promoted | Python |
|
|
257
|
+
|
|
258
|
+
The bounded Rust strategy IR covers precomputed signal targets, structural
|
|
259
|
+
Grid levels, periodic DCA, and fixed bracket/OCO transitions. Python callbacks,
|
|
260
|
+
reactive strategies, and generic portfolio/package/arbitrage execution remain
|
|
261
|
+
Python compatibility routes by design.
|
|
262
|
+
|
|
263
|
+
Phase 54B.3 also certifies two intentionally explicit Rust helpers,
|
|
264
|
+
`run_portfolio_target_market(...)` and `run_atomic_package_market(...)`, for
|
|
265
|
+
linear quote-settled gross-cross `target_units` and one ordered same-bar
|
|
266
|
+
all-or-none market package respectively. They do not change generic endpoint
|
|
267
|
+
routing or claim venue-native multi-leg execution; the bounded contract,
|
|
268
|
+
parity corpus, and benchmark evidence are documented in
|
|
269
|
+
[`docs/native_event_rust_full_contract.md`](docs/native_event_rust_full_contract.md).
|
|
270
|
+
On the governed 2,000-bar x 8-symbol fixture, their Rust score paths measured
|
|
271
|
+
3.594 ms (556,551 bars/s) for target units and 3.512 ms (569,514 bars/s) for
|
|
272
|
+
the atomic package, versus Python event-oracle score paths of 33.493 ms and
|
|
273
|
+
19.735 ms respectively. These are bounded direct-route measurements; audit
|
|
274
|
+
report adaptation is intentionally timed and reported separately.
|
|
275
|
+
|
|
276
|
+
The local five-repeat public-route evidence below passed exact Python/Rust
|
|
277
|
+
canonical-trace and accounting parity before timing. It is deliberately not a
|
|
278
|
+
universal Rust speed claim: static public facade time is dominated by common
|
|
279
|
+
Python preparation/report adaptation, while typed IR score and shared batch
|
|
280
|
+
avoid those per-scenario costs.
|
|
281
|
+
|
|
282
|
+
| Workload | Bars | Rust median | Rust throughput | Python median | Python throughput |
|
|
283
|
+
|---|---:|---:|---:|---:|---:|
|
|
284
|
+
| Static public compact | 10,000 | 63.612 ms | 157,203 bars/s | 53.606 ms | 186,545 bars/s |
|
|
285
|
+
| Static public audit | 10,000 | 6.024 s | 1,660 bars/s | 5.924 s | 1,688 bars/s |
|
|
286
|
+
| Native IR score | 2,000 | 0.741 ms | 2.70M bars/s | 31.565 ms | 63,361 bars/s |
|
|
287
|
+
| Native IR batch, 64 scenarios | 128,000 | 11.379 ms | 11.25M bars/s | - | - |
|
|
288
|
+
| Native IR causal fold, 64 scenarios | 64,000 | 7.386 ms | 8.67M bars/s | - | - |
|
|
289
|
+
|
|
290
|
+
The Rust IR score has one boundary call, zero Python callbacks, and no audit
|
|
291
|
+
replay. Batch/fold execution has one boundary call and zero prepared-market
|
|
292
|
+
copies per scenario; its repeated-run RSS delta was 8-16 KiB on this host. An
|
|
293
|
+
audit result is intentionally a cold reporting path: its typed Rust output is
|
|
294
|
+
adapted to the normal `BacktestResultV2` without rerunning execution. Full
|
|
295
|
+
evidence is in
|
|
296
|
+
[`phase54b2/public_routes.md`](benchmarks/native_event/results/phase54b2/public_routes.md)
|
|
297
|
+
and the support boundary is in
|
|
298
|
+
[`docs/native_strategy_ir.md`](docs/native_strategy_ir.md).
|
|
299
|
+
|
|
300
|
+
Phase 54B.4 adds an installed-wheel release gate, rather than a new speed
|
|
301
|
+
claim. It proves clean core-only fallback, exact core/native-pair handshake,
|
|
302
|
+
promotion decisions, and Python/Rust accounting parity for every governed
|
|
303
|
+
route. The `1.1.0` / `quantbt-native==0.4.1` release pair adds a pre-built
|
|
304
|
+
Linux x86_64 CPython 3.11-3.13 companion; it is published native-first and
|
|
305
|
+
proved through a public Poetry consumer matrix. See the
|
|
306
|
+
[native release handoff](docs/migration/native_release_handoff.md).
|
|
307
|
+
|
|
308
|
+
### Historical Phase 46F package and dual-backend release evidence
|
|
224
309
|
|
|
225
310
|
The core distribution is packaged as `quantbt-engine` and imports as
|
|
226
311
|
`quantbt`. Its release gate is independent from the optional experimental Rust
|
|
@@ -228,9 +313,9 @@ wheel:
|
|
|
228
313
|
|
|
229
314
|
| Release artifact | Current status | Backend policy |
|
|
230
315
|
|---|---|---|
|
|
231
|
-
| `quantbt-engine
|
|
232
|
-
| `quantbt-native` PyO3 wheel |
|
|
233
|
-
| `quantbt-engine[native]` |
|
|
316
|
+
| `quantbt-engine` wheel/sdist | governed core release | all existing endpoints remain available |
|
|
317
|
+
| `quantbt-native` PyO3 wheel | exact Linux x86_64 CPython 3.11-3.13 companion | Stage-B `auto` only for certified static/IR/batch rows |
|
|
318
|
+
| `quantbt-engine[native]` | compatibility alias | matching companion is a direct platform dependency |
|
|
234
319
|
|
|
235
320
|
The committed Phase 46F rerun compares the same prepared static tape and keeps
|
|
236
321
|
Python/Rust accounting parity at 100%:
|
|
@@ -302,8 +387,9 @@ and a SHA256 release manifest. The TestPyPI workflow is manual and OIDC
|
|
|
302
387
|
protected; it must be run with an unused matching RC version/tag and reviewed
|
|
303
388
|
before production PyPI publication. See
|
|
304
389
|
[`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
|
|
305
|
-
`
|
|
306
|
-
|
|
390
|
+
This historical `1.0.8` release evidence intentionally excluded
|
|
391
|
+
`quantbt-native`; `auto` remained Python and explicit Rust remained
|
|
392
|
+
capability-gated.
|
|
307
393
|
|
|
308
394
|
### Phase 48C stable event-driven facade evidence
|
|
309
395
|
|
|
@@ -337,7 +423,10 @@ The release workflow is documented in
|
|
|
337
423
|
[`docs/release_packaging.md`](docs/release_packaging.md): build and inspect
|
|
338
424
|
wheel/sdist, run clean-install and `pip check`, publish an RC to TestPyPI with
|
|
339
425
|
OIDC, then publish the final core package through the protected PyPI
|
|
340
|
-
environment. The
|
|
426
|
+
environment. The native companion scope, rollback controls, and installed-wheel
|
|
427
|
+
certification handoff are in
|
|
428
|
+
[`docs/migration/native_release_handoff.md`](docs/migration/native_release_handoff.md).
|
|
429
|
+
The exact handoff fields and artifact-hash procedure are in
|
|
341
430
|
[`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
|
|
342
431
|
No long-lived token is required. Native optimization remains an
|
|
343
432
|
open, domain-preserving roadmap for portfolio, arbitrage, options, vectorized,
|
|
@@ -405,8 +494,10 @@ Phase 48E also reduced the static explicit Rust score to `0.000302s`
|
|
|
405
494
|
scalar Rust output contract and prepared command-tape reuse, so they are
|
|
406
495
|
reported separately from callback execution. Rust and Python fingerprints,
|
|
407
496
|
fees, positions, fills, events, rejection counters, and final equity passed.
|
|
408
|
-
|
|
409
|
-
|
|
497
|
+
At Phase 48E this historical benchmark had `auto` pinned to Python. The later
|
|
498
|
+
Phase 54B.2 local Stage-B policy promotes only the certified static/IR/batch
|
|
499
|
+
rows documented above; `[native]` remains empty until a public native-wheel
|
|
500
|
+
matrix is clean-install certified.
|
|
410
501
|
|
|
411
502
|
### Phase 48E.1 native production-closure evidence
|
|
412
503
|
|
|
@@ -437,9 +528,12 @@ facade; it is not a universal Rust speed claim.
|
|
|
437
528
|
|
|
438
529
|
Phase 48E.1 also locks typed API 0.4 step results, count-only score sinks,
|
|
439
530
|
reusable SoA audit buffers, separate command/lifecycle/fill reports, compact
|
|
440
|
-
validated Rust order state, and reset/
|
|
441
|
-
the
|
|
442
|
-
|
|
531
|
+
validated Rust order state, and reset/lifecycle parity. This paragraph records
|
|
532
|
+
the historical pre-promotion state; the current Stage-B policy is the bounded
|
|
533
|
+
static/IR/batch policy above. The `native` extra remains a compatibility alias;
|
|
534
|
+
Phase 55A instead prepares a direct, platform-marked dependency for the
|
|
535
|
+
CPython 3.11/3.12/3.13 Linux x86_64 wheel matrix. It becomes public only after
|
|
536
|
+
the Phase 55B clean-install workflow passes.
|
|
443
537
|
|
|
444
538
|
Ecosystem positioning:
|
|
445
539
|
|
|
@@ -604,13 +698,13 @@ fills, positions, account state, and performance report.
|
|
|
604
698
|
Install the released core package:
|
|
605
699
|
|
|
606
700
|
```bash
|
|
607
|
-
pip install quantbt-engine
|
|
701
|
+
pip install --upgrade quantbt-engine
|
|
608
702
|
```
|
|
609
703
|
|
|
610
704
|
Optional optimization, reports, and third-party validation:
|
|
611
705
|
|
|
612
706
|
```bash
|
|
613
|
-
pip install "quantbt-engine[optimization,reports,validation]
|
|
707
|
+
pip install --upgrade "quantbt-engine[optimization,reports,validation]"
|
|
614
708
|
```
|
|
615
709
|
|
|
616
710
|
Walk-forward parameter search specifically requires the `optimization` extra.
|
|
@@ -640,9 +734,12 @@ feature is under development:
|
|
|
640
734
|
pip install -e /root/bobby/pool_alpha/quantbt
|
|
641
735
|
```
|
|
642
736
|
|
|
643
|
-
|
|
644
|
-
`pip install quantbt-engine==1.0
|
|
645
|
-
`from quantbt import QuantBTEndpoint`.
|
|
737
|
+
For reproducible deployments, pin the governed release, for example
|
|
738
|
+
`pip install quantbt-engine==1.1.0`, and keep the unchanged import
|
|
739
|
+
`from quantbt import QuantBTEndpoint`. On supported Linux, the exact pre-built
|
|
740
|
+
native companion resolves automatically; it does not require a new import or
|
|
741
|
+
endpoint API. The release order and Poetry proof are in the
|
|
742
|
+
[TestPyPI release checklist](docs/testpypi_release_checklist.md).
|
|
646
743
|
|
|
647
744
|
## Quick Start
|
|
648
745
|
|
|
@@ -848,6 +945,11 @@ backend, endpoint, or strategy route to use.
|
|
|
848
945
|
| Pair, basket, hedge-ratio package behavior | [Pair and basket guide](docs/pair_basket_guide.md) |
|
|
849
946
|
| Causal WFO schedules, outer-OOS claims, and audit metadata | [Causal WFO guide](docs/walkforward_causal.md) |
|
|
850
947
|
| Walk-forward methodology and anti-leakage scoring | [Walk-forward methodology](docs/walkforward_methodology_vi.md) |
|
|
948
|
+
| Opt-in Rust strategy templates, batch scoring, and causal OOS batch folds | [Native strategy IR and batch](docs/native_strategy_ir.md) |
|
|
949
|
+
| Python/Rust plan ownership and backend routing | [Execution-plan architecture](docs/architecture/execution-plan.md) |
|
|
950
|
+
| Exact staged core/native pair and maturity matrix | [Generated native compatibility](docs/contracts/generated_product_compatibility.md) |
|
|
951
|
+
| Build, clean-install, and verify local native wheels | [Native companion installation](docs/native/install.md) |
|
|
952
|
+
| Workload-scoped benchmark methodology | [Benchmarking governance](docs/performance/benchmarking.md) |
|
|
851
953
|
| Runnable smoke templates | [Examples index](examples/README.md) |
|
|
852
954
|
|
|
853
955
|
Key examples:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quantbt-engine"
|
|
7
|
-
version = "1.0
|
|
7
|
+
version = "1.1.0"
|
|
8
8
|
description = "Transparent, high-performance quantitative backtesting engine"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.14"
|
|
@@ -36,6 +36,9 @@ dependencies = [
|
|
|
36
36
|
"numpy>=2.2.6,<2.3",
|
|
37
37
|
"pandas>=2.3.3,<2.4",
|
|
38
38
|
"numba>=0.65.1,<0.66",
|
|
39
|
+
# Supported Linux consumers receive a pre-built PyO3 companion. Other
|
|
40
|
+
# platforms retain the Python/Numba core without source compilation.
|
|
41
|
+
"quantbt-native==0.4.1; sys_platform == 'linux' and platform_machine == 'x86_64' and implementation_name == 'cpython' and python_version >= '3.11' and python_version < '3.14'",
|
|
39
42
|
]
|
|
40
43
|
|
|
41
44
|
[project.optional-dependencies]
|
|
@@ -54,9 +57,8 @@ viz = [
|
|
|
54
57
|
validation = [
|
|
55
58
|
"nautilus-trader>=1.230.0,<1.231; python_version >= '3.12'",
|
|
56
59
|
]
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
# manylinux wheel and clean-install gates.
|
|
60
|
+
# Backward-compatible extra name. The bounded native companion is a direct,
|
|
61
|
+
# platform-marked dependency on supported Linux, so this extra adds nothing.
|
|
60
62
|
native = []
|
|
61
63
|
all = [
|
|
62
64
|
"optuna>=4.8.0,<4.9",
|
|
@@ -70,6 +72,7 @@ all = [
|
|
|
70
72
|
|
|
71
73
|
[project.urls]
|
|
72
74
|
Homepage = "https://github.com/BobbyAxerol/quantbt"
|
|
75
|
+
PyPI = "https://pypi.org/project/quantbt-engine/"
|
|
73
76
|
Repository = "https://github.com/BobbyAxerol/quantbt"
|
|
74
77
|
Issues = "https://github.com/BobbyAxerol/quantbt/issues"
|
|
75
78
|
Documentation = "https://github.com/BobbyAxerol/quantbt/tree/main/docs"
|
|
@@ -99,3 +102,8 @@ python_files = ["test_*.py"]
|
|
|
99
102
|
|
|
100
103
|
[tool.uv]
|
|
101
104
|
package = true
|
|
105
|
+
|
|
106
|
+
[tool.uv.sources]
|
|
107
|
+
# Phase 55A lock/build source. This local override is never emitted into the
|
|
108
|
+
# public wheel metadata; consumers resolve the exact PyPI requirement above.
|
|
109
|
+
quantbt-native = { path = "rust/native_event" }
|