investing-algorithm-framework 8.5.0__tar.gz → 8.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/PKG-INFO +1 -1
  2. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/__init__.py +7 -1
  3. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +26 -78
  4. investing_algorithm_framework-8.6.0/investing_algorithm_framework/domain/backtesting/consistency.py +137 -0
  5. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +87 -25
  6. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/__init__.py +7 -2
  7. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/__init__.py +7 -1
  8. investing_algorithm_framework-8.6.0/investing_algorithm_framework/services/metrics/consistency.py +13 -0
  9. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/pyproject.toml +1 -1
  10. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/LICENSE +0 -0
  11. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/README.md +0 -0
  12. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
  13. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
  14. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
  15. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
  16. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/__init__.py +0 -0
  17. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  18. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  19. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  20. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/app.py +0 -0
  21. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  22. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/context.py +0 -0
  23. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  24. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  25. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  26. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  27. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
  28. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  29. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  30. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
  31. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  32. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  33. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  34. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  35. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  36. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  37. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  38. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  39. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  40. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  41. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  42. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  43. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  44. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  45. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +0 -0
  46. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
  47. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +0 -0
  48. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  49. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  50. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  51. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  52. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  53. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  54. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  55. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/strategy.py +0 -0
  56. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/task.py +0 -0
  57. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  58. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  59. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  60. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  61. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  62. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  63. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  64. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  65. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  66. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  67. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  68. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  69. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  70. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  71. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  72. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/cli.py +0 -0
  73. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  74. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  75. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  76. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
  77. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  78. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  79. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  80. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  81. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  82. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  83. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  84. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  85. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  86. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  87. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  88. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  89. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  90. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  91. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  92. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  93. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  94. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  95. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  96. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  97. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  98. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +0 -0
  99. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/create_app.py +0 -0
  100. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/dependency_container.py +0 -0
  101. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  102. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
  103. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  104. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  105. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  106. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  107. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  108. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  109. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
  110. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
  111. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
  112. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
  113. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
  114. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
  115. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/blotter.py +0 -0
  116. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/config.py +0 -0
  117. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/constants.py +0 -0
  118. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  119. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  120. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  121. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  122. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/fx.py +0 -0
  123. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  124. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  125. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  126. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  127. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  128. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  129. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  130. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  131. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  132. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  133. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  134. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  135. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  136. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  137. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  138. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  139. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  140. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  141. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  142. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  143. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
  144. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  145. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
  146. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
  147. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
  148. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
  149. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
  150. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  151. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  152. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  153. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  154. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  155. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  156. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  157. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  158. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  159. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  160. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  161. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  162. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  163. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  164. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  165. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  166. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  167. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  168. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  169. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  170. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  171. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  172. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  173. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  174. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  175. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  176. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  177. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  178. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  179. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  180. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  181. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  182. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/download_data.py +0 -0
  183. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  184. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  185. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
  186. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
  187. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  188. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  189. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
  190. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
  191. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
  192. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  193. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
  194. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
  195. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
  196. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  197. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  198. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  199. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  200. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  201. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  202. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  203. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
  204. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  205. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  206. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  207. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  208. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  209. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  210. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  211. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  212. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  213. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  214. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  215. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  216. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  217. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  218. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  219. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  220. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  221. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  222. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  223. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  224. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  225. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  226. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
  227. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  228. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  229. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  230. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  231. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  232. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  233. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  234. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  235. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
  236. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +0 -0
  237. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +0 -0
  238. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/notebook/__init__.py +0 -0
  239. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/notebook/magic.py +0 -0
  240. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  241. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  242. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
  243. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  244. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  245. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  246. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  247. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  248. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  249. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  250. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  251. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  252. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  253. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  254. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  255. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  256. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  257. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  258. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  259. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  260. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  261. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  262. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  263. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  264. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  265. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  266. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  267. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  268. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  269. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  270. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  271. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  272. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  273. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  274. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  275. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  276. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  277. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  278. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  279. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  280. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  281. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  282. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  283. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  284. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  285. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  286. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  287. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  288. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
  289. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
  290. {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 8.5.0
3
+ Version: 8.6.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10,<4.0
@@ -67,7 +67,9 @@ from .services import get_annual_volatility, get_sortino_ratio, \
67
67
  get_current_average_trade_loss, get_negative_trades, \
68
68
  get_positive_trades, get_number_of_trades, get_current_win_rate, \
69
69
  get_current_win_loss_ratio, create_backtest_metrics_for_backtest, \
70
- recalculate_backtests, TradeTakeProfitService, TradeStopLossService
70
+ recalculate_backtests, TradeTakeProfitService, TradeStopLossService, \
71
+ get_cv_consistency, get_normalized_stability, \
72
+ get_consistency_score, get_stability_score
71
73
 
72
74
 
73
75
  __all__ = [
@@ -255,6 +257,10 @@ __all__ = [
255
257
  "FXRateProvider",
256
258
  "StaticFXRateProvider",
257
259
  "load_ipython_extension",
260
+ "get_cv_consistency",
261
+ "get_normalized_stability",
262
+ "get_consistency_score",
263
+ "get_stability_score",
258
264
  ]
259
265
 
260
266
 
@@ -2,6 +2,10 @@ import logging
2
2
  import math
3
3
  from typing import List
4
4
 
5
+ from .consistency import (
6
+ get_cv_consistency, get_normalized_stability,
7
+ get_consistency_score, get_stability_score,
8
+ )
5
9
  from .backtest_metrics import BacktestMetrics
6
10
  from .backtest_summary_metrics import BacktestSummaryMetrics
7
11
 
@@ -441,45 +445,14 @@ def generate_backtest_summary_metrics(
441
445
  ) if consecutive_losses else None
442
446
 
443
447
  # === CONSISTENCY METRICS ===
444
- # Two complementary approaches to measure cross-window stability.
445
- #
446
- # 1) CV-based consistency: 1 - CV (CV = std / |mean|), capped [0, 1].
447
- # Standard statistical measure; scale-invariant.
448
- # Drawback: undefined when mean ≈ 0.
449
- #
450
- # 2) Normalized-std stability: 1 - std/max_std, capped [0, 1].
451
- # Uses a domain-specific max_std for normalization.
452
- # More intuitive for bounded metrics (win rate 0-100,
453
- # Sharpe typically -2 to +4).
454
-
455
448
  return_consistency = None
456
449
  win_rate_consistency = None
457
450
  sharpe_consistency = None
458
- consistency_score = None
451
+ consistency_score_val = None
459
452
  return_stability = None
460
453
  win_rate_stability = None
461
454
  sharpe_stability = None
462
- stability_score = None
463
-
464
- def _cv_consistency(values):
465
- """1 - CV capped to [0, 1], or None if insufficient data."""
466
- if len(values) < 2:
467
- return None
468
- mean = sum(values) / len(values)
469
- if abs(mean) < 1e-9:
470
- return 0.0 # mean ≈ 0 → unstable
471
- var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
472
- cv = math.sqrt(var) / abs(mean)
473
- return max(0.0, min(1.0, 1.0 - cv))
474
-
475
- def _norm_stability(values, max_std):
476
- """1 - std/max_std capped to [0, 1], or None if insufficient."""
477
- if len(values) < 2:
478
- return None
479
- mean = sum(values) / len(values)
480
- var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
481
- std = math.sqrt(var)
482
- return max(0.0, min(1.0, 1.0 - std / max_std))
455
+ stability_score_val = None
483
456
 
484
457
  if len(valid_metrics) >= 2:
485
458
  # --- Per-window returns ---
@@ -487,9 +460,10 @@ def generate_backtest_summary_metrics(
487
460
  b.total_net_gain_percentage for b in valid_metrics
488
461
  if b.total_net_gain_percentage is not None
489
462
  ]
490
- return_consistency = _cv_consistency(per_window_returns)
491
- # max_std = 100: a std of 100% of initial capital → score 0
492
- return_stability = _norm_stability(per_window_returns, 100.0)
463
+ return_consistency = get_cv_consistency(per_window_returns)
464
+ return_stability = get_normalized_stability(
465
+ per_window_returns, 100.0
466
+ )
493
467
 
494
468
  # --- Per-window win rates ---
495
469
  per_window_win_rates = [
@@ -498,10 +472,10 @@ def generate_backtest_summary_metrics(
498
472
  and b.number_of_trades_closed is not None
499
473
  and b.number_of_trades_closed > 0
500
474
  ]
501
- return_consistency = _cv_consistency(per_window_returns)
502
- win_rate_consistency = _cv_consistency(per_window_win_rates)
503
- # max_std = 50: theoretical max std for a [0, 100] range
504
- win_rate_stability = _norm_stability(per_window_win_rates, 50.0)
475
+ win_rate_consistency = get_cv_consistency(per_window_win_rates)
476
+ win_rate_stability = get_normalized_stability(
477
+ per_window_win_rates, 50.0
478
+ )
505
479
 
506
480
  # --- Per-window Sharpe ratios ---
507
481
  per_window_sharpe = [
@@ -510,45 +484,19 @@ def generate_backtest_summary_metrics(
510
484
  and not math.isnan(b.sharpe_ratio)
511
485
  and not math.isinf(b.sharpe_ratio)
512
486
  ]
513
- sharpe_consistency = _cv_consistency(per_window_sharpe)
514
- # max_std = 2: Sharpe ratios typically range -2 to +4;
515
- # a std of 2 means wildly inconsistent
516
- sharpe_stability = _norm_stability(per_window_sharpe, 2.0)
487
+ sharpe_consistency = get_cv_consistency(per_window_sharpe)
488
+ sharpe_stability = get_normalized_stability(
489
+ per_window_sharpe, 2.0
490
+ )
517
491
 
518
492
  # --- Composite scores ---
519
- # Both use the same weighting scheme:
520
- # 35% returns, 25% win rate, 20% Sharpe, 20% profitable
521
- # window ratio.
522
- def _composite(ret_c, wr_c, sh_c):
523
- components = []
524
- weights_c = []
525
- if ret_c is not None:
526
- components.append(ret_c)
527
- weights_c.append(0.35)
528
- if wr_c is not None:
529
- components.append(wr_c)
530
- weights_c.append(0.25)
531
- if sh_c is not None:
532
- components.append(sh_c)
533
- weights_c.append(0.20)
534
- if number_of_windows and number_of_windows > 0:
535
- pw_ratio = (
536
- number_of_profitable_windows / number_of_windows
537
- )
538
- components.append(pw_ratio)
539
- weights_c.append(0.20)
540
- if not components:
541
- return None
542
- total_w = sum(weights_c)
543
- return sum(
544
- c * w for c, w in zip(components, weights_c)
545
- ) / total_w
546
-
547
- consistency_score = _composite(
548
- return_consistency, win_rate_consistency, sharpe_consistency
493
+ consistency_score_val = get_consistency_score(
494
+ return_consistency, win_rate_consistency, sharpe_consistency,
495
+ number_of_profitable_windows, number_of_windows,
549
496
  )
550
- stability_score = _composite(
551
- return_stability, win_rate_stability, sharpe_stability
497
+ stability_score_val = get_stability_score(
498
+ return_stability, win_rate_stability, sharpe_stability,
499
+ number_of_profitable_windows, number_of_windows,
552
500
  )
553
501
 
554
502
  return BacktestSummaryMetrics(
@@ -602,9 +550,9 @@ def generate_backtest_summary_metrics(
602
550
  return_consistency=return_consistency,
603
551
  win_rate_consistency=win_rate_consistency,
604
552
  sharpe_consistency=sharpe_consistency,
605
- consistency_score=consistency_score,
553
+ consistency_score=consistency_score_val,
606
554
  return_stability=return_stability,
607
555
  win_rate_stability=win_rate_stability,
608
556
  sharpe_stability=sharpe_stability,
609
- stability_score=stability_score,
557
+ stability_score=stability_score_val,
610
558
  )
@@ -0,0 +1,137 @@
1
+ import math
2
+
3
+
4
+ def get_cv_consistency(values):
5
+ """
6
+ CV-based consistency: 1 - CV (CV = std / |mean|), capped [0, 1].
7
+
8
+ Standard statistical measure; scale-invariant.
9
+ Returns None if fewer than 2 values.
10
+ Returns 0.0 when mean ≈ 0 (unstable).
11
+
12
+ Args:
13
+ values: list of numeric values (e.g. per-window returns)
14
+
15
+ Returns:
16
+ float in [0, 1] or None
17
+ """
18
+ if len(values) < 2:
19
+ return None
20
+ mean = sum(values) / len(values)
21
+ if abs(mean) < 1e-9:
22
+ return 0.0
23
+ var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
24
+ cv = math.sqrt(var) / abs(mean)
25
+ return max(0.0, min(1.0, 1.0 - cv))
26
+
27
+
28
+ def get_normalized_stability(values, max_std):
29
+ """
30
+ Normalized-std stability: 1 - std/max_std, capped [0, 1].
31
+
32
+ Uses a domain-specific max_std for normalization.
33
+ More intuitive for bounded metrics (win rate 0-100,
34
+ Sharpe typically -2 to +4).
35
+ Returns None if fewer than 2 values.
36
+
37
+ Args:
38
+ values: list of numeric values (e.g. per-window win rates)
39
+ max_std: domain-specific maximum standard deviation for
40
+ normalization
41
+
42
+ Returns:
43
+ float in [0, 1] or None
44
+ """
45
+ if len(values) < 2:
46
+ return None
47
+ mean = sum(values) / len(values)
48
+ var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
49
+ std = math.sqrt(var)
50
+ return max(0.0, min(1.0, 1.0 - std / max_std))
51
+
52
+
53
+ def get_consistency_score(
54
+ return_consistency,
55
+ win_rate_consistency,
56
+ sharpe_consistency,
57
+ number_of_profitable_windows=None,
58
+ number_of_windows=None,
59
+ ):
60
+ """
61
+ Composite consistency score using weighted components:
62
+ 35% returns, 25% win rate, 20% Sharpe, 20% profitable window ratio.
63
+
64
+ Args:
65
+ return_consistency: CV consistency of per-window returns
66
+ win_rate_consistency: CV consistency of per-window win rates
67
+ sharpe_consistency: CV consistency of per-window Sharpe ratios
68
+ number_of_profitable_windows: count of profitable windows
69
+ number_of_windows: total number of windows
70
+
71
+ Returns:
72
+ float in [0, 1] or None
73
+ """
74
+ return _composite(
75
+ return_consistency,
76
+ win_rate_consistency,
77
+ sharpe_consistency,
78
+ number_of_profitable_windows,
79
+ number_of_windows,
80
+ )
81
+
82
+
83
+ def get_stability_score(
84
+ return_stability,
85
+ win_rate_stability,
86
+ sharpe_stability,
87
+ number_of_profitable_windows=None,
88
+ number_of_windows=None,
89
+ ):
90
+ """
91
+ Composite stability score using weighted components:
92
+ 35% returns, 25% win rate, 20% Sharpe, 20% profitable window ratio.
93
+
94
+ Args:
95
+ return_stability: normalized stability of per-window returns
96
+ win_rate_stability: normalized stability of per-window win rates
97
+ sharpe_stability: normalized stability of per-window Sharpe ratios
98
+ number_of_profitable_windows: count of profitable windows
99
+ number_of_windows: total number of windows
100
+
101
+ Returns:
102
+ float in [0, 1] or None
103
+ """
104
+ return _composite(
105
+ return_stability,
106
+ win_rate_stability,
107
+ sharpe_stability,
108
+ number_of_profitable_windows,
109
+ number_of_windows,
110
+ )
111
+
112
+
113
+ def _composite(
114
+ ret_c, wr_c, sh_c,
115
+ number_of_profitable_windows=None,
116
+ number_of_windows=None,
117
+ ):
118
+ components = []
119
+ weights_c = []
120
+ if ret_c is not None:
121
+ components.append(ret_c)
122
+ weights_c.append(0.35)
123
+ if wr_c is not None:
124
+ components.append(wr_c)
125
+ weights_c.append(0.25)
126
+ if sh_c is not None:
127
+ components.append(sh_c)
128
+ weights_c.append(0.20)
129
+ if number_of_windows and number_of_windows > 0 \
130
+ and number_of_profitable_windows is not None:
131
+ pw_ratio = number_of_profitable_windows / number_of_windows
132
+ components.append(pw_ratio)
133
+ weights_c.append(0.20)
134
+ if not components:
135
+ return None
136
+ total_w = sum(weights_c)
137
+ return sum(c * w for c, w in zip(components, weights_c)) / total_w
@@ -31,20 +31,42 @@ from .vector_backtest_service import VectorBacktestService
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
- # Module-level global used by worker processes. Set via _init_worker
34
+ # Module-level globals used by worker processes. Set via _init_worker
35
35
  # which is called once per worker by ProcessPoolExecutor's initializer.
36
36
  _worker_data_provider_service = None
37
+ _worker_progress_counter = None
37
38
 
38
39
 
39
- def _init_worker(data_provider_service):
40
+ def _init_worker(data_provider_service, progress_counter=None):
40
41
  """Initializer for ProcessPoolExecutor workers.
41
42
 
42
- Stores the data_provider_service in a module-level global so each
43
- worker pickles/unpickles it only once at startup rather than per task.
44
- This dramatically reduces overhead on Windows/WSL (spawn start method).
43
+ Stores the data_provider_service and a shared progress counter in
44
+ module-level globals so each worker inherits them once at startup
45
+ rather than pickling them per task. This dramatically reduces
46
+ overhead on Windows/WSL (spawn start method).
47
+
48
+ Also pins BLAS / OpenMP / Polars thread pools to a single thread per
49
+ worker. Without this each worker tries to use all CPU cores for
50
+ numpy / pandas / polars operations, causing N² thread oversubscription
51
+ and severe slowdowns on Windows/WSL. These env vars must be set
52
+ before numpy / polars are imported, which is why ``spawn`` is used
53
+ as the start method (with ``fork`` they would have no effect because
54
+ those libraries are already loaded in the parent).
45
55
  """
46
- global _worker_data_provider_service
56
+ # Pin math library thread pools to 1 thread per worker.
57
+ for var in (
58
+ "OMP_NUM_THREADS",
59
+ "OPENBLAS_NUM_THREADS",
60
+ "MKL_NUM_THREADS",
61
+ "NUMEXPR_NUM_THREADS",
62
+ "VECLIB_MAXIMUM_THREADS",
63
+ "POLARS_MAX_THREADS",
64
+ ):
65
+ os.environ.setdefault(var, "1")
66
+
67
+ global _worker_data_provider_service, _worker_progress_counter
47
68
  _worker_data_provider_service = data_provider_service
69
+ _worker_progress_counter = progress_counter
48
70
 
49
71
 
50
72
  def _print_progress(message: str, show_progress: bool = False):
@@ -921,9 +943,13 @@ class BacktestService:
921
943
 
922
944
  if use_parallel:
923
945
  # Parallel processing of backtests (batches per worker)
924
- # Determine number of workers
946
+ # Determine number of workers. Cap at 8 by default to
947
+ # avoid BLAS / IPC contention on Windows/WSL where
948
+ # cpu_count() workers is usually slower than fewer.
925
949
  if n_workers == -1:
926
- n_workers = multiprocessing.cpu_count()
950
+ n_workers = min(
951
+ max(multiprocessing.cpu_count() - 1, 1), 8
952
+ )
927
953
 
928
954
  # Calculate optimal batch size per worker
929
955
  # Each worker processes a batch of strategies
@@ -948,11 +974,27 @@ class BacktestService:
948
974
  show_progress
949
975
  )
950
976
 
951
- # Shared counter for strategy-level progress
952
- # across all workers. Use Manager so the proxy
953
- # object can be pickled by ProcessPoolExecutor.
954
- manager = multiprocessing.Manager()
955
- progress_counter = manager.Value('i', 0)
977
+ # Use a single ``spawn`` context for everything.
978
+ # On WSL/Linux the default is ``fork`` which copies
979
+ # the entire parent process into each worker,
980
+ # bloating workers and preventing the BLAS thread
981
+ # env vars set in ``_init_worker`` from taking
982
+ # effect (numpy/polars are already loaded). With
983
+ # ``spawn`` workers start with a clean interpreter
984
+ # and those env vars are honoured.
985
+ mp_ctx = multiprocessing.get_context("spawn")
986
+
987
+ # Shared counter for strategy-level progress across
988
+ # all workers. Use ``mp_ctx.Value`` (shared memory +
989
+ # semaphore) instead of ``Manager().Value`` which
990
+ # is a proxy that performs an IPC round-trip for
991
+ # every read/write through a separate manager
992
+ # process. Manager proxies are catastrophically
993
+ # slow on Windows/WSL when many workers update the
994
+ # same counter, and they also cause the progress
995
+ # bar to appear frozen because the monitor thread's
996
+ # reads queue behind worker writes.
997
+ progress_counter = mp_ctx.Value('i', 0)
956
998
 
957
999
  # Copy data provider once and pass via initializer
958
1000
  # so each worker inherits it at startup instead of
@@ -974,11 +1016,15 @@ class BacktestService:
974
1016
  None, # placeholder, worker reads global
975
1017
  False,
976
1018
  dynamic_position_sizing,
977
- progress_counter,
1019
+ None, # progress_counter inherited via init
978
1020
  ))
979
1021
 
980
1022
  # Start a monitoring thread that updates a
981
- # strategy-level progress bar in real time
1023
+ # strategy-level progress bar in real time. Use
1024
+ # mininterval=0 / miniters=1 so the bar refreshes
1025
+ # promptly on Windows/WSL where stdout is often
1026
+ # line-buffered and tqdm's default smoothing can
1027
+ # otherwise make the bar appear frozen.
982
1028
  total_strategies = len(strategies_to_run)
983
1029
  pbar = tqdm(
984
1030
  total=total_strategies,
@@ -987,6 +1033,8 @@ class BacktestService:
987
1033
  f"{start_date} to {end_date}",
988
1034
  disable=not show_progress,
989
1035
  unit="strategy",
1036
+ mininterval=0,
1037
+ miniters=1,
990
1038
  )
991
1039
  stop_event = threading.Event()
992
1040
 
@@ -994,21 +1042,26 @@ class BacktestService:
994
1042
  while not stop_event.is_set():
995
1043
  pbar.n = progress_counter.value
996
1044
  pbar.refresh()
997
- stop_event.wait(0.5)
1045
+ stop_event.wait(0.25)
998
1046
 
999
1047
  monitor = threading.Thread(
1000
1048
  target=_monitor_progress, daemon=True
1001
1049
  )
1002
1050
  monitor.start()
1003
1051
 
1004
- # Execute batches in parallel.
1005
- # Use initializer to pass data_provider_service
1006
- # once per worker process rather than pickling it
1007
- # with every submitted task.
1052
+ # Execute batches in parallel using the spawn pool
1053
+ # created above. The shared ``progress_counter``
1054
+ # (a ``mp_ctx.Value``) and ``shared_data_provider``
1055
+ # are passed through the initializer so they are
1056
+ # inherited once per worker rather than pickled per
1057
+ # task.
1008
1058
  with ProcessPoolExecutor(
1009
1059
  max_workers=n_workers,
1060
+ mp_context=mp_ctx,
1010
1061
  initializer=_init_worker,
1011
- initargs=(shared_data_provider,),
1062
+ initargs=(
1063
+ shared_data_provider, progress_counter,
1064
+ ),
1012
1065
  ) as ex:
1013
1066
  # Submit all batch tasks
1014
1067
  futures = [
@@ -1066,7 +1119,6 @@ class BacktestService:
1066
1119
  pbar.n = progress_counter.value
1067
1120
  pbar.refresh()
1068
1121
  pbar.close()
1069
- manager.shutdown()
1070
1122
 
1071
1123
  # Save remaining batch and create checkpoint files when
1072
1124
  # storage directory provided
@@ -1810,6 +1862,12 @@ class BacktestService:
1810
1862
  if data_provider_service is None:
1811
1863
  data_provider_service = _worker_data_provider_service
1812
1864
 
1865
+ # In parallel mode the progress counter is inherited via the
1866
+ # worker initializer (multiprocessing.Value, shared memory).
1867
+ # Fall back to the per-task argument for backward compatibility.
1868
+ if progress_counter is None:
1869
+ progress_counter = _worker_progress_counter
1870
+
1813
1871
  vector_backtest_service = VectorBacktestService(
1814
1872
  data_provider_service=data_provider_service
1815
1873
  )
@@ -1852,9 +1910,12 @@ class BacktestService:
1852
1910
  batch_results.append(backtest)
1853
1911
 
1854
1912
  # Increment shared progress counter so the
1855
- # main process can track per-strategy progress
1913
+ # main process can track per-strategy progress.
1914
+ # ``multiprocessing.Value`` lives in shared memory; the
1915
+ # lock makes ``+= 1`` atomic across workers.
1856
1916
  if progress_counter is not None:
1857
- progress_counter.value += 1
1917
+ with progress_counter.get_lock():
1918
+ progress_counter.value += 1
1858
1919
 
1859
1920
  except Exception as e:
1860
1921
  if continue_on_error:
@@ -1865,7 +1926,8 @@ class BacktestService:
1865
1926
  # Still increment counter for failed strategies
1866
1927
  # so progress total stays accurate
1867
1928
  if progress_counter is not None:
1868
- progress_counter.value += 1
1929
+ with progress_counter.get_lock():
1930
+ progress_counter.value += 1
1869
1931
  continue
1870
1932
  else:
1871
1933
  raise
@@ -38,7 +38,8 @@ from .metrics import get_annual_volatility, get_mean_daily_return, \
38
38
  get_current_win_rate, get_current_average_trade_return, \
39
39
  get_current_average_trade_loss, get_current_average_trade_duration, \
40
40
  get_current_average_trade_gain, create_backtest_metrics_for_backtest, \
41
- recalculate_backtests
41
+ recalculate_backtests, get_cv_consistency, get_normalized_stability, \
42
+ get_consistency_score, get_stability_score
42
43
 
43
44
  __all__ = [
44
45
  "get_mean_daily_return",
@@ -134,5 +135,9 @@ __all__ = [
134
135
  "recalculate_backtests",
135
136
  "TradeStopLossService",
136
137
  "TradeTakeProfitService",
137
- "get_mean_yearly_return"
138
+ "get_mean_yearly_return",
139
+ "get_cv_consistency",
140
+ "get_normalized_stability",
141
+ "get_consistency_score",
142
+ "get_stability_score"
138
143
  ]
@@ -40,6 +40,8 @@ from .trades import get_negative_trades, get_positive_trades, \
40
40
  get_average_trade_duration
41
41
  from .mean_daily_return import get_mean_daily_return, get_mean_yearly_return
42
42
  from .standard_deviation import get_daily_returns_std
43
+ from .consistency import get_cv_consistency, get_normalized_stability, \
44
+ get_consistency_score, get_stability_score
43
45
 
44
46
  __all__ = [
45
47
  "get_mean_daily_return",
@@ -115,5 +117,9 @@ __all__ = [
115
117
  "get_number_of_open_trades",
116
118
  "get_average_trade_duration",
117
119
  "create_backtest_metrics_for_backtest",
118
- "get_mean_yearly_return"
120
+ "get_mean_yearly_return",
121
+ "get_cv_consistency",
122
+ "get_normalized_stability",
123
+ "get_consistency_score",
124
+ "get_stability_score"
119
125
  ]
@@ -0,0 +1,13 @@
1
+ from investing_algorithm_framework.domain.backtesting.consistency import (
2
+ get_cv_consistency,
3
+ get_normalized_stability,
4
+ get_consistency_score,
5
+ get_stability_score,
6
+ )
7
+
8
+ __all__ = [
9
+ "get_cv_consistency",
10
+ "get_normalized_stability",
11
+ "get_consistency_score",
12
+ "get_stability_score",
13
+ ]
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v8.5.0"
3
+ version = "v8.6.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"