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.
Files changed (268) hide show
  1. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/CHANGELOG.md +47 -0
  2. {quantbt_engine-1.0.8/src/quantbt_engine.egg-info → quantbt_engine-1.1.0}/PKG-INFO +123 -19
  3. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/README.md +120 -18
  4. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/pyproject.toml +12 -4
  5. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/__init__.py +193 -1
  6. quantbt_engine-1.1.0/src/quantbt/api/__init__.py +5 -0
  7. quantbt_engine-1.1.0/src/quantbt/api/event_driven.py +223 -0
  8. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/__init__.py +20 -0
  9. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/_native_event_rust.py +802 -130
  10. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_event.py +1530 -163
  11. quantbt_engine-1.1.0/src/quantbt/backends/native_portfolio_package.py +335 -0
  12. quantbt_engine-1.1.0/src/quantbt/backends/native_strategy_ir.py +1152 -0
  13. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/__init__.py +122 -0
  14. quantbt_engine-1.1.0/src/quantbt/core/accounting_contracts.py +437 -0
  15. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/event.py +156 -3
  16. quantbt_engine-1.1.0/src/quantbt/core/event_contracts.py +387 -0
  17. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/execution_contract.py +34 -2
  18. quantbt_engine-1.1.0/src/quantbt/core/execution_trace.py +420 -0
  19. quantbt_engine-1.1.0/src/quantbt/core/generated_native_event_contracts.py +13 -0
  20. quantbt_engine-1.1.0/src/quantbt/core/generated_product_contracts.py +29 -0
  21. quantbt_engine-1.1.0/src/quantbt/core/instrument_contracts.py +275 -0
  22. quantbt_engine-1.1.0/src/quantbt/core/native_event_capabilities.py +139 -0
  23. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/native_event_parity.py +39 -5
  24. quantbt_engine-1.1.0/src/quantbt/core/native_event_promotion.py +615 -0
  25. quantbt_engine-1.1.0/src/quantbt/core/package_execution_contracts.py +223 -0
  26. quantbt_engine-1.1.0/src/quantbt/core/portfolio_execution_contracts.py +244 -0
  27. quantbt_engine-1.1.0/src/quantbt/core/product_contracts.py +179 -0
  28. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/reactive.py +23 -3
  29. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/endpoint.py +38 -0
  30. quantbt_engine-1.1.0/src/quantbt/engine_spi/__init__.py +48 -0
  31. quantbt_engine-1.1.0/src/quantbt/engine_spi/errors.py +4 -0
  32. quantbt_engine-1.1.0/src/quantbt/engine_spi/native_event.py +515 -0
  33. quantbt_engine-1.1.0/src/quantbt/engine_spi/protocol.py +71 -0
  34. quantbt_engine-1.1.0/src/quantbt/engine_spi/registry.py +26 -0
  35. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/engines.py +75 -17
  36. quantbt_engine-1.1.0/src/quantbt/errors.py +72 -0
  37. quantbt_engine-1.1.0/src/quantbt/planning/__init__.py +62 -0
  38. quantbt_engine-1.1.0/src/quantbt/planning/capabilities.py +68 -0
  39. quantbt_engine-1.1.0/src/quantbt/planning/fingerprints.py +44 -0
  40. quantbt_engine-1.1.0/src/quantbt/planning/models.py +265 -0
  41. quantbt_engine-1.1.0/src/quantbt/planning/output.py +91 -0
  42. quantbt_engine-1.1.0/src/quantbt/planning/resolve.py +162 -0
  43. quantbt_engine-1.1.0/src/quantbt/preparation/__init__.py +38 -0
  44. quantbt_engine-1.1.0/src/quantbt/preparation/cache.py +165 -0
  45. quantbt_engine-1.1.0/src/quantbt/preparation/models.py +193 -0
  46. quantbt_engine-1.1.0/src/quantbt/preparation/native_event.py +396 -0
  47. quantbt_engine-1.1.0/src/quantbt/preparation/native_execution.py +754 -0
  48. quantbt_engine-1.1.0/src/quantbt/results/__init__.py +21 -0
  49. quantbt_engine-1.1.0/src/quantbt/results/raw.py +158 -0
  50. quantbt_engine-1.1.0/src/quantbt/strategies/__init__.py +40 -0
  51. quantbt_engine-1.1.0/src/quantbt/strategies/commands.py +224 -0
  52. quantbt_engine-1.1.0/src/quantbt/strategies/context.py +195 -0
  53. quantbt_engine-1.1.0/src/quantbt/strategies/driver.py +147 -0
  54. quantbt_engine-1.1.0/src/quantbt/strategies/native_ir.py +455 -0
  55. quantbt_engine-1.1.0/src/quantbt/strategies/requirements.py +175 -0
  56. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0/src/quantbt_engine.egg-info}/PKG-INFO +123 -19
  57. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/SOURCES.txt +42 -0
  58. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/requires.txt +3 -0
  59. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34c_native_event_single_pass.py +7 -6
  60. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46c_import_graph.py +17 -2
  61. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46f_packaging_release.py +6 -3
  62. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47a_grid_adapter.py +9 -2
  63. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47c_grid_parity.py +9 -2
  64. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase47d_grid_optimizer.py +9 -2
  65. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48a_release_surfaces.py +18 -5
  66. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48f_release_gate.py +3 -3
  67. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase50_nested_mode1_causal.py +3 -0
  68. quantbt_engine-1.1.0/tests/test_phase55a_native_distribution.py +183 -0
  69. quantbt_engine-1.1.0/tests/test_phase55b_public_release.py +170 -0
  70. quantbt_engine-1.1.0/tests/test_release_channel_policy.py +49 -0
  71. quantbt_engine-1.0.8/src/quantbt/core/native_event_capabilities.py +0 -121
  72. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/LICENSE +0 -0
  73. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/MANIFEST.in +0 -0
  74. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/setup.cfg +0 -0
  75. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/__init__.py +0 -0
  76. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/__init__.py +0 -0
  77. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/_dependency.py +0 -0
  78. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/backend.py +0 -0
  79. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/instruments.py +0 -0
  80. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/options.py +0 -0
  81. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/adapters/nautilus/reports.py +0 -0
  82. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_option.py +0 -0
  83. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_portfolio.py +0 -0
  84. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backends/native_vectorized.py +0 -0
  85. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/backtester.py +0 -0
  86. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/__init__.py +0 -0
  87. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/compare_phase9_parity.py +0 -0
  88. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/gamma_scalping_backtestsample.py +0 -0
  89. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/profile_phase7.py +0 -0
  90. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_arbitrage_phase_e.py +0 -0
  91. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_optimization_overhead.py +0 -0
  92. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_options_engine.py +0 -0
  93. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_pct_equity_nautilus_smoke.py +0 -0
  94. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase12_arbitrage_cert.py +0 -0
  95. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase12_benchmark_nautilus_cert.py +0 -0
  96. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase13_portfolio_report.py +0 -0
  97. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase13_wfo_cache.py +0 -0
  98. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase14_service_loop.py +0 -0
  99. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase15a_nautilus_certification.py +0 -0
  100. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase15b_synthetic_depth.py +0 -0
  101. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase16_performance_debt.py +0 -0
  102. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase30e_reactive_runner.py +0 -0
  103. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase31_intrabar.py +0 -0
  104. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34a_native_event_memory.py +0 -0
  105. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34b_native_event_prepared_score.py +0 -0
  106. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase34c_native_event_single_pass.py +0 -0
  107. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase49b_wfo_performance.py +0 -0
  108. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_phase7.py +0 -0
  109. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/benchmarks/run_portfolio_real_parity.py +0 -0
  110. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/arbitrage.py +0 -0
  111. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/basket.py +0 -0
  112. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/certification.py +0 -0
  113. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/constraints.py +0 -0
  114. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/engine.py +0 -0
  115. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/execution_depth.py +0 -0
  116. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_kernel.py +0 -0
  117. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_reference.py +0 -0
  118. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/intrabar_session.py +0 -0
  119. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/market_tape.py +0 -0
  120. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/order_compiler.py +0 -0
  121. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/orders.py +0 -0
  122. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/portfolio.py +0 -0
  123. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/preprocessor.py +0 -0
  124. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/results.py +0 -0
  125. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/schema.py +0 -0
  126. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/scopes.py +0 -0
  127. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/structured_orders.py +0 -0
  128. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/types.py +0 -0
  129. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/core/vectorized.py +0 -0
  130. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/__init__.py +0 -0
  131. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/options_analytics.py +0 -0
  132. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/metrics/performance.py +0 -0
  133. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/__init__.py +0 -0
  134. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/callbacks.py +0 -0
  135. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/candidate_selection.py +0 -0
  136. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/config.py +0 -0
  137. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/constraints.py +0 -0
  138. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluator.py +0 -0
  139. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/__init__.py +0 -0
  140. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/arbitrage.py +0 -0
  141. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/generic.py +0 -0
  142. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/grid_dca.py +0 -0
  143. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/intrabar.py +0 -0
  144. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/native_event.py +0 -0
  145. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/options.py +0 -0
  146. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/portfolio.py +0 -0
  147. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/evaluators/signal.py +0 -0
  148. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/multiseed.py +0 -0
  149. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/objectives.py +0 -0
  150. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/optimizer.py +0 -0
  151. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/result.py +0 -0
  152. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/samplers.py +0 -0
  153. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/optimization/space.py +0 -0
  154. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/__init__.py +0 -0
  155. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/cache.py +0 -0
  156. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/conventions.py +0 -0
  157. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/data.py +0 -0
  158. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/execution.py +0 -0
  159. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/fees.py +0 -0
  160. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/greeks.py +0 -0
  161. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/hedging.py +0 -0
  162. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/iv.py +0 -0
  163. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/ledger.py +0 -0
  164. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/lifecycle.py +0 -0
  165. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/margin.py +0 -0
  166. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/packages.py +0 -0
  167. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/pricing.py +0 -0
  168. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/schema.py +0 -0
  169. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/selectors.py +0 -0
  170. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/strategy.py +0 -0
  171. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/surface.py +0 -0
  172. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/tape.py +0 -0
  173. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/templates/__init__.py +0 -0
  174. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/options/templates/packages.py +0 -0
  175. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/portfolio.py +0 -0
  176. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/py.typed +0 -0
  177. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/__init__.py +0 -0
  178. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/arbitrage_audit.py +0 -0
  179. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_bundle.py +0 -0
  180. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_certification.py +0 -0
  181. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/nautilus_diagnostics.py +0 -0
  182. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/parity.py +0 -0
  183. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/portfolio_audit.py +0 -0
  184. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/reporting/portfolio_nautilus.py +0 -0
  185. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/__init__.py +0 -0
  186. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/fast.py +0 -0
  187. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/sizing/modes.py +0 -0
  188. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/__init__.py +0 -0
  189. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/plots.py +0 -0
  190. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/viz/themes.py +0 -0
  191. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt/walkforward.py +0 -0
  192. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/dependency_links.txt +0 -0
  193. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/src/quantbt_engine.egg-info/top_level.txt +0 -0
  194. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_endpoint.py +0 -0
  195. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_metrics_intraday_scope.py +0 -0
  196. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_core.py +0 -0
  197. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_evaluators.py +0 -0
  198. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_integration.py +0 -0
  199. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_phase33b.py +0 -0
  200. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_optimization_samplers.py +0 -0
  201. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_pct_equity_nautilus_smoke.py +0 -0
  202. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase0_baseline.py +0 -0
  203. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_native_portfolio_backend.py +0 -0
  204. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_native_portfolio_full_surface.py +0 -0
  205. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_engine_spec.py +0 -0
  206. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_institutional_scenarios.py +0 -0
  207. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_nautilus_validation.py +0 -0
  208. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase11_portfolio_real_parity_script.py +0 -0
  209. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase12_arbitrage_certification.py +0 -0
  210. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase12_benchmark_nautilus_cert.py +0 -0
  211. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase13_arbitrage_certification_cleanup.py +0 -0
  212. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase13_portfolio_report_parity.py +0 -0
  213. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase14_service_loop_benchmark.py +0 -0
  214. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase14c_prepared_report_levels.py +0 -0
  215. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase15a_nautilus_certification.py +0 -0
  216. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase15b_synthetic_depth.py +0 -0
  217. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase16_prepared_service_context.py +0 -0
  218. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase1_schema.py +0 -0
  219. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase2_native_vectorized.py +0 -0
  220. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30a_native_event_lifecycle_contract.py +0 -0
  221. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30b_native_event_lifecycle_kernel.py +0 -0
  222. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30c_native_event_endpoint_lifecycle.py +0 -0
  223. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30d_native_event_reactive_runner.py +0 -0
  224. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase30e_native_event_incremental_runner.py +0 -0
  225. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31_merge_blockers.py +0 -0
  226. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31a_execution_correctness_contract.py +0 -0
  227. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31b_market_tape_intrabar_oracle.py +0 -0
  228. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31c_intrabar_kernel.py +0 -0
  229. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31d_certification.py +0 -0
  230. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase31h_intrabar_session_reference.py +0 -0
  231. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34a_native_event_artifacts.py +0 -0
  232. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase34b_native_event_prepared_score.py +0 -0
  233. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase3_native_event.py +0 -0
  234. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase42_packaging_layout.py +0 -0
  235. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase42c_ci_release.py +0 -0
  236. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase45a_source_tree_sync.py +0 -0
  237. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase45d_native_event_zero_object.py +0 -0
  238. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46a_correctness_certification.py +0 -0
  239. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase46b_score_rss.py +0 -0
  240. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48b_release_hygiene.py +0 -0
  241. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase48c_event_driven_facade.py +0 -0
  242. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase49a_walkforward_schedules.py +0 -0
  243. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase49b_wfo_performance.py +0 -0
  244. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase4_basket.py +0 -0
  245. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_1_nautilus_report_bundle.py +0 -0
  246. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_arbitrage_audit.py +0 -0
  247. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_institutional_simulations.py +0 -0
  248. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_3_portfolio_audit.py +0 -0
  249. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_debt_domain_validation.py +0 -0
  250. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_endpoint_depth.py +0 -0
  251. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_4_nautilus_depth.py +0 -0
  252. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase5_nautilus_adapter.py +0 -0
  253. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase6_public_api.py +0 -0
  254. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase7_benchmark_suite.py +0 -0
  255. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_a.py +0 -0
  256. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_b.py +0 -0
  257. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_c.py +0 -0
  258. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_d.py +0 -0
  259. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_e.py +0 -0
  260. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_f.py +0 -0
  261. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_g.py +0 -0
  262. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase8_arbitrage_phase_h.py +0 -0
  263. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_phase9_performance_parity.py +0 -0
  264. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_pre48e_native_event_fast_paths.py +0 -0
  265. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_real.py +0 -0
  266. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_real_endpoints.py +0 -0
  267. {quantbt_engine-1.0.8 → quantbt_engine-1.1.0}/tests/test_shared_quantity_constraints.py +0 -0
  268. {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.8
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
  ![Python](https://img.shields.io/badge/python-3.11%2B-blue)
56
+ [![PyPI](https://img.shields.io/pypi/v/quantbt-engine.svg?label=PyPI)](https://pypi.org/project/quantbt-engine/)
54
57
  ![Numba](https://img.shields.io/badge/core-numba-00A86B)
55
58
  ![Backtesting](https://img.shields.io/badge/backtesting-vectorized%20%7C%20event--driven-black)
56
59
  ![Nautilus](https://img.shields.io/badge/nautilus-optional-6f42c1)
@@ -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
- arbitrage package execution.
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
- ### Phase 46F package and dual-backend release evidence
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==1.0.8` wheel/sdist | release-ready after local/TestPyPI approval | Python canonical; all existing endpoints remain available |
282
- | `quantbt-native` PyO3 wheel | experimental, not published | explicit `native_backend="rust"` only |
283
- | `quantbt-engine[native]` | intentionally empty | no dependency is advertised before native certification |
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
- `quantbt-native` is intentionally excluded from this core upload, `auto`
356
- remains Python, and explicit Rust remains capability-gated.
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 exact handoff fields and artifact-hash procedure are in
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
- `backend="auto"` remains Python and `[native]` remains empty until the public
459
- `quantbt-native` wheel matrix is clean-install certified.
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/compaction parity. `auto` remains Python;
491
- the native extra remains empty until the CPython 3.11/3.12/3.13 manylinux
492
- clean-install workflow passes.
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==1.0.8
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]==1.0.8"
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
- After the release is approved, downstream services should use
694
- `pip install quantbt-engine==1.0.8` and keep the unchanged import
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
  ![Python](https://img.shields.io/badge/python-3.11%2B-blue)
4
+ [![PyPI](https://img.shields.io/pypi/v/quantbt-engine.svg?label=PyPI)](https://pypi.org/project/quantbt-engine/)
4
5
  ![Numba](https://img.shields.io/badge/core-numba-00A86B)
5
6
  ![Backtesting](https://img.shields.io/badge/backtesting-vectorized%20%7C%20event--driven-black)
6
7
  ![Nautilus](https://img.shields.io/badge/nautilus-optional-6f42c1)
@@ -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
- arbitrage package execution.
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
- ### Phase 46F package and dual-backend release evidence
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==1.0.8` wheel/sdist | release-ready after local/TestPyPI approval | Python canonical; all existing endpoints remain available |
232
- | `quantbt-native` PyO3 wheel | experimental, not published | explicit `native_backend="rust"` only |
233
- | `quantbt-engine[native]` | intentionally empty | no dependency is advertised before native certification |
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
- `quantbt-native` is intentionally excluded from this core upload, `auto`
306
- remains Python, and explicit Rust remains capability-gated.
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 exact handoff fields and artifact-hash procedure are in
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
- `backend="auto"` remains Python and `[native]` remains empty until the public
409
- `quantbt-native` wheel matrix is clean-install certified.
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/compaction parity. `auto` remains Python;
441
- the native extra remains empty until the CPython 3.11/3.12/3.13 manylinux
442
- clean-install workflow passes.
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==1.0.8
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]==1.0.8"
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
- After the release is approved, downstream services should use
644
- `pip install quantbt-engine==1.0.8` and keep the unchanged import
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.8"
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
- # The API 0.4 PyO3 package is built by the native workflow but is not yet a
58
- # public dependency. Keep this empty until quantbt-native passes the public
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" }