quantbt-engine 1.0.7__tar.gz → 1.0.9__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 (265) hide show
  1. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/CHANGELOG.md +42 -0
  2. {quantbt_engine-1.0.7/src/quantbt_engine.egg-info → quantbt_engine-1.0.9}/PKG-INFO +158 -17
  3. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/README.md +156 -16
  4. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/pyproject.toml +2 -1
  5. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/__init__.py +195 -1
  6. quantbt_engine-1.0.9/src/quantbt/api/__init__.py +5 -0
  7. quantbt_engine-1.0.9/src/quantbt/api/event_driven.py +223 -0
  8. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/__init__.py +20 -0
  9. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/_native_event_rust.py +802 -130
  10. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/native_event.py +1530 -163
  11. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/native_portfolio.py +53 -2
  12. quantbt_engine-1.0.9/src/quantbt/backends/native_portfolio_package.py +335 -0
  13. quantbt_engine-1.0.9/src/quantbt/backends/native_strategy_ir.py +1152 -0
  14. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/native_vectorized.py +61 -3
  15. quantbt_engine-1.0.9/src/quantbt/benchmarks/run_phase49b_wfo_performance.py +342 -0
  16. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/__init__.py +122 -0
  17. quantbt_engine-1.0.9/src/quantbt/core/accounting_contracts.py +437 -0
  18. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/event.py +156 -3
  19. quantbt_engine-1.0.9/src/quantbt/core/event_contracts.py +387 -0
  20. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/execution_contract.py +34 -2
  21. quantbt_engine-1.0.9/src/quantbt/core/execution_trace.py +420 -0
  22. quantbt_engine-1.0.9/src/quantbt/core/generated_native_event_contracts.py +13 -0
  23. quantbt_engine-1.0.9/src/quantbt/core/generated_product_contracts.py +29 -0
  24. quantbt_engine-1.0.9/src/quantbt/core/instrument_contracts.py +275 -0
  25. quantbt_engine-1.0.9/src/quantbt/core/native_event_capabilities.py +139 -0
  26. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/native_event_parity.py +39 -5
  27. quantbt_engine-1.0.9/src/quantbt/core/native_event_promotion.py +615 -0
  28. quantbt_engine-1.0.9/src/quantbt/core/package_execution_contracts.py +223 -0
  29. quantbt_engine-1.0.9/src/quantbt/core/portfolio_execution_contracts.py +244 -0
  30. quantbt_engine-1.0.9/src/quantbt/core/product_contracts.py +179 -0
  31. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/reactive.py +23 -3
  32. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/results.py +30 -0
  33. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/endpoint.py +164 -9
  34. quantbt_engine-1.0.9/src/quantbt/engine_spi/__init__.py +48 -0
  35. quantbt_engine-1.0.9/src/quantbt/engine_spi/errors.py +4 -0
  36. quantbt_engine-1.0.9/src/quantbt/engine_spi/native_event.py +515 -0
  37. quantbt_engine-1.0.9/src/quantbt/engine_spi/protocol.py +71 -0
  38. quantbt_engine-1.0.9/src/quantbt/engine_spi/registry.py +26 -0
  39. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/engines.py +75 -17
  40. quantbt_engine-1.0.9/src/quantbt/errors.py +72 -0
  41. quantbt_engine-1.0.9/src/quantbt/planning/__init__.py +62 -0
  42. quantbt_engine-1.0.9/src/quantbt/planning/capabilities.py +68 -0
  43. quantbt_engine-1.0.9/src/quantbt/planning/fingerprints.py +44 -0
  44. quantbt_engine-1.0.9/src/quantbt/planning/models.py +265 -0
  45. quantbt_engine-1.0.9/src/quantbt/planning/output.py +91 -0
  46. quantbt_engine-1.0.9/src/quantbt/planning/resolve.py +162 -0
  47. quantbt_engine-1.0.9/src/quantbt/preparation/__init__.py +38 -0
  48. quantbt_engine-1.0.9/src/quantbt/preparation/cache.py +165 -0
  49. quantbt_engine-1.0.9/src/quantbt/preparation/models.py +193 -0
  50. quantbt_engine-1.0.9/src/quantbt/preparation/native_event.py +396 -0
  51. quantbt_engine-1.0.9/src/quantbt/preparation/native_execution.py +754 -0
  52. quantbt_engine-1.0.9/src/quantbt/results/__init__.py +21 -0
  53. quantbt_engine-1.0.9/src/quantbt/results/raw.py +158 -0
  54. quantbt_engine-1.0.9/src/quantbt/strategies/__init__.py +40 -0
  55. quantbt_engine-1.0.9/src/quantbt/strategies/commands.py +224 -0
  56. quantbt_engine-1.0.9/src/quantbt/strategies/context.py +195 -0
  57. quantbt_engine-1.0.9/src/quantbt/strategies/driver.py +147 -0
  58. quantbt_engine-1.0.9/src/quantbt/strategies/native_ir.py +455 -0
  59. quantbt_engine-1.0.9/src/quantbt/strategies/requirements.py +175 -0
  60. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/walkforward.py +975 -66
  61. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9/src/quantbt_engine.egg-info}/PKG-INFO +158 -17
  62. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt_engine.egg-info/SOURCES.txt +43 -0
  63. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase34c_native_event_single_pass.py +7 -6
  64. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase42c_ci_release.py +19 -6
  65. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase46a_correctness_certification.py +1 -1
  66. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase46f_packaging_release.py +4 -2
  67. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase48a_release_surfaces.py +10 -3
  68. quantbt_engine-1.0.9/tests/test_phase49a_walkforward_schedules.py +433 -0
  69. quantbt_engine-1.0.9/tests/test_phase49b_wfo_performance.py +314 -0
  70. quantbt_engine-1.0.9/tests/test_phase50_nested_mode1_causal.py +258 -0
  71. quantbt_engine-1.0.7/src/quantbt/core/native_event_capabilities.py +0 -121
  72. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/LICENSE +0 -0
  73. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/MANIFEST.in +0 -0
  74. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/setup.cfg +0 -0
  75. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/__init__.py +0 -0
  76. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/__init__.py +0 -0
  77. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/_dependency.py +0 -0
  78. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/backend.py +0 -0
  79. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/instruments.py +0 -0
  80. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/options.py +0 -0
  81. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/adapters/nautilus/reports.py +0 -0
  82. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backends/native_option.py +0 -0
  83. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/backtester.py +0 -0
  84. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/__init__.py +0 -0
  85. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/compare_phase9_parity.py +0 -0
  86. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/gamma_scalping_backtestsample.py +0 -0
  87. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/profile_phase7.py +0 -0
  88. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_arbitrage_phase_e.py +0 -0
  89. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_optimization_overhead.py +0 -0
  90. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_options_engine.py +0 -0
  91. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_pct_equity_nautilus_smoke.py +0 -0
  92. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase12_arbitrage_cert.py +0 -0
  93. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase12_benchmark_nautilus_cert.py +0 -0
  94. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase13_portfolio_report.py +0 -0
  95. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase13_wfo_cache.py +0 -0
  96. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase14_service_loop.py +0 -0
  97. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase15a_nautilus_certification.py +0 -0
  98. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase15b_synthetic_depth.py +0 -0
  99. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase16_performance_debt.py +0 -0
  100. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase30e_reactive_runner.py +0 -0
  101. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase31_intrabar.py +0 -0
  102. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase34a_native_event_memory.py +0 -0
  103. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase34b_native_event_prepared_score.py +0 -0
  104. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase34c_native_event_single_pass.py +0 -0
  105. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_phase7.py +0 -0
  106. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/benchmarks/run_portfolio_real_parity.py +0 -0
  107. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/arbitrage.py +0 -0
  108. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/basket.py +0 -0
  109. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/certification.py +0 -0
  110. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/constraints.py +0 -0
  111. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/engine.py +0 -0
  112. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/execution_depth.py +0 -0
  113. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/intrabar_kernel.py +0 -0
  114. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/intrabar_reference.py +0 -0
  115. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/intrabar_session.py +0 -0
  116. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/market_tape.py +0 -0
  117. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/order_compiler.py +0 -0
  118. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/orders.py +0 -0
  119. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/portfolio.py +0 -0
  120. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/preprocessor.py +0 -0
  121. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/schema.py +0 -0
  122. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/scopes.py +0 -0
  123. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/structured_orders.py +0 -0
  124. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/types.py +0 -0
  125. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/core/vectorized.py +0 -0
  126. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/metrics/__init__.py +0 -0
  127. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/metrics/options_analytics.py +0 -0
  128. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/metrics/performance.py +0 -0
  129. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/__init__.py +0 -0
  130. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/callbacks.py +0 -0
  131. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/candidate_selection.py +0 -0
  132. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/config.py +0 -0
  133. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/constraints.py +0 -0
  134. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluator.py +0 -0
  135. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/__init__.py +0 -0
  136. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/arbitrage.py +0 -0
  137. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/generic.py +0 -0
  138. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/grid_dca.py +0 -0
  139. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/intrabar.py +0 -0
  140. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/native_event.py +0 -0
  141. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/options.py +0 -0
  142. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/portfolio.py +0 -0
  143. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/evaluators/signal.py +0 -0
  144. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/multiseed.py +0 -0
  145. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/objectives.py +0 -0
  146. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/optimizer.py +0 -0
  147. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/result.py +0 -0
  148. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/samplers.py +0 -0
  149. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/optimization/space.py +0 -0
  150. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/__init__.py +0 -0
  151. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/cache.py +0 -0
  152. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/conventions.py +0 -0
  153. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/data.py +0 -0
  154. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/execution.py +0 -0
  155. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/fees.py +0 -0
  156. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/greeks.py +0 -0
  157. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/hedging.py +0 -0
  158. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/iv.py +0 -0
  159. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/ledger.py +0 -0
  160. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/lifecycle.py +0 -0
  161. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/margin.py +0 -0
  162. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/packages.py +0 -0
  163. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/pricing.py +0 -0
  164. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/schema.py +0 -0
  165. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/selectors.py +0 -0
  166. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/strategy.py +0 -0
  167. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/surface.py +0 -0
  168. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/tape.py +0 -0
  169. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/templates/__init__.py +0 -0
  170. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/options/templates/packages.py +0 -0
  171. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/portfolio.py +0 -0
  172. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/py.typed +0 -0
  173. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/__init__.py +0 -0
  174. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/arbitrage_audit.py +0 -0
  175. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/nautilus_bundle.py +0 -0
  176. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/nautilus_certification.py +0 -0
  177. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/nautilus_diagnostics.py +0 -0
  178. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/parity.py +0 -0
  179. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/portfolio_audit.py +0 -0
  180. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/reporting/portfolio_nautilus.py +0 -0
  181. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/sizing/__init__.py +0 -0
  182. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/sizing/fast.py +0 -0
  183. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/sizing/modes.py +0 -0
  184. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/viz/__init__.py +0 -0
  185. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/viz/plots.py +0 -0
  186. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt/viz/themes.py +0 -0
  187. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt_engine.egg-info/dependency_links.txt +0 -0
  188. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt_engine.egg-info/requires.txt +0 -0
  189. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/src/quantbt_engine.egg-info/top_level.txt +0 -0
  190. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_endpoint.py +0 -0
  191. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_metrics_intraday_scope.py +0 -0
  192. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_optimization_core.py +0 -0
  193. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_optimization_evaluators.py +0 -0
  194. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_optimization_integration.py +0 -0
  195. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_optimization_phase33b.py +0 -0
  196. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_optimization_samplers.py +0 -0
  197. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_pct_equity_nautilus_smoke.py +0 -0
  198. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase0_baseline.py +0 -0
  199. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_native_portfolio_backend.py +0 -0
  200. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_native_portfolio_full_surface.py +0 -0
  201. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_portfolio_engine_spec.py +0 -0
  202. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_portfolio_institutional_scenarios.py +0 -0
  203. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_portfolio_nautilus_validation.py +0 -0
  204. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase11_portfolio_real_parity_script.py +0 -0
  205. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase12_arbitrage_certification.py +0 -0
  206. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase12_benchmark_nautilus_cert.py +0 -0
  207. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase13_arbitrage_certification_cleanup.py +0 -0
  208. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase13_portfolio_report_parity.py +0 -0
  209. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase14_service_loop_benchmark.py +0 -0
  210. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase14c_prepared_report_levels.py +0 -0
  211. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase15a_nautilus_certification.py +0 -0
  212. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase15b_synthetic_depth.py +0 -0
  213. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase16_prepared_service_context.py +0 -0
  214. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase1_schema.py +0 -0
  215. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase2_native_vectorized.py +0 -0
  216. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase30a_native_event_lifecycle_contract.py +0 -0
  217. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase30b_native_event_lifecycle_kernel.py +0 -0
  218. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase30c_native_event_endpoint_lifecycle.py +0 -0
  219. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase30d_native_event_reactive_runner.py +0 -0
  220. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase30e_native_event_incremental_runner.py +0 -0
  221. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31_merge_blockers.py +0 -0
  222. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31a_execution_correctness_contract.py +0 -0
  223. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31b_market_tape_intrabar_oracle.py +0 -0
  224. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31c_intrabar_kernel.py +0 -0
  225. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31d_certification.py +0 -0
  226. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase31h_intrabar_session_reference.py +0 -0
  227. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase34a_native_event_artifacts.py +0 -0
  228. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase34b_native_event_prepared_score.py +0 -0
  229. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase3_native_event.py +0 -0
  230. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase42_packaging_layout.py +0 -0
  231. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase45a_source_tree_sync.py +0 -0
  232. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase45d_native_event_zero_object.py +0 -0
  233. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase46b_score_rss.py +0 -0
  234. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase46c_import_graph.py +0 -0
  235. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase47a_grid_adapter.py +0 -0
  236. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase47c_grid_parity.py +0 -0
  237. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase47d_grid_optimizer.py +0 -0
  238. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase48b_release_hygiene.py +0 -0
  239. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase48c_event_driven_facade.py +0 -0
  240. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase48f_release_gate.py +0 -0
  241. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase4_basket.py +0 -0
  242. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_1_nautilus_report_bundle.py +0 -0
  243. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_3_arbitrage_audit.py +0 -0
  244. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_3_institutional_simulations.py +0 -0
  245. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_3_portfolio_audit.py +0 -0
  246. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_4_debt_domain_validation.py +0 -0
  247. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_4_endpoint_depth.py +0 -0
  248. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_4_nautilus_depth.py +0 -0
  249. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase5_nautilus_adapter.py +0 -0
  250. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase6_public_api.py +0 -0
  251. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase7_benchmark_suite.py +0 -0
  252. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_a.py +0 -0
  253. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_b.py +0 -0
  254. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_c.py +0 -0
  255. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_d.py +0 -0
  256. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_e.py +0 -0
  257. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_f.py +0 -0
  258. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_g.py +0 -0
  259. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase8_arbitrage_phase_h.py +0 -0
  260. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_phase9_performance_parity.py +0 -0
  261. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_pre48e_native_event_fast_paths.py +0 -0
  262. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_real.py +0 -0
  263. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_real_endpoints.py +0 -0
  264. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_shared_quantity_constraints.py +0 -0
  265. {quantbt_engine-1.0.7 → quantbt_engine-1.0.9}/tests/test_walkforward_phase1.py +0 -0
@@ -2,6 +2,48 @@
2
2
 
3
3
  All notable changes to `quantbt-engine` are documented here.
4
4
 
5
+ ## [1.0.9] - 2026-08-21
6
+
7
+ ### Added
8
+
9
+ - Direct PyPI discovery and installation guidance in the repository README.
10
+ - Release-preparation guidance for the governed Rust-first routes, exact
11
+ installed-wheel certification, and the matching core/native compatibility
12
+ contract.
13
+
14
+ ### Changed
15
+
16
+ - Promoted the bounded Rust-first public policy for certified static command
17
+ tapes, Native Strategy IR, batch, and causal-fold workloads while preserving
18
+ Python authority for callbacks, reactive strategies, generic portfolio,
19
+ basket, arbitrage, and options routes.
20
+ - Updated the core product registry to the `1.0.9` release line. The staged
21
+ `quantbt-native` companion remains unpublished and capability-gated.
22
+
23
+ ### Verification
24
+
25
+ - Source-mirror, generated-product-contract, documentation-link, build, and
26
+ installed-wheel release checks are required from the final tagged commit.
27
+
28
+ ## [1.0.8] - 2026-08-12
29
+
30
+ ### Changed
31
+
32
+ - Added strict nested causal retraining for
33
+ `mode_1_decay + optimization_schedule="per_fold_causal"`. Mode 1 decay now
34
+ uses inner IS-only folds while each outer OOS segment remains untouched until
35
+ its parameters are frozen.
36
+ - Added explicit chronological validation metadata so consumers can distinguish
37
+ retrospective global calibration, selection-adjusted OOS, and strict outer
38
+ OOS evaluation without breaking legacy result fields.
39
+ - Added a bounded-RSS release test runner that executes deterministic pytest
40
+ shards in fresh processes; CI and publish workflows use the same selection.
41
+
42
+ ### Verification
43
+
44
+ - Root/source mirror, prepared/reference WFO parity, nested-fold causality,
45
+ and the full non-real-data release suite passed before this version bump.
46
+
5
47
  ## [1.0.7] - 2026-08-04
6
48
 
7
49
  This is the first independently installable core package release line.
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quantbt-engine
3
- Version: 1.0.7
3
+ Version: 1.0.9
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
@@ -51,6 +52,7 @@ Dynamic: license-file
51
52
  # QuantBT
52
53
 
53
54
  ![Python](https://img.shields.io/badge/python-3.11%2B-blue)
55
+ [![PyPI](https://img.shields.io/pypi/v/quantbt-engine.svg?label=PyPI)](https://pypi.org/project/quantbt-engine/)
54
56
  ![Numba](https://img.shields.io/badge/core-numba-00A86B)
55
57
  ![Backtesting](https://img.shields.io/badge/backtesting-vectorized%20%7C%20event--driven-black)
56
58
  ![Nautilus](https://img.shields.io/badge/nautilus-optional-6f42c1)
@@ -68,6 +70,10 @@ The goal is simple: make alpha research fast enough for iteration, strict
68
70
  enough for institutional-style review, and readable enough that stakeholders can
69
71
  audit how a result was produced.
70
72
 
73
+ QuantBT is published on [PyPI as `quantbt-engine`](https://pypi.org/project/quantbt-engine/).
74
+ Install the current public release with `pip install --upgrade quantbt-engine`;
75
+ the import remains `from quantbt import QuantBTEndpoint`.
76
+
71
77
  Current portfolio status: `native_portfolio` is the default multi-symbol
72
78
  backend. It supports long/short, market-neutral, directional, equal-weight,
73
79
  risk-parity, and beta-neutral portfolio modes, with live-equity sizing and
@@ -79,7 +85,7 @@ historical reproduction.
79
85
  - One public API for notebooks, services, portfolio research, and validation.
80
86
  - Native vectorized engines for fast sweeps and large parameter grids.
81
87
  - Native event-driven engines for market/limit orders, fills, baskets, and
82
- arbitrage package execution.
88
+ package execution, with Rust auto-promotion limited to certified workloads.
83
89
  - Prepared service contexts for repeated signal/portfolio replays on the same
84
90
  market tape without re-normalizing pandas data each run.
85
91
  - Native portfolio engine with target weights, target notionals, target units,
@@ -115,6 +121,7 @@ bt = QuantBTEndpoint.event_driven(
115
121
  input_mode="strategy", # strategy | orders
116
122
  profile="research", # research | optimize | audit
117
123
  backend="auto", # auto | python | rust
124
+ execution_contract="event_lifecycle_v3_next_open",
118
125
  initial_capital=20_000,
119
126
  leverage=5,
120
127
  fee_rate=0.0005, # one-way fee per fill
@@ -133,6 +140,21 @@ event artifacts. For an upstream order planner, switch to
133
140
  backend follows the release policy; `rust` is an explicit request for the
134
141
  optional capability-gated native wheel.
135
142
 
143
+ An arbitrary `strategy=...` callback remains a Python-authoritative route,
144
+ including when `backend="auto"` and a local native wheel is installed. The
145
+ current automatic Rust routes are a pre-built static V2/V3 command tape with
146
+ at least 10,000 bars, or a bounded `NativeStrategyIR` request with at least
147
+ 2,000 bars. Inspect `result.metadata["native_event_promotion_v1"]` to see the
148
+ resolved backend, threshold, policy rule, and fallback reason for every run.
149
+
150
+ The compatibility default is the frozen
151
+ `event_lifecycle_v2_next_bar_close` behavior. Select
152
+ `event_lifecycle_v3_next_open` for real next-open market fills, favorable
153
+ limit-gap improvement, adverse stop-gap execution, and conservative flagged
154
+ stop-limit ambiguity. V3 requires an `open` column and is parity-tested across
155
+ the Python and Rust backends. The machine-readable registry and audit fields
156
+ are documented in [Native Event Contract Registry](docs/contracts/contract_registry.md).
157
+
136
158
  The strategy owns signal generation and look-ahead control. QuantBT owns the
137
159
  causal order lifecycle and accounting. Advanced users can still call
138
160
  `native_event_strategy(...)` or `native_event_lifecycle(...)` directly when a
@@ -218,6 +240,21 @@ tape. Normal `.backtest(...)` remains defensive and backward-compatible.
218
240
  Cython/C++ remains deferred because the larger benchmark still points to
219
241
  facade/report overhead rather than pure Numba kernels.
220
242
 
243
+ Latest Phase 49B WFO benchmark (1,000 daily bars, identical seeds, folds,
244
+ trials, strategies, account settings, and accounting kernels):
245
+
246
+ | WFO workload | Phase 49A reference | Phase 49B prepared/scalar | Speedup | Parity |
247
+ |---|---:|---:|---:|---|
248
+ | Portfolio global, 1 study x 16 trials | 0.386s | 0.330s | 1.17x | exact |
249
+ | Single-symbol causal, 6 studies x 16 trials | 4.051s | 1.781s | 2.27x | exact |
250
+
251
+ Phase 49B prepares aligned WFO fold state once, scores trials directly from
252
+ accounting arrays, and compacts completed Optuna ledgers. It does not cache user
253
+ strategy signals or alter objectives. The isolated warm peak-RSS difference was
254
+ within +/-0.15%, so the result is reported as an RSS plateau rather than a memory
255
+ reduction. Reproduce it with
256
+ `python benchmarks/run_phase49b_wfo_performance.py --rows 1000 --trials 16`.
257
+
221
258
  Latest Phase 31 intrabar execution benchmark:
222
259
 
223
260
  | Route | Workload | Runtime | Throughput | Ratio | Parity |
@@ -255,7 +292,70 @@ selection semantics inside `walkforward.py`. Read
255
292
  `benchmarks/results/optimization_overhead.md` for signal, intrabar, portfolio,
256
293
  arbitrage/grid/options fallback examples and benchmark details.
257
294
 
258
- ### Phase 46F package and dual-backend release evidence
295
+ ### Current governed Rust routes and benchmark evidence
296
+
297
+ Rust is execution-authoritative only where the public request, accounting
298
+ contract, installed-wheel parity corpus, and promotion policy have all been
299
+ certified. The generated Stage-B policy has this deliberately narrow scope:
300
+
301
+ | Route | Rust behavior with a matching local companion | Public default elsewhere |
302
+ |---|---|---|
303
+ | Static V2/V3 `OrderCommand` tape | `auto` at 10,000+ bars | Python |
304
+ | Bounded Native Strategy IR, batch, causal-fold scorer | `auto` at 2,000+ bars | Python |
305
+ | `run_portfolio_target_market(...)` | explicit Rust helper | no generic endpoint promotion |
306
+ | `run_atomic_package_market(...)` | explicit Rust helper | no generic endpoint promotion |
307
+ | Python callback/reactive, generic portfolio/basket/arbitrage/options | not promoted | Python |
308
+
309
+ The bounded Rust strategy IR covers precomputed signal targets, structural
310
+ Grid levels, periodic DCA, and fixed bracket/OCO transitions. Python callbacks,
311
+ reactive strategies, and generic portfolio/package/arbitrage execution remain
312
+ Python compatibility routes by design.
313
+
314
+ Phase 54B.3 also certifies two intentionally explicit Rust helpers,
315
+ `run_portfolio_target_market(...)` and `run_atomic_package_market(...)`, for
316
+ linear quote-settled gross-cross `target_units` and one ordered same-bar
317
+ all-or-none market package respectively. They do not change generic endpoint
318
+ routing or claim venue-native multi-leg execution; the bounded contract,
319
+ parity corpus, and benchmark evidence are documented in
320
+ [`docs/native_event_rust_full_contract.md`](docs/native_event_rust_full_contract.md).
321
+ On the governed 2,000-bar x 8-symbol fixture, their Rust score paths measured
322
+ 3.594 ms (556,551 bars/s) for target units and 3.512 ms (569,514 bars/s) for
323
+ the atomic package, versus Python event-oracle score paths of 33.493 ms and
324
+ 19.735 ms respectively. These are bounded direct-route measurements; audit
325
+ report adaptation is intentionally timed and reported separately.
326
+
327
+ The local five-repeat public-route evidence below passed exact Python/Rust
328
+ canonical-trace and accounting parity before timing. It is deliberately not a
329
+ universal Rust speed claim: static public facade time is dominated by common
330
+ Python preparation/report adaptation, while typed IR score and shared batch
331
+ avoid those per-scenario costs.
332
+
333
+ | Workload | Bars | Rust median | Rust throughput | Python median | Python throughput |
334
+ |---|---:|---:|---:|---:|---:|
335
+ | Static public compact | 10,000 | 63.612 ms | 157,203 bars/s | 53.606 ms | 186,545 bars/s |
336
+ | Static public audit | 10,000 | 6.024 s | 1,660 bars/s | 5.924 s | 1,688 bars/s |
337
+ | Native IR score | 2,000 | 0.741 ms | 2.70M bars/s | 31.565 ms | 63,361 bars/s |
338
+ | Native IR batch, 64 scenarios | 128,000 | 11.379 ms | 11.25M bars/s | - | - |
339
+ | Native IR causal fold, 64 scenarios | 64,000 | 7.386 ms | 8.67M bars/s | - | - |
340
+
341
+ The Rust IR score has one boundary call, zero Python callbacks, and no audit
342
+ replay. Batch/fold execution has one boundary call and zero prepared-market
343
+ copies per scenario; its repeated-run RSS delta was 8-16 KiB on this host. An
344
+ audit result is intentionally a cold reporting path: its typed Rust output is
345
+ adapted to the normal `BacktestResultV2` without rerunning execution. Full
346
+ evidence is in
347
+ [`phase54b2/public_routes.md`](benchmarks/native_event/results/phase54b2/public_routes.md)
348
+ and the support boundary is in
349
+ [`docs/native_strategy_ir.md`](docs/native_strategy_ir.md).
350
+
351
+ Phase 54B.4 adds an installed-wheel release gate, rather than a new speed
352
+ claim. It proves clean core-only fallback, exact core/native-pair handshake,
353
+ promotion decisions, and Python/Rust accounting parity for every governed
354
+ route. The public `quantbt-engine` wheel remains core-only until a separately
355
+ approved native wheel release; see the
356
+ [native release handoff](docs/migration/native_release_handoff.md).
357
+
358
+ ### Historical Phase 46F package and dual-backend release evidence
259
359
 
260
360
  The core distribution is packaged as `quantbt-engine` and imports as
261
361
  `quantbt`. Its release gate is independent from the optional experimental Rust
@@ -263,8 +363,8 @@ wheel:
263
363
 
264
364
  | Release artifact | Current status | Backend policy |
265
365
  |---|---|---|
266
- | `quantbt-engine==1.0.7` wheel/sdist | release-ready after local/TestPyPI approval | Python canonical; all existing endpoints remain available |
267
- | `quantbt-native` PyO3 wheel | experimental, not published | explicit `native_backend="rust"` only |
366
+ | `quantbt-engine` wheel/sdist | published on PyPI | Python canonical; all existing endpoints remain available |
367
+ | `quantbt-native` PyO3 wheel | staged, not published | local Stage-B `auto` only for certified static/IR/batch rows |
268
368
  | `quantbt-engine[native]` | intentionally empty | no dependency is advertised before native certification |
269
369
 
270
370
  The committed Phase 46F rerun compares the same prepared static tape and keeps
@@ -330,7 +430,7 @@ Raw Phase 47D artifacts are kept under
330
430
 
331
431
  ### Phase 48F final release handoff
332
432
 
333
- The core `quantbt-engine` 1.0.7 artifact gate is now implemented locally and
433
+ The core `quantbt-engine` 1.0.8 artifact gate is now implemented locally and
334
434
  in the release workflows: exact version/ref validation, wheel and sdist
335
435
  `twine check`, archive allowlist and secret scan, clean import plus `pip check`,
336
436
  and a SHA256 release manifest. The TestPyPI workflow is manual and OIDC
@@ -372,7 +472,10 @@ The release workflow is documented in
372
472
  [`docs/release_packaging.md`](docs/release_packaging.md): build and inspect
373
473
  wheel/sdist, run clean-install and `pip check`, publish an RC to TestPyPI with
374
474
  OIDC, then publish the final core package through the protected PyPI
375
- environment. The exact handoff fields and artifact-hash procedure are in
475
+ environment. The native companion scope, rollback controls, and installed-wheel
476
+ certification handoff are in
477
+ [`docs/migration/native_release_handoff.md`](docs/migration/native_release_handoff.md).
478
+ The exact handoff fields and artifact-hash procedure are in
376
479
  [`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
377
480
  No long-lived token is required. Native optimization remains an
378
481
  open, domain-preserving roadmap for portfolio, arbitrage, options, vectorized,
@@ -440,8 +543,10 @@ Phase 48E also reduced the static explicit Rust score to `0.000302s`
440
543
  scalar Rust output contract and prepared command-tape reuse, so they are
441
544
  reported separately from callback execution. Rust and Python fingerprints,
442
545
  fees, positions, fills, events, rejection counters, and final equity passed.
443
- `backend="auto"` remains Python and `[native]` remains empty until the public
444
- `quantbt-native` wheel matrix is clean-install certified.
546
+ At Phase 48E this historical benchmark had `auto` pinned to Python. The later
547
+ Phase 54B.2 local Stage-B policy promotes only the certified static/IR/batch
548
+ rows documented above; `[native]` remains empty until a public native-wheel
549
+ matrix is clean-install certified.
445
550
 
446
551
  ### Phase 48E.1 native production-closure evidence
447
552
 
@@ -472,9 +577,10 @@ facade; it is not a universal Rust speed claim.
472
577
 
473
578
  Phase 48E.1 also locks typed API 0.4 step results, count-only score sinks,
474
579
  reusable SoA audit buffers, separate command/lifecycle/fill reports, compact
475
- validated Rust order state, and reset/compaction parity. `auto` remains Python;
476
- the native extra remains empty until the CPython 3.11/3.12/3.13 manylinux
477
- clean-install workflow passes.
580
+ validated Rust order state, and reset/lifecycle parity. This paragraph records
581
+ the historical pre-promotion state; the current Stage-B local policy is the
582
+ bounded static/IR/batch policy above. The native extra remains empty until the
583
+ CPython 3.11/3.12/3.13 manylinux clean-install workflow passes.
478
584
 
479
585
  Ecosystem positioning:
480
586
 
@@ -639,15 +745,19 @@ fills, positions, account state, and performance report.
639
745
  Install the released core package:
640
746
 
641
747
  ```bash
642
- pip install quantbt-engine==1.0.7
748
+ pip install --upgrade quantbt-engine
643
749
  ```
644
750
 
645
- Optional reports and third-party validation:
751
+ Optional optimization, reports, and third-party validation:
646
752
 
647
753
  ```bash
648
- pip install "quantbt-engine[reports,validation]==1.0.7"
754
+ pip install --upgrade "quantbt-engine[optimization,reports,validation]"
649
755
  ```
650
756
 
757
+ Walk-forward parameter search specifically requires the `optimization` extra.
758
+ Read the [causal WFO guide](docs/walkforward_causal.md) before reporting OOS
759
+ metrics from a fold-local schedule.
760
+
651
761
  Development from this repository:
652
762
 
653
763
  ```bash
@@ -671,8 +781,8 @@ feature is under development:
671
781
  pip install -e /root/bobby/pool_alpha/quantbt
672
782
  ```
673
783
 
674
- After the release is approved, downstream services should use
675
- `pip install quantbt-engine==1.0.7` and keep the unchanged import
784
+ For reproducible deployments, pin a published version such as
785
+ `pip install quantbt-engine==1.0.9` and keep the unchanged import
676
786
  `from quantbt import QuantBTEndpoint`.
677
787
 
678
788
  ## Quick Start
@@ -803,6 +913,31 @@ result = wf.backtest(data=df, param_ranges=param_ranges)
803
913
  wf.show_metrics(scope="auto")
804
914
  ```
805
915
 
916
+ Multi-fold WFO keeps `optimization_schedule="global"` as the compatible
917
+ default. Phase 49A also exposes two explicit fold-local schedules:
918
+
919
+ - `mode_1_decay + per_fold_decay`: one study per fold, with same-fold OOS used
920
+ for final decay candidate selection (`selection_adjusted_oos`);
921
+ - `mode_4_is_only_robust + per_fold_causal`: one study per fold, with strict
922
+ IS-only selection before outer OOS execution.
923
+ - `mode_1_decay + per_fold_causal`: one outer study per fold, where Mode 1
924
+ decay is measured only on explicit nested inner folds contained in that
925
+ outer IS window; outer OOS remains untouched until parameters are frozen.
926
+
927
+ Both schedules stitch one continuous target tape and run accounting once with
928
+ `fold_boundary_position_policy="carry"`. See the [causal WFO guide]
929
+ (docs/walkforward_causal.md), [docs/endpoint.md](docs/endpoint.md), and
930
+ [methodology/walk_forward.md](methodology/walk_forward.md) for selection claims,
931
+ strictness boundaries, and audit metadata.
932
+
933
+ Phase 49B keeps this API stable. Endpoint-backed optimization prepares market
934
+ and fold state once and uses scalar-only trial reports by default. Audit the
935
+ lifecycle through `prepared_wfo_context`, `prepared_scoring_cache`,
936
+ `trial_ledger_mode`, and `performance_profile` in walk-forward metadata.
937
+ Nested Mode 1 also records `inner_validation`, `inner_fold_table`, and
938
+ `chronological_validation_claim` so services can distinguish retrospective,
939
+ selection-adjusted, and strict outer-OOS results.
940
+
806
941
  `scope="auto"` reports only the tested/OOS segment for walk-forward and
807
942
  train/test runs. Pass `scope="full"` when you need to audit the full stitched
808
943
  timeline.
@@ -852,7 +987,13 @@ backend, endpoint, or strategy route to use.
852
987
  | Market/limit/stop fill behavior | [Order fill policies](docs/order_fill_policies.md) |
853
988
  | Nautilus validation and report bundles | [Nautilus backend](docs/nautilus_backend.md) |
854
989
  | Pair, basket, hedge-ratio package behavior | [Pair and basket guide](docs/pair_basket_guide.md) |
990
+ | Causal WFO schedules, outer-OOS claims, and audit metadata | [Causal WFO guide](docs/walkforward_causal.md) |
855
991
  | Walk-forward methodology and anti-leakage scoring | [Walk-forward methodology](docs/walkforward_methodology_vi.md) |
992
+ | Opt-in Rust strategy templates, batch scoring, and causal OOS batch folds | [Native strategy IR and batch](docs/native_strategy_ir.md) |
993
+ | Python/Rust plan ownership and backend routing | [Execution-plan architecture](docs/architecture/execution-plan.md) |
994
+ | Exact staged core/native pair and maturity matrix | [Generated native compatibility](docs/contracts/generated_product_compatibility.md) |
995
+ | Build, clean-install, and verify local native wheels | [Native companion installation](docs/native/install.md) |
996
+ | Workload-scoped benchmark methodology | [Benchmarking governance](docs/performance/benchmarking.md) |
856
997
  | Runnable smoke templates | [Examples index](examples/README.md) |
857
998
 
858
999
  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
@@ -168,6 +189,21 @@ tape. Normal `.backtest(...)` remains defensive and backward-compatible.
168
189
  Cython/C++ remains deferred because the larger benchmark still points to
169
190
  facade/report overhead rather than pure Numba kernels.
170
191
 
192
+ Latest Phase 49B WFO benchmark (1,000 daily bars, identical seeds, folds,
193
+ trials, strategies, account settings, and accounting kernels):
194
+
195
+ | WFO workload | Phase 49A reference | Phase 49B prepared/scalar | Speedup | Parity |
196
+ |---|---:|---:|---:|---|
197
+ | Portfolio global, 1 study x 16 trials | 0.386s | 0.330s | 1.17x | exact |
198
+ | Single-symbol causal, 6 studies x 16 trials | 4.051s | 1.781s | 2.27x | exact |
199
+
200
+ Phase 49B prepares aligned WFO fold state once, scores trials directly from
201
+ accounting arrays, and compacts completed Optuna ledgers. It does not cache user
202
+ strategy signals or alter objectives. The isolated warm peak-RSS difference was
203
+ within +/-0.15%, so the result is reported as an RSS plateau rather than a memory
204
+ reduction. Reproduce it with
205
+ `python benchmarks/run_phase49b_wfo_performance.py --rows 1000 --trials 16`.
206
+
171
207
  Latest Phase 31 intrabar execution benchmark:
172
208
 
173
209
  | Route | Workload | Runtime | Throughput | Ratio | Parity |
@@ -205,7 +241,70 @@ selection semantics inside `walkforward.py`. Read
205
241
  `benchmarks/results/optimization_overhead.md` for signal, intrabar, portfolio,
206
242
  arbitrage/grid/options fallback examples and benchmark details.
207
243
 
208
- ### 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 local 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 public `quantbt-engine` wheel remains core-only until a separately
304
+ approved native wheel release; see the
305
+ [native release handoff](docs/migration/native_release_handoff.md).
306
+
307
+ ### Historical Phase 46F package and dual-backend release evidence
209
308
 
210
309
  The core distribution is packaged as `quantbt-engine` and imports as
211
310
  `quantbt`. Its release gate is independent from the optional experimental Rust
@@ -213,8 +312,8 @@ wheel:
213
312
 
214
313
  | Release artifact | Current status | Backend policy |
215
314
  |---|---|---|
216
- | `quantbt-engine==1.0.7` wheel/sdist | release-ready after local/TestPyPI approval | Python canonical; all existing endpoints remain available |
217
- | `quantbt-native` PyO3 wheel | experimental, not published | explicit `native_backend="rust"` only |
315
+ | `quantbt-engine` wheel/sdist | published on PyPI | Python canonical; all existing endpoints remain available |
316
+ | `quantbt-native` PyO3 wheel | staged, not published | local Stage-B `auto` only for certified static/IR/batch rows |
218
317
  | `quantbt-engine[native]` | intentionally empty | no dependency is advertised before native certification |
219
318
 
220
319
  The committed Phase 46F rerun compares the same prepared static tape and keeps
@@ -280,7 +379,7 @@ Raw Phase 47D artifacts are kept under
280
379
 
281
380
  ### Phase 48F final release handoff
282
381
 
283
- The core `quantbt-engine` 1.0.7 artifact gate is now implemented locally and
382
+ The core `quantbt-engine` 1.0.8 artifact gate is now implemented locally and
284
383
  in the release workflows: exact version/ref validation, wheel and sdist
285
384
  `twine check`, archive allowlist and secret scan, clean import plus `pip check`,
286
385
  and a SHA256 release manifest. The TestPyPI workflow is manual and OIDC
@@ -322,7 +421,10 @@ The release workflow is documented in
322
421
  [`docs/release_packaging.md`](docs/release_packaging.md): build and inspect
323
422
  wheel/sdist, run clean-install and `pip check`, publish an RC to TestPyPI with
324
423
  OIDC, then publish the final core package through the protected PyPI
325
- environment. The exact handoff fields and artifact-hash procedure are in
424
+ environment. The native companion scope, rollback controls, and installed-wheel
425
+ certification handoff are in
426
+ [`docs/migration/native_release_handoff.md`](docs/migration/native_release_handoff.md).
427
+ The exact handoff fields and artifact-hash procedure are in
326
428
  [`docs/testpypi_release_checklist.md`](docs/testpypi_release_checklist.md).
327
429
  No long-lived token is required. Native optimization remains an
328
430
  open, domain-preserving roadmap for portfolio, arbitrage, options, vectorized,
@@ -390,8 +492,10 @@ Phase 48E also reduced the static explicit Rust score to `0.000302s`
390
492
  scalar Rust output contract and prepared command-tape reuse, so they are
391
493
  reported separately from callback execution. Rust and Python fingerprints,
392
494
  fees, positions, fills, events, rejection counters, and final equity passed.
393
- `backend="auto"` remains Python and `[native]` remains empty until the public
394
- `quantbt-native` wheel matrix is clean-install certified.
495
+ At Phase 48E this historical benchmark had `auto` pinned to Python. The later
496
+ Phase 54B.2 local Stage-B policy promotes only the certified static/IR/batch
497
+ rows documented above; `[native]` remains empty until a public native-wheel
498
+ matrix is clean-install certified.
395
499
 
396
500
  ### Phase 48E.1 native production-closure evidence
397
501
 
@@ -422,9 +526,10 @@ facade; it is not a universal Rust speed claim.
422
526
 
423
527
  Phase 48E.1 also locks typed API 0.4 step results, count-only score sinks,
424
528
  reusable SoA audit buffers, separate command/lifecycle/fill reports, compact
425
- validated Rust order state, and reset/compaction parity. `auto` remains Python;
426
- the native extra remains empty until the CPython 3.11/3.12/3.13 manylinux
427
- clean-install workflow passes.
529
+ validated Rust order state, and reset/lifecycle parity. This paragraph records
530
+ the historical pre-promotion state; the current Stage-B local policy is the
531
+ bounded static/IR/batch policy above. The native extra remains empty until the
532
+ CPython 3.11/3.12/3.13 manylinux clean-install workflow passes.
428
533
 
429
534
  Ecosystem positioning:
430
535
 
@@ -589,15 +694,19 @@ fills, positions, account state, and performance report.
589
694
  Install the released core package:
590
695
 
591
696
  ```bash
592
- pip install quantbt-engine==1.0.7
697
+ pip install --upgrade quantbt-engine
593
698
  ```
594
699
 
595
- Optional reports and third-party validation:
700
+ Optional optimization, reports, and third-party validation:
596
701
 
597
702
  ```bash
598
- pip install "quantbt-engine[reports,validation]==1.0.7"
703
+ pip install --upgrade "quantbt-engine[optimization,reports,validation]"
599
704
  ```
600
705
 
706
+ Walk-forward parameter search specifically requires the `optimization` extra.
707
+ Read the [causal WFO guide](docs/walkforward_causal.md) before reporting OOS
708
+ metrics from a fold-local schedule.
709
+
601
710
  Development from this repository:
602
711
 
603
712
  ```bash
@@ -621,8 +730,8 @@ feature is under development:
621
730
  pip install -e /root/bobby/pool_alpha/quantbt
622
731
  ```
623
732
 
624
- After the release is approved, downstream services should use
625
- `pip install quantbt-engine==1.0.7` and keep the unchanged import
733
+ For reproducible deployments, pin a published version such as
734
+ `pip install quantbt-engine==1.0.9` and keep the unchanged import
626
735
  `from quantbt import QuantBTEndpoint`.
627
736
 
628
737
  ## Quick Start
@@ -753,6 +862,31 @@ result = wf.backtest(data=df, param_ranges=param_ranges)
753
862
  wf.show_metrics(scope="auto")
754
863
  ```
755
864
 
865
+ Multi-fold WFO keeps `optimization_schedule="global"` as the compatible
866
+ default. Phase 49A also exposes two explicit fold-local schedules:
867
+
868
+ - `mode_1_decay + per_fold_decay`: one study per fold, with same-fold OOS used
869
+ for final decay candidate selection (`selection_adjusted_oos`);
870
+ - `mode_4_is_only_robust + per_fold_causal`: one study per fold, with strict
871
+ IS-only selection before outer OOS execution.
872
+ - `mode_1_decay + per_fold_causal`: one outer study per fold, where Mode 1
873
+ decay is measured only on explicit nested inner folds contained in that
874
+ outer IS window; outer OOS remains untouched until parameters are frozen.
875
+
876
+ Both schedules stitch one continuous target tape and run accounting once with
877
+ `fold_boundary_position_policy="carry"`. See the [causal WFO guide]
878
+ (docs/walkforward_causal.md), [docs/endpoint.md](docs/endpoint.md), and
879
+ [methodology/walk_forward.md](methodology/walk_forward.md) for selection claims,
880
+ strictness boundaries, and audit metadata.
881
+
882
+ Phase 49B keeps this API stable. Endpoint-backed optimization prepares market
883
+ and fold state once and uses scalar-only trial reports by default. Audit the
884
+ lifecycle through `prepared_wfo_context`, `prepared_scoring_cache`,
885
+ `trial_ledger_mode`, and `performance_profile` in walk-forward metadata.
886
+ Nested Mode 1 also records `inner_validation`, `inner_fold_table`, and
887
+ `chronological_validation_claim` so services can distinguish retrospective,
888
+ selection-adjusted, and strict outer-OOS results.
889
+
756
890
  `scope="auto"` reports only the tested/OOS segment for walk-forward and
757
891
  train/test runs. Pass `scope="full"` when you need to audit the full stitched
758
892
  timeline.
@@ -802,7 +936,13 @@ backend, endpoint, or strategy route to use.
802
936
  | Market/limit/stop fill behavior | [Order fill policies](docs/order_fill_policies.md) |
803
937
  | Nautilus validation and report bundles | [Nautilus backend](docs/nautilus_backend.md) |
804
938
  | Pair, basket, hedge-ratio package behavior | [Pair and basket guide](docs/pair_basket_guide.md) |
939
+ | Causal WFO schedules, outer-OOS claims, and audit metadata | [Causal WFO guide](docs/walkforward_causal.md) |
805
940
  | Walk-forward methodology and anti-leakage scoring | [Walk-forward methodology](docs/walkforward_methodology_vi.md) |
941
+ | Opt-in Rust strategy templates, batch scoring, and causal OOS batch folds | [Native strategy IR and batch](docs/native_strategy_ir.md) |
942
+ | Python/Rust plan ownership and backend routing | [Execution-plan architecture](docs/architecture/execution-plan.md) |
943
+ | Exact staged core/native pair and maturity matrix | [Generated native compatibility](docs/contracts/generated_product_compatibility.md) |
944
+ | Build, clean-install, and verify local native wheels | [Native companion installation](docs/native/install.md) |
945
+ | Workload-scoped benchmark methodology | [Benchmarking governance](docs/performance/benchmarking.md) |
806
946
  | Runnable smoke templates | [Examples index](examples/README.md) |
807
947
 
808
948
  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"
7
+ version = "1.0.9"
8
8
  description = "Transparent, high-performance quantitative backtesting engine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
@@ -70,6 +70,7 @@ all = [
70
70
 
71
71
  [project.urls]
72
72
  Homepage = "https://github.com/BobbyAxerol/quantbt"
73
+ PyPI = "https://pypi.org/project/quantbt-engine/"
73
74
  Repository = "https://github.com/BobbyAxerol/quantbt"
74
75
  Issues = "https://github.com/BobbyAxerol/quantbt/issues"
75
76
  Documentation = "https://github.com/BobbyAxerol/quantbt/tree/main/docs"