akquant 0.2.46__tar.gz → 0.2.47__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 (509) hide show
  1. {akquant-0.2.46 → akquant-0.2.47}/Cargo.lock +1 -1
  2. {akquant-0.2.46 → akquant-0.2.47}/Cargo.toml +1 -1
  3. {akquant-0.2.46 → akquant-0.2.47}/PKG-INFO +1 -1
  4. {akquant-0.2.46 → akquant-0.2.47}/pyproject.toml +1 -1
  5. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/report.py +6 -0
  6. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/python.rs +2 -0
  7. akquant-0.2.47/src/pipeline/stages/channel.rs +261 -0
  8. akquant-0.2.47/src/pipeline/stages/cleanup.rs +17 -0
  9. akquant-0.2.47/src/pipeline/stages/data.rs +437 -0
  10. akquant-0.2.47/src/pipeline/stages/execution.rs +72 -0
  11. akquant-0.2.47/src/pipeline/stages/mod.rs +358 -0
  12. akquant-0.2.47/src/pipeline/stages/shared.rs +200 -0
  13. akquant-0.2.47/src/pipeline/stages/statistics.rs +48 -0
  14. akquant-0.2.47/src/pipeline/stages/strategy.rs +169 -0
  15. akquant-0.2.46/src/pipeline/stages.rs +0 -1513
  16. {akquant-0.2.46 → akquant-0.2.47}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  17. {akquant-0.2.46 → akquant-0.2.47}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {akquant-0.2.46 → akquant-0.2.47}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  19. {akquant-0.2.46 → akquant-0.2.47}/.github/workflows/deploy-docs.yml +0 -0
  20. {akquant-0.2.46 → akquant-0.2.47}/.github/workflows/docs-quality.yml +0 -0
  21. {akquant-0.2.46 → akquant-0.2.47}/.github/workflows/release.yml +0 -0
  22. {akquant-0.2.46 → akquant-0.2.47}/.gitignore +0 -0
  23. {akquant-0.2.46 → akquant-0.2.47}/.pre-commit-config.yaml +0 -0
  24. {akquant-0.2.46 → akquant-0.2.47}/CHANGELOG.md +0 -0
  25. {akquant-0.2.46 → akquant-0.2.47}/CODE_OF_CONDUCT.md +0 -0
  26. {akquant-0.2.46 → akquant-0.2.47}/CONTRIBUTING.md +0 -0
  27. {akquant-0.2.46 → akquant-0.2.47}/LICENSE +0 -0
  28. {akquant-0.2.46 → akquant-0.2.47}/README.md +0 -0
  29. {akquant-0.2.46 → akquant-0.2.47}/assets/dashboard_preview.png +0 -0
  30. {akquant-0.2.46 → akquant-0.2.47}/assets/logo.svg +0 -0
  31. {akquant-0.2.46 → akquant-0.2.47}/assets/social_preview.png +0 -0
  32. {akquant-0.2.46 → akquant-0.2.47}/docs/CNAME +0 -0
  33. {akquant-0.2.46 → akquant-0.2.47}/docs/assets/akquant-icon.svg +0 -0
  34. {akquant-0.2.46 → akquant-0.2.47}/docs/assets/akquant-logo.svg +0 -0
  35. {akquant-0.2.46 → akquant-0.2.47}/docs/assets/reports/akquant_report.html +0 -0
  36. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/analyzer_plugin_spec.md +0 -0
  37. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/broker_capability_matrix.md +0 -0
  38. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/custom_broker_production_checklist.md +0 -0
  39. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/custom_broker_registry.md +0 -0
  40. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/data_feed_adapter_spec.md +0 -0
  41. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/live_functional_quickstart.md +0 -0
  42. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/llm.md +0 -0
  43. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/ml.md +0 -0
  44. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/multi_strategy_guide.md +0 -0
  45. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/multi_timeframe_feed_api.md +0 -0
  46. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/runtime_config.md +0 -0
  47. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/strategy_style_decision.md +0 -0
  48. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/timezone.md +0 -0
  49. {akquant-0.2.46 → akquant-0.2.47}/docs/en/advanced/warm_start.md +0 -0
  50. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/analysis.md +0 -0
  51. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/cross_section_checklist.md +0 -0
  52. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/custom_indicator.md +0 -0
  53. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/data.md +0 -0
  54. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/examples.md +0 -0
  55. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/factor.md +0 -0
  56. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/indicator_scenario_quickref.md +0 -0
  57. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/optimization.md +0 -0
  58. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/python_basics.md +0 -0
  59. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/quant_basics.md +0 -0
  60. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/rust_indicator_reference.md +0 -0
  61. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/strategy.md +0 -0
  62. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/talib_indicator_playbook.md +0 -0
  63. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/testing.md +0 -0
  64. {akquant-0.2.46 → akquant-0.2.47}/docs/en/guide/visualization.md +0 -0
  65. {akquant-0.2.46 → akquant-0.2.47}/docs/en/index.md +0 -0
  66. {akquant-0.2.46 → akquant-0.2.47}/docs/en/meta/architecture.md +0 -0
  67. {akquant-0.2.46 → akquant-0.2.47}/docs/en/meta/internals.md +0 -0
  68. {akquant-0.2.46 → akquant-0.2.47}/docs/en/reference/api.md +0 -0
  69. {akquant-0.2.46 → akquant-0.2.47}/docs/en/start/first_strategy.md +0 -0
  70. {akquant-0.2.46 → akquant-0.2.47}/docs/en/start/installation.md +0 -0
  71. {akquant-0.2.46 → akquant-0.2.47}/docs/en/start/quickstart.md +0 -0
  72. {akquant-0.2.46 → akquant-0.2.47}/docs/en/start/setup_guide.md +0 -0
  73. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/01_foundations.md +0 -0
  74. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/02_programming.md +0 -0
  75. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/03_data.md +0 -0
  76. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/04_backtest_engine.md +0 -0
  77. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/05_strategy.md +0 -0
  78. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/06_stock_a.md +0 -0
  79. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/07_futures.md +0 -0
  80. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/08_options.md +0 -0
  81. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/09_funds.md +0 -0
  82. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/10_analysis.md +0 -0
  83. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/11_optimization.md +0 -0
  84. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/12_ml.md +0 -0
  85. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/13_visualization.md +0 -0
  86. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/14_factor.md +0 -0
  87. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/15_live_trading.md +0 -0
  88. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/16_rust_indicators.md +0 -0
  89. {akquant-0.2.46 → akquant-0.2.47}/docs/en/textbook/index.md +0 -0
  90. {akquant-0.2.46 → akquant-0.2.47}/docs/javascripts/mathjax.js +0 -0
  91. {akquant-0.2.46 → akquant-0.2.47}/docs/javascripts/search-lang-filter.js +0 -0
  92. {akquant-0.2.46 → akquant-0.2.47}/docs/robots.txt +0 -0
  93. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/analyzer_plugin_spec.md +0 -0
  94. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/broker_capability_matrix.md +0 -0
  95. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/custom_broker_production_checklist.md +0 -0
  96. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/custom_broker_registry.md +0 -0
  97. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/data_feed_adapter_spec.md +0 -0
  98. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/live_functional_quickstart.md +0 -0
  99. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/llm.md +0 -0
  100. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/ml.md +0 -0
  101. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/multi_strategy_guide.md +0 -0
  102. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/multi_timeframe_feed_api.md +0 -0
  103. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/runtime_config.md +0 -0
  104. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/strategy_style_decision.md +0 -0
  105. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/timezone.md +0 -0
  106. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/advanced/warm_start.md +0 -0
  107. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/analysis.md +0 -0
  108. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/cross_section_checklist.md +0 -0
  109. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/custom_indicator.md +0 -0
  110. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/data.md +0 -0
  111. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/examples.md +0 -0
  112. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/factor.md +0 -0
  113. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/indicator_scenario_quickref.md +0 -0
  114. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/optimization.md +0 -0
  115. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/python_basics.md +0 -0
  116. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/quant_basics.md +0 -0
  117. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/rust_indicator_reference.md +0 -0
  118. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/strategy.md +0 -0
  119. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/talib_indicator_playbook.md +0 -0
  120. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/testing.md +0 -0
  121. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/guide/visualization.md +0 -0
  122. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/index.md +0 -0
  123. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/meta/architecture.md +0 -0
  124. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/meta/internals.md +0 -0
  125. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/reference/api.md +0 -0
  126. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/start/first_strategy.md +0 -0
  127. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/start/installation.md +0 -0
  128. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/start/quickstart.md +0 -0
  129. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/start/setup_guide.md +0 -0
  130. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/00_glossary.md +0 -0
  131. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/01_foundations.md +0 -0
  132. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/02_programming.md +0 -0
  133. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/03_data.md +0 -0
  134. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/04_backtest_engine.md +0 -0
  135. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/05_strategy.md +0 -0
  136. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/06_stock_a.md +0 -0
  137. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/07_futures.md +0 -0
  138. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/08_options.md +0 -0
  139. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/09_funds.md +0 -0
  140. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/10_analysis.md +0 -0
  141. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/11_optimization.md +0 -0
  142. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/12_ml.md +0 -0
  143. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/13_visualization.md +0 -0
  144. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/14_factor.md +0 -0
  145. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/15_live_trading.md +0 -0
  146. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/16_rust_indicators.md +0 -0
  147. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/ROADMAP.md +0 -0
  148. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/appendix_cite.md +0 -0
  149. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/appendix_pitfalls.md +0 -0
  150. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/appendix_setup.md +0 -0
  151. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/capstone.md +0 -0
  152. {akquant-0.2.46 → akquant-0.2.47}/docs/zh/textbook/index.md +0 -0
  153. {akquant-0.2.46 → akquant-0.2.47}/examples/01_quickstart.py +0 -0
  154. {akquant-0.2.46 → akquant-0.2.47}/examples/02_parameter_optimization.py +0 -0
  155. {akquant-0.2.46 → akquant-0.2.47}/examples/03_parameter_optimization_advanced.py +0 -0
  156. {akquant-0.2.46 → akquant-0.2.47}/examples/04_mixed_assets.py +0 -0
  157. {akquant-0.2.46 → akquant-0.2.47}/examples/05_live_trading_ctp.py +0 -0
  158. {akquant-0.2.46 → akquant-0.2.47}/examples/06_complex_orders.py +0 -0
  159. {akquant-0.2.46 → akquant-0.2.47}/examples/07_option_test.py +0 -0
  160. {akquant-0.2.46 → akquant-0.2.47}/examples/08_event_callbacks.py +0 -0
  161. {akquant-0.2.46 → akquant-0.2.47}/examples/09_ml_framework.py +0 -0
  162. {akquant-0.2.46 → akquant-0.2.47}/examples/10_ml_walk_forward.py +0 -0
  163. {akquant-0.2.46 → akquant-0.2.47}/examples/11_plot_visualization.py +0 -0
  164. {akquant-0.2.46 → akquant-0.2.47}/examples/12_wfo_integrated.py +0 -0
  165. {akquant-0.2.46 → akquant-0.2.47}/examples/13_quantstats_report.py +0 -0
  166. {akquant-0.2.46 → akquant-0.2.47}/examples/14_multi_frequency.py +0 -0
  167. {akquant-0.2.46 → akquant-0.2.47}/examples/15_plot_intraday.py +0 -0
  168. {akquant-0.2.46 → akquant-0.2.47}/examples/16_adj_returns_signal.py +0 -0
  169. {akquant-0.2.46 → akquant-0.2.47}/examples/17_readme_demo.py +0 -0
  170. {akquant-0.2.46 → akquant-0.2.47}/examples/18_benchmark_multisymbol.py +0 -0
  171. {akquant-0.2.46 → akquant-0.2.47}/examples/19_factor_expression.py +0 -0
  172. {akquant-0.2.46 → akquant-0.2.47}/examples/20_risk_management_demo.py +0 -0
  173. {akquant-0.2.46 → akquant-0.2.47}/examples/21_warm_start_demo.py +0 -0
  174. {akquant-0.2.46 → akquant-0.2.47}/examples/22_strategy_runtime_config_demo.py +0 -0
  175. {akquant-0.2.46 → akquant-0.2.47}/examples/23_functional_callbacks_demo.py +0 -0
  176. {akquant-0.2.46 → akquant-0.2.47}/examples/24_functional_tick_simulation_demo.py +0 -0
  177. {akquant-0.2.46 → akquant-0.2.47}/examples/25_streaming_backtest_demo.py +0 -0
  178. {akquant-0.2.46 → akquant-0.2.47}/examples/26_streaming_quickstart.py +0 -0
  179. {akquant-0.2.46 → akquant-0.2.47}/examples/27_streaming_monitoring_console.py +0 -0
  180. {akquant-0.2.46 → akquant-0.2.47}/examples/28_streaming_alerts_and_persist.py +0 -0
  181. {akquant-0.2.46 → akquant-0.2.47}/examples/29_streaming_event_report.py +0 -0
  182. {akquant-0.2.46 → akquant-0.2.47}/examples/30_streaming_report_oneclick.py +0 -0
  183. {akquant-0.2.46 → akquant-0.2.47}/examples/31_streaming_live_console.py +0 -0
  184. {akquant-0.2.46 → akquant-0.2.47}/examples/32_streaming_live_web.py +0 -0
  185. {akquant-0.2.46 → akquant-0.2.47}/examples/33_report_and_analysis_outputs.py +0 -0
  186. {akquant-0.2.46 → akquant-0.2.47}/examples/34_multi_strategy_demo.py +0 -0
  187. {akquant-0.2.46 → akquant-0.2.47}/examples/35_custom_broker_registry_demo.py +0 -0
  188. {akquant-0.2.46 → akquant-0.2.47}/examples/36_trailing_orders.py +0 -0
  189. {akquant-0.2.46 → akquant-0.2.47}/examples/37_feed_replay_alignment_demo.py +0 -0
  190. {akquant-0.2.46 → akquant-0.2.47}/examples/38_live_functional_strategy_demo.py +0 -0
  191. {akquant-0.2.46 → akquant-0.2.47}/examples/39_live_broker_submit_order_demo.py +0 -0
  192. {akquant-0.2.46 → akquant-0.2.47}/examples/40_functional_multi_slot_risk_demo.py +0 -0
  193. {akquant-0.2.46 → akquant-0.2.47}/examples/41_live_multi_slot_orchestration_demo.py +0 -0
  194. {akquant-0.2.46 → akquant-0.2.47}/examples/42_live_broker_event_audit_demo.py +0 -0
  195. {akquant-0.2.46 → akquant-0.2.47}/examples/43_target_weights_rebalance.py +0 -0
  196. {akquant-0.2.46 → akquant-0.2.47}/examples/44_strategy_source_loader_demo.py +0 -0
  197. {akquant-0.2.46 → akquant-0.2.47}/examples/45_talib_indicator_playbook_demo.py +0 -0
  198. {akquant-0.2.46 → akquant-0.2.47}/examples/46_broker_profile_demo.py +0 -0
  199. {akquant-0.2.46 → akquant-0.2.47}/examples/47_margin_liquidation_audit_demo.py +0 -0
  200. {akquant-0.2.46 → akquant-0.2.47}/examples/48_margin_liquidation_priority_compare.py +0 -0
  201. {akquant-0.2.46 → akquant-0.2.47}/examples/49_on_expiry_demo.py +0 -0
  202. {akquant-0.2.46 → akquant-0.2.47}/examples/50_framework_hooks_demo.py +0 -0
  203. {akquant-0.2.46 → akquant-0.2.47}/examples/51_class_tick_callbacks_demo.py +0 -0
  204. {akquant-0.2.46 → akquant-0.2.47}/examples/52_pre_open_demo.py +0 -0
  205. {akquant-0.2.46 → akquant-0.2.47}/examples/53_timer_to_pre_open_demo.py +0 -0
  206. {akquant-0.2.46 → akquant-0.2.47}/examples/54_functional_pre_open_demo.py +0 -0
  207. {akquant-0.2.46 → akquant-0.2.47}/examples/55_functional_ml_walk_forward.py +0 -0
  208. {akquant-0.2.46 → akquant-0.2.47}/examples/56_functional_warm_start_demo.py +0 -0
  209. {akquant-0.2.46 → akquant-0.2.47}/examples/57_functional_multi_slot_warm_start_demo.py +0 -0
  210. {akquant-0.2.46 → akquant-0.2.47}/examples/58_incremental_bootstrap_demo.py +0 -0
  211. {akquant-0.2.46 → akquant-0.2.47}/examples/59_akshare_etf_rotation.py +0 -0
  212. {akquant-0.2.46 → akquant-0.2.47}/examples/60_custom_indicator_demo.py +0 -0
  213. {akquant-0.2.46 → akquant-0.2.47}/examples/61_indicator_visualization_export_demo.py +0 -0
  214. {akquant-0.2.46 → akquant-0.2.47}/examples/62_indicator_streaming_demo.py +0 -0
  215. {akquant-0.2.46 → akquant-0.2.47}/examples/63_indicator_ws_bridge_demo.py +0 -0
  216. {akquant-0.2.46 → akquant-0.2.47}/examples/64_indicator_live_web.py +0 -0
  217. {akquant-0.2.46 → akquant-0.2.47}/examples/README.md +0 -0
  218. {akquant-0.2.46 → akquant-0.2.47}/examples/benchmark_utils.py +0 -0
  219. {akquant-0.2.46 → akquant-0.2.47}/examples/pb_mock.py +0 -0
  220. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/01_stock_dual_moving_average.py +0 -0
  221. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/02_stock_grid_trading.py +0 -0
  222. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/03_stock_atr_breakout.py +0 -0
  223. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/04_stock_momentum_rotation.py +0 -0
  224. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/05_stock_momentum_rotation_timer.py +0 -0
  225. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/06_stock_momentum_rotation_bucket.py +0 -0
  226. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/07_stock_momentum_rotation_on_timer.py +0 -0
  227. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/08_target_positions_long_short.py +0 -0
  228. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/09_stock_momentum_rotation_after_bar.py +0 -0
  229. {akquant-0.2.46 → akquant-0.2.47}/examples/strategies/README.md +0 -0
  230. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch01_quickstart.py +0 -0
  231. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch02_programming.py +0 -0
  232. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch03_data.py +0 -0
  233. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch04_comparison.py +0 -0
  234. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch05_strategy.py +0 -0
  235. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch06_stock_a.py +0 -0
  236. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch07_futures.py +0 -0
  237. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch08_options.py +0 -0
  238. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch09_funds.py +0 -0
  239. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch09_portfolio.py +0 -0
  240. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch10_analysis.py +0 -0
  241. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch11_optimization.py +0 -0
  242. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch12_ml.py +0 -0
  243. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch13_visualization.py +0 -0
  244. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch14_factor.py +0 -0
  245. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch15_live_trading.py +0 -0
  246. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch15_strategy_loader.py +0 -0
  247. {akquant-0.2.46 → akquant-0.2.47}/examples/textbook/ch16_indicators.py +0 -0
  248. {akquant-0.2.46 → akquant-0.2.47}/mkdocs.yml +0 -0
  249. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/__init__.py +0 -0
  250. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/akquant.pyi +0 -0
  251. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/analysis/__init__.py +0 -0
  252. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/analysis/benchmark.py +0 -0
  253. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/analyzer_plugin.py +0 -0
  254. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/backtest/__init__.py +0 -0
  255. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/backtest/__init__.pyi +0 -0
  256. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/backtest/engine.py +0 -0
  257. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/backtest/result.py +0 -0
  258. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/checkpoint.py +0 -0
  259. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/config.py +0 -0
  260. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/data.py +0 -0
  261. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/factor/__init__.py +0 -0
  262. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/factor/engine.py +0 -0
  263. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/factor/ops.py +0 -0
  264. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/factor/parser.py +0 -0
  265. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/feed_adapter.py +0 -0
  266. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/fund/__init__.py +0 -0
  267. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/futures/__init__.py +0 -0
  268. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/__init__.py +0 -0
  269. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/base.py +0 -0
  270. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/broker_event_bridge.py +0 -0
  271. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/broker_event_mapper.py +0 -0
  272. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/broker_models.py +0 -0
  273. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/broker_recovery.py +0 -0
  274. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/broker_runtime.py +0 -0
  275. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/__init__.py +0 -0
  276. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/ctp/__init__.py +0 -0
  277. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/ctp/adapter.py +0 -0
  278. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/ctp/native.py +0 -0
  279. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/miniqmt/__init__.py +0 -0
  280. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/miniqmt/stub.py +0 -0
  281. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/ptrade/__init__.py +0 -0
  282. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/brokers/ptrade/stub.py +0 -0
  283. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/ctp_adapter.py +0 -0
  284. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/ctp_native.py +0 -0
  285. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/factory.py +0 -0
  286. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/mapper.py +0 -0
  287. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/miniqmt.py +0 -0
  288. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/models.py +0 -0
  289. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/order_submitter.py +0 -0
  290. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/protocols.py +0 -0
  291. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/ptrade.py +0 -0
  292. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/gateway/registry.py +0 -0
  293. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/indicator.py +0 -0
  294. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/indicator_recording.py +0 -0
  295. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/indicator_stream.py +0 -0
  296. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/live.py +0 -0
  297. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/log.py +0 -0
  298. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/ml/__init__.py +0 -0
  299. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/ml/model.py +0 -0
  300. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/optimize.py +0 -0
  301. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/option/__init__.py +0 -0
  302. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/params.py +0 -0
  303. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/params_adapter.py +0 -0
  304. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/__init__.py +0 -0
  305. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/analysis.py +0 -0
  306. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/dashboard.py +0 -0
  307. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/indicator.py +0 -0
  308. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/strategy.py +0 -0
  309. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/plot/utils.py +0 -0
  310. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/py.typed +0 -0
  311. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/risk.py +0 -0
  312. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/sizer.py +0 -0
  313. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/stock/__init__.py +0 -0
  314. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy.py +0 -0
  315. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_events.py +0 -0
  316. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_framework_hooks.py +0 -0
  317. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_history.py +0 -0
  318. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_loader.py +0 -0
  319. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_logging.py +0 -0
  320. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_ml.py +0 -0
  321. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_order_events.py +0 -0
  322. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_position.py +0 -0
  323. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_scheduler.py +0 -0
  324. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_time.py +0 -0
  325. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/strategy_trading_api.py +0 -0
  326. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/talib/__init__.py +0 -0
  327. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/talib/backend.py +0 -0
  328. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/talib/core.py +0 -0
  329. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/talib/funcs.py +0 -0
  330. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/utils/__init__.py +0 -0
  331. {akquant-0.2.46 → akquant-0.2.47}/python/akquant/utils/inspector.py +0 -0
  332. {akquant-0.2.46 → akquant-0.2.47}/requirements-dev.txt +0 -0
  333. {akquant-0.2.46 → akquant-0.2.47}/scripts/cargo-test.sh +0 -0
  334. {akquant-0.2.46 → akquant-0.2.47}/scripts/check_docs_api_examples.py +0 -0
  335. {akquant-0.2.46 → akquant-0.2.47}/scripts/check_docs_links.py +0 -0
  336. {akquant-0.2.46 → akquant-0.2.47}/scripts/dev-check.sh +0 -0
  337. {akquant-0.2.46 → akquant-0.2.47}/scripts/find_legacy_execution_policy_calls.py +0 -0
  338. {akquant-0.2.46 → akquant-0.2.47}/scripts/golden_baseline_report.py +0 -0
  339. {akquant-0.2.46 → akquant-0.2.47}/src/account.rs +0 -0
  340. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/mod.rs +0 -0
  341. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/result.rs +0 -0
  342. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/tests.rs +0 -0
  343. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/tracker.rs +0 -0
  344. {akquant-0.2.46 → akquant-0.2.47}/src/analysis/types.rs +0 -0
  345. {akquant-0.2.46 → akquant-0.2.47}/src/bin/stub_gen.rs +0 -0
  346. {akquant-0.2.46 → akquant-0.2.47}/src/clock.rs +0 -0
  347. {akquant-0.2.46 → akquant-0.2.47}/src/context.rs +0 -0
  348. {akquant-0.2.46 → akquant-0.2.47}/src/data/aggregator.rs +0 -0
  349. {akquant-0.2.46 → akquant-0.2.47}/src/data/batch.rs +0 -0
  350. {akquant-0.2.46 → akquant-0.2.47}/src/data/client.rs +0 -0
  351. {akquant-0.2.46 → akquant-0.2.47}/src/data/feed.rs +0 -0
  352. {akquant-0.2.46 → akquant-0.2.47}/src/data/mod.rs +0 -0
  353. {akquant-0.2.46 → akquant-0.2.47}/src/engine/core.rs +0 -0
  354. {akquant-0.2.46 → akquant-0.2.47}/src/engine/mod.rs +0 -0
  355. {akquant-0.2.46 → akquant-0.2.47}/src/engine/python.rs +0 -0
  356. {akquant-0.2.46 → akquant-0.2.47}/src/engine/state.rs +0 -0
  357. {akquant-0.2.46 → akquant-0.2.47}/src/error.rs +0 -0
  358. {akquant-0.2.46 → akquant-0.2.47}/src/event.rs +0 -0
  359. {akquant-0.2.46 → akquant-0.2.47}/src/event_manager.rs +0 -0
  360. {akquant-0.2.46 → akquant-0.2.47}/src/execution/common.rs +0 -0
  361. {akquant-0.2.46 → akquant-0.2.47}/src/execution/crypto.rs +0 -0
  362. {akquant-0.2.46 → akquant-0.2.47}/src/execution/forex.rs +0 -0
  363. {akquant-0.2.46 → akquant-0.2.47}/src/execution/futures.rs +0 -0
  364. {akquant-0.2.46 → akquant-0.2.47}/src/execution/matcher.rs +0 -0
  365. {akquant-0.2.46 → akquant-0.2.47}/src/execution/mod.rs +0 -0
  366. {akquant-0.2.46 → akquant-0.2.47}/src/execution/option.rs +0 -0
  367. {akquant-0.2.46 → akquant-0.2.47}/src/execution/python.rs +0 -0
  368. {akquant-0.2.46 → akquant-0.2.47}/src/execution/realtime.rs +0 -0
  369. {akquant-0.2.46 → akquant-0.2.47}/src/execution/simulated.rs +0 -0
  370. {akquant-0.2.46 → akquant-0.2.47}/src/execution/slippage.rs +0 -0
  371. {akquant-0.2.46 → akquant-0.2.47}/src/execution/stock.rs +0 -0
  372. {akquant-0.2.46 → akquant-0.2.47}/src/history.rs +0 -0
  373. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/momentum.rs +0 -0
  374. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/momentum_oscillators.rs +0 -0
  375. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/momentum_rates.rs +0 -0
  376. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/moving_average.rs +0 -0
  377. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/moving_average_compound.rs +0 -0
  378. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/moving_average_core.rs +0 -0
  379. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/moving_average_transforms.rs +0 -0
  380. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/moving_average_windowed.rs +0 -0
  381. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/trend.rs +0 -0
  382. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/trend_directional.rs +0 -0
  383. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/trend_oscillators.rs +0 -0
  384. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/trend_regression.rs +0 -0
  385. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/volatility.rs +0 -0
  386. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/volatility_price.rs +0 -0
  387. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/volatility_stats.rs +0 -0
  388. {akquant-0.2.46 → akquant-0.2.47}/src/indicators/volume.rs +0 -0
  389. {akquant-0.2.46 → akquant-0.2.47}/src/indicators.rs +0 -0
  390. {akquant-0.2.46 → akquant-0.2.47}/src/lib.rs +0 -0
  391. {akquant-0.2.46 → akquant-0.2.47}/src/log_context.rs +0 -0
  392. {akquant-0.2.46 → akquant-0.2.47}/src/margin/calculator.rs +0 -0
  393. {akquant-0.2.46 → akquant-0.2.47}/src/margin/engine.rs +0 -0
  394. {akquant-0.2.46 → akquant-0.2.47}/src/margin/mod.rs +0 -0
  395. {akquant-0.2.46 → akquant-0.2.47}/src/market/china.rs +0 -0
  396. {akquant-0.2.46 → akquant-0.2.47}/src/market/core.rs +0 -0
  397. {akquant-0.2.46 → akquant-0.2.47}/src/market/corporate_action.rs +0 -0
  398. {akquant-0.2.46 → akquant-0.2.47}/src/market/fund.rs +0 -0
  399. {akquant-0.2.46 → akquant-0.2.47}/src/market/futures.rs +0 -0
  400. {akquant-0.2.46 → akquant-0.2.47}/src/market/manager.rs +0 -0
  401. {akquant-0.2.46 → akquant-0.2.47}/src/market/mod.rs +0 -0
  402. {akquant-0.2.46 → akquant-0.2.47}/src/market/option.rs +0 -0
  403. {akquant-0.2.46 → akquant-0.2.47}/src/market/simple.rs +0 -0
  404. {akquant-0.2.46 → akquant-0.2.47}/src/market/stock.rs +0 -0
  405. {akquant-0.2.46 → akquant-0.2.47}/src/model/corporate_action.rs +0 -0
  406. {akquant-0.2.46 → akquant-0.2.47}/src/model/instrument.rs +0 -0
  407. {akquant-0.2.46 → akquant-0.2.47}/src/model/market_data.rs +0 -0
  408. {akquant-0.2.46 → akquant-0.2.47}/src/model/mod.rs +0 -0
  409. {akquant-0.2.46 → akquant-0.2.47}/src/model/order.rs +0 -0
  410. {akquant-0.2.46 → akquant-0.2.47}/src/model/timer.rs +0 -0
  411. {akquant-0.2.46 → akquant-0.2.47}/src/model/types.rs +0 -0
  412. {akquant-0.2.46 → akquant-0.2.47}/src/order_manager.rs +0 -0
  413. {akquant-0.2.46 → akquant-0.2.47}/src/pipeline/mod.rs +0 -0
  414. {akquant-0.2.46 → akquant-0.2.47}/src/pipeline/processor.rs +0 -0
  415. {akquant-0.2.46 → akquant-0.2.47}/src/pipeline/runner.rs +0 -0
  416. {akquant-0.2.46 → akquant-0.2.47}/src/portfolio.rs +0 -0
  417. {akquant-0.2.46 → akquant-0.2.47}/src/risk/common.rs +0 -0
  418. {akquant-0.2.46 → akquant-0.2.47}/src/risk/config.rs +0 -0
  419. {akquant-0.2.46 → akquant-0.2.47}/src/risk/futures.rs +0 -0
  420. {akquant-0.2.46 → akquant-0.2.47}/src/risk/manager.rs +0 -0
  421. {akquant-0.2.46 → akquant-0.2.47}/src/risk/mod.rs +0 -0
  422. {akquant-0.2.46 → akquant-0.2.47}/src/risk/option.rs +0 -0
  423. {akquant-0.2.46 → akquant-0.2.47}/src/risk/portfolio.rs +0 -0
  424. {akquant-0.2.46 → akquant-0.2.47}/src/risk/rule.rs +0 -0
  425. {akquant-0.2.46 → akquant-0.2.47}/src/risk/stock.rs +0 -0
  426. {akquant-0.2.46 → akquant-0.2.47}/src/settlement/expiry.rs +0 -0
  427. {akquant-0.2.46 → akquant-0.2.47}/src/settlement/handler.rs +0 -0
  428. {akquant-0.2.46 → akquant-0.2.47}/src/settlement/manager.rs +0 -0
  429. {akquant-0.2.46 → akquant-0.2.47}/src/settlement/mod.rs +0 -0
  430. {akquant-0.2.46 → akquant-0.2.47}/src/settlement/option.rs +0 -0
  431. {akquant-0.2.46 → akquant-0.2.47}/src/statistics/mod.rs +0 -0
  432. {akquant-0.2.46 → akquant-0.2.47}/tests/gateway_contract/test_event_bridge_contract.py +0 -0
  433. {akquant-0.2.46 → akquant-0.2.47}/tests/gateway_contract/test_recovery_contract.py +0 -0
  434. {akquant-0.2.46 → akquant-0.2.47}/tests/gateway_contract/test_submitter_contract.py +0 -0
  435. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/BASELINE_REPORT.md +0 -0
  436. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/LEGACY_EXECUTION_CALLS.md +0 -0
  437. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/futures_margin/equity_curve.parquet +0 -0
  438. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/futures_margin/metrics.json +0 -0
  439. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/futures_margin/orders.parquet +0 -0
  440. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/option_basic/equity_curve.parquet +0 -0
  441. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/option_basic/metrics.json +0 -0
  442. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/option_basic/orders.parquet +0 -0
  443. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/stock_t1/equity_curve.parquet +0 -0
  444. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/stock_t1/metrics.json +0 -0
  445. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/stock_t1/orders.parquet +0 -0
  446. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/baselines/stock_t1/trades.parquet +0 -0
  447. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/futures_margin/equity_curve.parquet +0 -0
  448. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/futures_margin/metrics.json +0 -0
  449. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/futures_margin/orders.parquet +0 -0
  450. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/option_basic/equity_curve.parquet +0 -0
  451. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/option_basic/metrics.json +0 -0
  452. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/option_basic/orders.parquet +0 -0
  453. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/stock_t1/equity_curve.parquet +0 -0
  454. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/stock_t1/metrics.json +0 -0
  455. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/stock_t1/orders.parquet +0 -0
  456. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/current/stock_t1/trades.parquet +0 -0
  457. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/future_margin.parquet +0 -0
  458. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/future_margin.parquet.sha256 +0 -0
  459. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/option_basic.parquet +0 -0
  460. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/option_basic.parquet.sha256 +0 -0
  461. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/stock_t1.parquet +0 -0
  462. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/data/stock_t1.parquet.sha256 +0 -0
  463. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/gen_data.py +0 -0
  464. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/runner.py +0 -0
  465. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/strategies/futures_margin.py +0 -0
  466. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/strategies/option_basic.py +0 -0
  467. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/strategies/stock_t1.py +0 -0
  468. {akquant-0.2.46 → akquant-0.2.47}/tests/golden/test_golden.py +0 -0
  469. {akquant-0.2.46 → akquant-0.2.47}/tests/test_account_risk_rules.py +0 -0
  470. {akquant-0.2.46 → akquant-0.2.47}/tests/test_custom_matcher.py +0 -0
  471. {akquant-0.2.46 → akquant-0.2.47}/tests/test_data_catalog.py +0 -0
  472. {akquant-0.2.46 → akquant-0.2.47}/tests/test_docs_api_examples.py +0 -0
  473. {akquant-0.2.46 → akquant-0.2.47}/tests/test_docs_links.py +0 -0
  474. {akquant-0.2.46 → akquant-0.2.47}/tests/test_engine.py +0 -0
  475. {akquant-0.2.46 → akquant-0.2.47}/tests/test_examples_regression.py +0 -0
  476. {akquant-0.2.46 → akquant-0.2.47}/tests/test_factor_engine.py +0 -0
  477. {akquant-0.2.46 → akquant-0.2.47}/tests/test_factor_ops.py +0 -0
  478. {akquant-0.2.46 → akquant-0.2.47}/tests/test_feed_adapter.py +0 -0
  479. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_brokers_paths.py +0 -0
  480. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_callbacks.py +0 -0
  481. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_ctp_adapter.py +0 -0
  482. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_ctp_native.py +0 -0
  483. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_factory.py +0 -0
  484. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_mapper.py +0 -0
  485. {akquant-0.2.46 → akquant-0.2.47}/tests/test_gateway_registry.py +0 -0
  486. {akquant-0.2.46 → akquant-0.2.47}/tests/test_indicator_live_web_example.py +0 -0
  487. {akquant-0.2.46 → akquant-0.2.47}/tests/test_indicator_recording.py +0 -0
  488. {akquant-0.2.46 → akquant-0.2.47}/tests/test_inspector.py +0 -0
  489. {akquant-0.2.46 → akquant-0.2.47}/tests/test_live_runner.py +0 -0
  490. {akquant-0.2.46 → akquant-0.2.47}/tests/test_live_runner_broker_bridge.py +0 -0
  491. {akquant-0.2.46 → akquant-0.2.47}/tests/test_live_runner_broker_recovery.py +0 -0
  492. {akquant-0.2.46 → akquant-0.2.47}/tests/test_live_runner_broker_submitter.py +0 -0
  493. {akquant-0.2.46 → akquant-0.2.47}/tests/test_multisymbol_cross_section_consistency.py +0 -0
  494. {akquant-0.2.46 → akquant-0.2.47}/tests/test_orders_df.py +0 -0
  495. {akquant-0.2.46 → akquant-0.2.47}/tests/test_params_adapter.py +0 -0
  496. {akquant-0.2.46 → akquant-0.2.47}/tests/test_partial_filled_status.py +0 -0
  497. {akquant-0.2.46 → akquant-0.2.47}/tests/test_portfolio.py +0 -0
  498. {akquant-0.2.46 → akquant-0.2.47}/tests/test_quickstart_stream_consistency.py +0 -0
  499. {akquant-0.2.46 → akquant-0.2.47}/tests/test_report_helpers.py +0 -0
  500. {akquant-0.2.46 → akquant-0.2.47}/tests/test_report_plot_extensions.py +0 -0
  501. {akquant-0.2.46 → akquant-0.2.47}/tests/test_result_analysis_extensions.py +0 -0
  502. {akquant-0.2.46 → akquant-0.2.47}/tests/test_stop_orders.py +0 -0
  503. {akquant-0.2.46 → akquant-0.2.47}/tests/test_strategy_extras.py +0 -0
  504. {akquant-0.2.46 → akquant-0.2.47}/tests/test_strategy_timers_indicators.py +0 -0
  505. {akquant-0.2.46 → akquant-0.2.47}/tests/test_t_plus_one.py +0 -0
  506. {akquant-0.2.46 → akquant-0.2.47}/tests/test_talib_backend.py +0 -0
  507. {akquant-0.2.46 → akquant-0.2.47}/tests/test_talib_compat.py +0 -0
  508. {akquant-0.2.46 → akquant-0.2.47}/tests/test_trades_df.py +0 -0
  509. {akquant-0.2.46 → akquant-0.2.47}/tests/test_version.py +0 -0
@@ -30,7 +30,7 @@ dependencies = [
30
30
 
31
31
  [[package]]
32
32
  name = "akquant"
33
- version = "0.2.46"
33
+ version = "0.2.47"
34
34
  dependencies = [
35
35
  "anyhow",
36
36
  "chrono",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "akquant"
3
- version = "0.2.46"
3
+ version = "0.2.47"
4
4
  edition = "2024"
5
5
  description = "High-performance quantitative trading framework based on Rust and Python"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akquant
3
- Version: 0.2.46
3
+ Version: 0.2.47
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "akquant"
7
- version = "0.2.46"
7
+ version = "0.2.47"
8
8
  description = "High-performance quantitative trading framework based on Rust and Python"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT License"}
@@ -793,6 +793,12 @@ def _build_metrics_html(result: Any) -> str:
793
793
  format_metric_value("max_drawdown_pct", metrics.max_drawdown_pct),
794
794
  "negative",
795
795
  ),
796
+ (
797
+ "最大回撤金额 (Max DD Amount)",
798
+ _get_metric_value(result, metrics, "max_drawdown_value"),
799
+ _format_currency(_get_metric_value(result, metrics, "max_drawdown_value")),
800
+ "negative",
801
+ ),
796
802
  (
797
803
  "波动率 (Volatility)",
798
804
  metrics.volatility,
@@ -474,6 +474,7 @@ impl BacktestResult {
474
474
  "total_loss",
475
475
  "total_commission",
476
476
  "max_drawdown",
477
+ "max_drawdown_value",
477
478
  "max_drawdown_pct",
478
479
  "win_rate",
479
480
  "loss_rate",
@@ -562,6 +563,7 @@ impl BacktestResult {
562
563
  push_f64(t_metrics.total_profit);
563
564
  push_f64(t_metrics.total_loss);
564
565
  push_f64(t_metrics.total_commission);
566
+ push_f64(metrics.max_drawdown);
565
567
  push_f64(metrics.max_drawdown_value);
566
568
  push_f64(metrics.max_drawdown_pct);
567
569
  push_f64(t_metrics.win_rate);
@@ -0,0 +1,261 @@
1
+ use super::shared::{
2
+ ExecutionPhase, apply_execution_report, flush_accumulated_trades, has_orders_matching_phase,
3
+ };
4
+ use crate::context::EngineContext;
5
+ use crate::engine::Engine;
6
+ use crate::event::Event;
7
+ use crate::model::{Order, OrderStatus};
8
+ use crate::pipeline::processor::{Processor, ProcessorResult};
9
+ use pyo3::prelude::*;
10
+ use std::collections::{HashMap, HashSet};
11
+
12
+ pub struct ChannelProcessor;
13
+ fn process_order_request(engine: &mut Engine, py: Python<'_>, mut order: Order) {
14
+ let current_time = engine.context_timestamp();
15
+ engine.maybe_reset_risk_budget_usage(current_time);
16
+ let mut strategy_limit_err = engine.check_strategy_risk_cooldown_mode(&order);
17
+ let mut triggers_risk_fallback = false;
18
+ if strategy_limit_err.is_none() {
19
+ strategy_limit_err = engine.check_strategy_reduce_only_mode(&order);
20
+ }
21
+ if strategy_limit_err.is_none() {
22
+ strategy_limit_err = engine
23
+ .check_strategy_order_size_limit(&order)
24
+ .or_else(|| engine.check_strategy_position_size_limit(&order))
25
+ .or_else(|| engine.check_strategy_order_value_limit(&order));
26
+ triggers_risk_fallback = strategy_limit_err.is_some();
27
+ }
28
+ if strategy_limit_err.is_none() {
29
+ strategy_limit_err = engine.check_strategy_daily_loss_limit(&order, current_time);
30
+ triggers_risk_fallback = strategy_limit_err.is_some();
31
+ }
32
+ if strategy_limit_err.is_none() {
33
+ strategy_limit_err = engine.check_strategy_drawdown_limit(&order);
34
+ triggers_risk_fallback = strategy_limit_err.is_some();
35
+ }
36
+ if strategy_limit_err.is_none() {
37
+ strategy_limit_err = engine.check_strategy_risk_budget_limit(&order);
38
+ }
39
+ if strategy_limit_err.is_none() {
40
+ strategy_limit_err = engine.check_portfolio_risk_budget_limit(&order);
41
+ }
42
+ if triggers_risk_fallback {
43
+ engine.activate_strategy_reduce_only_if_configured(&order);
44
+ engine.activate_strategy_risk_cooldown_if_configured(&order);
45
+ }
46
+ let strategy_limit_err = strategy_limit_err.map(crate::error::AkQuantError::OrderError);
47
+ let check_result = if let Some(err) = strategy_limit_err {
48
+ Err(err)
49
+ } else {
50
+ let ctx = EngineContext {
51
+ instruments: &engine.instruments,
52
+ portfolio: &engine.state.portfolio,
53
+ last_prices: &engine.last_prices,
54
+ trade_tracker: &engine.state.order_manager.trade_tracker,
55
+ market_model: engine.market_manager.model.as_ref(),
56
+ execution_policy_core: engine.execution_policy_core(),
57
+ bar_index: engine.bar_count,
58
+ current_time,
59
+ session: engine.clock.session,
60
+ active_orders: &engine.state.order_manager.active_orders,
61
+ risk_config: &engine.risk_manager.config,
62
+ timezone_name: engine.timezone_name.as_deref(),
63
+ timezone_offset: engine.timezone_offset,
64
+ };
65
+ engine.risk_manager.check_and_adjust(&mut order, &ctx)
66
+ };
67
+ if let Err(err) = check_result {
68
+ order.status = OrderStatus::Rejected;
69
+ order.reject_reason = err.to_string();
70
+ order.updated_at = current_time;
71
+
72
+ let mut risk_payload = HashMap::new();
73
+ risk_payload.insert("order_id", order.id.clone());
74
+ risk_payload.insert("symbol", order.symbol.clone());
75
+ risk_payload.insert("reason", order.reject_reason.clone());
76
+ risk_payload.insert(
77
+ "owner_strategy_id",
78
+ order.owner_strategy_id.clone().unwrap_or_default(),
79
+ );
80
+ engine.emit_stream_event(
81
+ py,
82
+ "risk",
83
+ Some(order.symbol.as_str()),
84
+ "warn",
85
+ risk_payload,
86
+ );
87
+ let _ = engine
88
+ .event_manager
89
+ .send(Event::ExecutionReport(order, None));
90
+ } else {
91
+ let mut order_payload = HashMap::new();
92
+ order_payload.insert("order_id", order.id.clone());
93
+ order_payload.insert("status", format!("{:?}", OrderStatus::New));
94
+ order_payload.insert("symbol", order.symbol.clone());
95
+ order_payload.insert(
96
+ "owner_strategy_id",
97
+ order.owner_strategy_id.clone().unwrap_or_default(),
98
+ );
99
+ engine.emit_stream_event(
100
+ py,
101
+ "order",
102
+ Some(order.symbol.as_str()),
103
+ "info",
104
+ order_payload,
105
+ );
106
+ if !engine.risk_budget_use_trade_mode() {
107
+ engine.apply_risk_budget_usage(&order);
108
+ }
109
+ let _ = engine.event_manager.send(Event::OrderValidated(order));
110
+ }
111
+ }
112
+ fn should_run_post_strategy_match_now(engine: &Engine, orders: &[Order]) -> bool {
113
+ has_orders_matching_phase(engine, &ExecutionPhase::PostStrategy, orders)
114
+ }
115
+
116
+ fn is_reduce_first_order(order: &Order) -> bool {
117
+ crate::model::is_reduce_first_order(order.side, order.position_effect)
118
+ }
119
+
120
+ fn emit_execution_reports_for_current_event(engine: &mut Engine) {
121
+ let Some(event) = engine.current_event.clone() else {
122
+ return;
123
+ };
124
+
125
+ if !matches!(event, Event::Bar(_) | Event::Tick(_) | Event::Timer(_)) {
126
+ return;
127
+ }
128
+
129
+ let ctx = EngineContext {
130
+ instruments: &engine.instruments,
131
+ portfolio: &engine.state.portfolio,
132
+ last_prices: &engine.last_prices,
133
+ trade_tracker: &engine.state.order_manager.trade_tracker,
134
+ market_model: engine.market_manager.model.as_ref(),
135
+ execution_policy_core: engine.execution_policy_core(),
136
+ bar_index: engine.bar_count,
137
+ current_time: engine.context_timestamp(),
138
+ session: engine.clock.session,
139
+ active_orders: &engine.state.order_manager.active_orders,
140
+ risk_config: &engine.risk_manager.config,
141
+ timezone_name: engine.timezone_name.as_deref(),
142
+ timezone_offset: engine.timezone_offset,
143
+ };
144
+
145
+ let reports = engine.execution_model.on_event(&event, &ctx);
146
+ for report in reports {
147
+ let _ = engine.event_manager.send(report);
148
+ }
149
+ }
150
+ impl Processor for ChannelProcessor {
151
+ fn process(
152
+ &mut self,
153
+ engine: &mut Engine,
154
+ py: Python<'_>,
155
+ _strategy: &Bound<'_, PyAny>,
156
+ ) -> PyResult<ProcessorResult> {
157
+ let mut trades_to_process = Vec::new();
158
+ let mut pending_order_requests = Vec::new();
159
+ let mut oco_suppressed_fill_order_ids: HashSet<String> = HashSet::new();
160
+ let mut settle_reductions_before_increases = false;
161
+ let mut run_intermediate_reduce_match = false;
162
+ loop {
163
+ let mut drained_event = false;
164
+ while let Some(event) = engine.event_manager.try_recv() {
165
+ drained_event = true;
166
+ match event {
167
+ Event::OrderRequest(order) => pending_order_requests.push(order),
168
+ Event::OrderValidated(order) => {
169
+ engine.execution_model.on_order(order.clone());
170
+ engine.state.order_manager.add_active_order(order);
171
+ }
172
+ Event::ExecutionReport(order, trade) => {
173
+ apply_execution_report(
174
+ engine,
175
+ py,
176
+ order,
177
+ trade,
178
+ &mut oco_suppressed_fill_order_ids,
179
+ &mut trades_to_process,
180
+ );
181
+ }
182
+ _ => {}
183
+ }
184
+ }
185
+
186
+ if !pending_order_requests.is_empty() {
187
+ if settle_reductions_before_increases {
188
+ flush_accumulated_trades(engine, &mut trades_to_process);
189
+ settle_reductions_before_increases = false;
190
+ }
191
+ if run_intermediate_reduce_match {
192
+ emit_execution_reports_for_current_event(engine);
193
+ run_intermediate_reduce_match = false;
194
+ settle_reductions_before_increases = true;
195
+ continue;
196
+ }
197
+
198
+ pending_order_requests.sort_by(|left, right| {
199
+ let left_phase_rank =
200
+ crate::model::reduction_priority_rank(left.side, left.position_effect);
201
+ let right_phase_rank =
202
+ crate::model::reduction_priority_rank(right.side, right.position_effect);
203
+ let left_priority = engine.strategy_priority_for_order(left);
204
+ let right_priority = engine.strategy_priority_for_order(right);
205
+ left_phase_rank
206
+ .cmp(&right_phase_rank)
207
+ .then_with(|| right_priority.cmp(&left_priority))
208
+ .then_with(|| {
209
+ let left_id =
210
+ Engine::normalized_order_strategy_id(left).unwrap_or_default();
211
+ let right_id =
212
+ Engine::normalized_order_strategy_id(right).unwrap_or_default();
213
+ left_id.cmp(&right_id)
214
+ })
215
+ });
216
+
217
+ let has_reduce = pending_order_requests.iter().any(is_reduce_first_order);
218
+ let has_increase = pending_order_requests
219
+ .iter()
220
+ .any(|order| !is_reduce_first_order(order));
221
+ let can_do_two_phase = has_reduce
222
+ && has_increase
223
+ && should_run_post_strategy_match_now(engine, &pending_order_requests);
224
+
225
+ if can_do_two_phase {
226
+ let mut reduce_orders = Vec::new();
227
+ let mut increase_orders = Vec::new();
228
+ for order in pending_order_requests.drain(..) {
229
+ if is_reduce_first_order(&order) {
230
+ reduce_orders.push(order);
231
+ } else {
232
+ increase_orders.push(order);
233
+ }
234
+ }
235
+
236
+ for order in reduce_orders {
237
+ process_order_request(engine, py, order);
238
+ }
239
+
240
+ if !increase_orders.is_empty() {
241
+ pending_order_requests.extend(increase_orders);
242
+ run_intermediate_reduce_match = true;
243
+ }
244
+ } else {
245
+ for order in pending_order_requests.drain(..) {
246
+ process_order_request(engine, py, order);
247
+ }
248
+ }
249
+ continue;
250
+ }
251
+
252
+ if !drained_event {
253
+ break;
254
+ }
255
+ }
256
+
257
+ flush_accumulated_trades(engine, &mut trades_to_process);
258
+
259
+ Ok(ProcessorResult::Next)
260
+ }
261
+ }
@@ -0,0 +1,17 @@
1
+ use crate::engine::Engine;
2
+ use crate::pipeline::processor::{Processor, ProcessorResult};
3
+ use pyo3::prelude::*;
4
+
5
+ pub struct CleanupProcessor;
6
+
7
+ impl Processor for CleanupProcessor {
8
+ fn process(
9
+ &mut self,
10
+ engine: &mut Engine,
11
+ _py: Python<'_>,
12
+ _strategy: &Bound<'_, PyAny>,
13
+ ) -> PyResult<ProcessorResult> {
14
+ engine.state.order_manager.cleanup_finished_orders();
15
+ Ok(ProcessorResult::Next)
16
+ }
17
+ }