investing-algorithm-framework 7.16.18__tar.gz → 7.17.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.

Potentially problematic release.


This version of investing-algorithm-framework might be problematic. Click here for more details.

Files changed (258) hide show
  1. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/PKG-INFO +1 -1
  2. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/app.py +40 -15
  3. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest.py +58 -14
  4. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +8 -0
  5. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +6 -0
  6. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +13 -4
  7. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/data_provider.py +5 -0
  8. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +35 -1
  9. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +42 -4
  10. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +37 -3
  11. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +1 -1
  12. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/pyproject.toml +1 -1
  13. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/LICENSE +0 -0
  14. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/README.md +0 -0
  15. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/__init__.py +0 -0
  16. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/__init__.py +0 -0
  17. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  18. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  19. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  20. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
  21. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  22. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
  23. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
  24. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  25. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/context.py +0 -0
  26. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  27. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  28. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  29. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  30. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  31. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  32. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
  33. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  34. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  35. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  36. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  37. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  38. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  39. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  40. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  41. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  42. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  43. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  44. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  45. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  46. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  47. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  48. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  49. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  50. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  51. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  52. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  53. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  54. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/strategy.py +0 -0
  55. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/task.py +0 -0
  56. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  57. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  58. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  59. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  60. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  61. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  62. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  63. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  64. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  65. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  66. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  67. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  68. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  69. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  70. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  71. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/cli.py +0 -0
  72. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  73. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  74. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  75. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  76. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  77. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  78. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  79. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  80. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  81. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  82. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  83. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  84. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  85. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  86. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  87. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  88. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  89. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  90. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  91. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  92. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  93. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  94. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  95. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  96. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/create_app.py +0 -0
  97. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/dependency_container.py +0 -0
  98. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  99. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  100. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  101. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  102. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  103. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
  104. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/config.py +0 -0
  105. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/constants.py +0 -0
  106. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  107. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  108. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  109. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  110. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  111. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  112. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  113. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  114. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  115. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  116. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  117. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  118. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  119. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  120. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  121. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  122. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  123. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  124. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  125. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  126. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  127. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  128. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  129. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  130. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  131. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  132. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  133. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  134. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  135. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  136. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  137. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  138. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  139. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  140. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  141. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  142. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  143. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  144. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  145. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/positions/__init__.py +0 -0
  146. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/positions/position_size.py +0 -0
  147. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  148. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  149. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  150. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  151. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  152. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  153. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  154. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  155. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  156. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  157. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  158. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  159. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  160. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  161. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  162. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  163. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  164. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  165. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/download_data.py +0 -0
  166. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  167. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  168. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  169. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  170. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  171. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  172. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  173. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  174. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  175. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  176. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  177. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  178. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  179. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  180. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  181. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  182. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  183. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  184. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  185. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  186. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  187. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  188. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  189. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  190. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  191. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  192. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  193. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  194. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  195. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  196. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  197. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  198. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  199. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  200. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  201. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  202. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  203. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  204. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  205. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  206. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  207. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  208. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/__init__.py +0 -0
  209. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  210. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
  211. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  212. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  213. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  214. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  215. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  216. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  217. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  218. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  219. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  220. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  221. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  222. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  223. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  224. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  225. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  226. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  227. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  228. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  229. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  230. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  231. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  232. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  233. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  234. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  235. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  236. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  237. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  238. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  239. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  240. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  241. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  242. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  243. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  244. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  245. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  246. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  247. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  248. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  249. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  250. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  251. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  252. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  253. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  254. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  255. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  256. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  257. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  258. {investing_algorithm_framework-7.16.18 → investing_algorithm_framework-7.17.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 7.16.18
3
+ Version: 7.17.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -801,6 +801,7 @@ class App:
801
801
  show_progress: bool = True,
802
802
  market: Optional[str] = None,
803
803
  trading_symbol: Optional[str] = None,
804
+ continue_on_error: bool = False,
804
805
  ) -> List[Backtest]:
805
806
  """
806
807
  Run vectorized backtests for a set of strategies. The provided
@@ -848,6 +849,10 @@ class App:
848
849
  trading_symbol (str): The trading symbol to use for the backtest.
849
850
  This is used to create a portfolio configuration if no
850
851
  portfolio configuration is provided in the strategy.
852
+ continue_on_error (bool): Whether to continue running other
853
+ backtests if an error occurs in one of the backtests. If set
854
+ to True, the backtest will return an empty Backtest instance
855
+ in case of an error. If set to False, the error will be raised.
851
856
 
852
857
  Returns:
853
858
  List[Backtest]: List of Backtest instances for each strategy
@@ -956,7 +961,8 @@ class App:
956
961
  show_data_initialization_progress: bool = True,
957
962
  initial_amount: float = None,
958
963
  market: str = None,
959
- trading_symbol: str = None
964
+ trading_symbol: str = None,
965
+ continue_on_error: bool = False,
960
966
  ) -> Backtest:
961
967
  """
962
968
  Run vectorized backtests for a strategy. The provided
@@ -1008,6 +1014,10 @@ class App:
1008
1014
  that the portfolio will start with. If not provided,
1009
1015
  the initial amount from the portfolio configuration will
1010
1016
  be used.
1017
+ continue_on_error (bool): Whether to continue running other
1018
+ backtests if an error occurs in one of the backtests. If set
1019
+ to True, the backtest will return an empty Backtest instance
1020
+ in case of an error. If set to False, the error will be raised.
1011
1021
 
1012
1022
  Returns:
1013
1023
  Backtest: Instance of Backtest
@@ -1040,21 +1050,36 @@ class App:
1040
1050
 
1041
1051
  backtest_service = self.container.backtest_service()
1042
1052
  backtest_service.validate_strategy_for_vector_backtest(strategy)
1043
- run = backtest_service.create_vector_backtest(
1044
- strategy=strategy,
1045
- backtest_date_range=backtest_date_range,
1046
- risk_free_rate=risk_free_rate,
1047
- market=market,
1048
- trading_symbol=trading_symbol,
1049
- initial_amount=initial_amount
1050
- )
1051
- backtest = Backtest(
1052
- backtest_runs=[run],
1053
- risk_free_rate=risk_free_rate,
1054
- backtest_summary=generate_backtest_summary_metrics(
1055
- [run.backtest_metrics]
1053
+
1054
+ try:
1055
+ run = backtest_service.create_vector_backtest(
1056
+ strategy=strategy,
1057
+ backtest_date_range=backtest_date_range,
1058
+ risk_free_rate=risk_free_rate,
1059
+ market=market,
1060
+ trading_symbol=trading_symbol,
1061
+ initial_amount=initial_amount
1056
1062
  )
1057
- )
1063
+ backtest = Backtest(
1064
+ backtest_runs=[run],
1065
+ risk_free_rate=risk_free_rate,
1066
+ backtest_summary=generate_backtest_summary_metrics(
1067
+ [run.backtest_metrics]
1068
+ )
1069
+ )
1070
+ except Exception as e:
1071
+ logger.error(
1072
+ f"Error occurred during vector backtest for strategy "
1073
+ f"{strategy.name}: {str(e)}"
1074
+ )
1075
+ if continue_on_error:
1076
+ backtest = Backtest(
1077
+ backtest_runs=[],
1078
+ risk_free_rate=risk_free_rate,
1079
+ backtest_summary={}
1080
+ )
1081
+ else:
1082
+ raise e
1058
1083
 
1059
1084
  # Add the metadata to the backtest
1060
1085
  if metadata is None:
@@ -14,6 +14,7 @@ from .backtest_run import BacktestRun
14
14
  from .backtest_permutation_test import BacktestPermutationTest
15
15
  from .backtest_date_range import BacktestDateRange
16
16
  from .backtest_summary_metrics import BacktestSummaryMetrics
17
+ from .combine_backtests import generate_backtest_summary_metrics
17
18
 
18
19
 
19
20
  logger = getLogger(__name__)
@@ -177,13 +178,19 @@ class Backtest:
177
178
  }
178
179
 
179
180
  @staticmethod
180
- def open(directory_path: Union[str, Path]) -> 'Backtest':
181
+ def open(
182
+ directory_path: Union[str, Path],
183
+ backtest_date_ranges: List[BacktestDateRange] = None
184
+ ) -> 'Backtest':
181
185
  """
182
186
  Open a backtest report from a directory and return a Backtest instance.
183
187
 
184
188
  Args:
185
189
  directory_path (str): The path to the directory containing the
186
190
  backtest report files.
191
+ backtest_date_ranges (List[BacktestDateRange], optional): A list of
192
+ date ranges to filter the backtest runs. If provided, only
193
+ backtest runs matching these date ranges will be loaded.
187
194
 
188
195
  Returns:
189
196
  Backtest: An instance of Backtest with the loaded metrics
@@ -214,13 +221,59 @@ class Backtest:
214
221
  except json.JSONDecodeError as e:
215
222
  logger.error(f"Error decoding id JSON: {e}")
216
223
  id = None
217
- # Load combined backtest metrics if available
218
224
 
219
- summary_file = os.path.join(directory_path, "summary.json")
225
+ # Load all backtest runs
226
+ runs_dir = os.path.join(directory_path, "runs")
227
+
228
+ if os.path.isdir(runs_dir):
229
+ for dir_name in os.listdir(runs_dir):
230
+ run_path = os.path.join(runs_dir, dir_name)
231
+ if os.path.isdir(run_path):
232
+
233
+ if backtest_date_ranges is not None:
234
+ temp_run = BacktestRun.open(run_path)
235
+ match_found = False
236
+
237
+ for date_range in backtest_date_ranges:
238
+ if (
239
+ temp_run.backtest_start_date ==
240
+ date_range.start_date and
241
+ temp_run.backtest_end_date ==
242
+ date_range.end_date
243
+ ):
244
+
245
+ if date_range.name is not None:
246
+ if (
247
+ temp_run.backtest_date_range_name ==
248
+ date_range.name
249
+ ):
250
+ match_found = True
251
+ break
252
+ else:
253
+ match_found = True
254
+ break
255
+
256
+ if not match_found:
257
+ continue
258
+
259
+ backtest_runs.append(BacktestRun.open(run_path))
260
+
261
+ # Load combined backtests summary
262
+ if backtest_date_ranges is not None:
263
+ summary_file = os.path.join(directory_path, "summary.json")
264
+
265
+ if os.path.isfile(summary_file):
266
+ backtest_summary_metrics = \
267
+ BacktestSummaryMetrics.open(summary_file)
268
+ else:
269
+ # Generate new summary from loaded backtest runs
270
+ temp_metrics = []
271
+ for br in backtest_runs:
272
+ if br.backtest_metrics:
273
+ temp_metrics.append(br.backtest_metrics)
220
274
 
221
- if os.path.isfile(summary_file):
222
275
  backtest_summary_metrics = \
223
- BacktestSummaryMetrics.open(summary_file)
276
+ generate_backtest_summary_metrics(temp_metrics)
224
277
 
225
278
  # Load backtest permutation test metrics
226
279
  perm_test_dir = os.path.join(directory_path, "permutation_tests")
@@ -233,15 +286,6 @@ class Backtest:
233
286
  BacktestPermutationTest.open(perm_test_file)
234
287
  )
235
288
 
236
- # Load all backtest runs
237
- runs_dir = os.path.join(directory_path, "runs")
238
-
239
- if os.path.isdir(runs_dir):
240
- for dir_name in os.listdir(runs_dir):
241
- run_path = os.path.join(runs_dir, dir_name)
242
- if os.path.isdir(run_path):
243
- backtest_runs.append(BacktestRun.open(run_path))
244
-
245
289
  # Load metadata if available
246
290
  meta_file = os.path.join(directory_path, "metadata.json")
247
291
 
@@ -104,8 +104,12 @@ class BacktestMetrics:
104
104
  still open at the end of the backtest.
105
105
  win_rate (float): The win rate of the trades, expressed
106
106
  as a percentage.
107
+ current_win_rate (float): The current win rate of the trades,
108
+ including open trades.
107
109
  win_loss_ratio (float): The ratio of winning trades
108
110
  to losing trades.
111
+ current_win_loss_ratio (float): The current ratio of winning
112
+ trades to losing trades, including open trades.
109
113
  percentage_winning_months (float): The percentage of months
110
114
  with positive returns.
111
115
  percentage_winning_years (float): The percentage of years with
@@ -193,7 +197,9 @@ class BacktestMetrics:
193
197
  number_of_trades_opened: int = 0
194
198
  number_of_trades_open_at_end: int = 0
195
199
  win_rate: float = 0.0
200
+ current_win_rate: float = 0.0
196
201
  win_loss_ratio: float = 0.0
202
+ current_win_loss_ratio: float = 0.0
197
203
  percentage_winning_months: float = 0.0
198
204
  percentage_winning_years: float = 0.0
199
205
  average_monthly_return: float = 0.0
@@ -289,7 +295,9 @@ class BacktestMetrics:
289
295
  "number_of_trades_closed": self.number_of_trades_closed,
290
296
  "number_of_trades_opened": self.number_of_trades_opened,
291
297
  "win_rate": self.win_rate,
298
+ "current_win_rate": self.current_win_rate,
292
299
  "win_loss_ratio": self.win_loss_ratio,
300
+ "current_win_loss_ratio": self.current_win_loss_ratio,
293
301
  "percentage_winning_months": self.percentage_winning_months,
294
302
  "percentage_winning_years": self.percentage_winning_years,
295
303
  "average_monthly_return": self.average_monthly_return,
@@ -48,7 +48,9 @@ class BacktestSummaryMetrics:
48
48
  max_drawdown_duration (int): Duration of the maximum drawdown.
49
49
  trades_per_year (float): Average trades executed per year.
50
50
  win_rate (float): Percentage of winning trades.
51
+ current_win_rate (float): Win rate over recent trades.
51
52
  win_loss_ratio (float): Ratio of average win to average loss.
53
+ current_win_loss_ratio (float): Win/loss ratio over recent trades.
52
54
  number_of_trades (int): Total number of trades executed.
53
55
  cumulative_exposure (float): Total exposure over the backtest period.
54
56
  exposure_ratio (float): Ratio of exposure to available capital.
@@ -81,7 +83,9 @@ class BacktestSummaryMetrics:
81
83
  max_drawdown_duration: int = None
82
84
  trades_per_year: float = None
83
85
  win_rate: float = None
86
+ current_win_rate: float = None
84
87
  win_loss_ratio: float = None
88
+ current_win_loss_ratio: float = None
85
89
  number_of_trades: int = None
86
90
  number_of_trades_closed: int = None
87
91
  cumulative_exposure: float = None
@@ -123,7 +127,9 @@ class BacktestSummaryMetrics:
123
127
  "max_drawdown_duration": self.max_drawdown_duration,
124
128
  "trades_per_year": self.trades_per_year,
125
129
  "win_rate": self.win_rate,
130
+ "current_win_rate": self.current_win_rate,
126
131
  "win_loss_ratio": self.win_loss_ratio,
132
+ "current_win_loss_ratio": self.current_win_loss_ratio,
127
133
  "number_of_trades": self.number_of_trades,
128
134
  "number_of_trades_closed": self.number_of_trades_closed,
129
135
  "cumulative_exposure": self.cumulative_exposure,
@@ -1,6 +1,5 @@
1
1
  from typing import List
2
2
 
3
- from .backtest import Backtest
4
3
  from .backtest_summary_metrics import BacktestSummaryMetrics
5
4
  from .backtest_metrics import BacktestMetrics
6
5
 
@@ -27,9 +26,7 @@ def safe_weighted_mean(values, weights):
27
26
  ) / total_weight if total_weight > 0 else None
28
27
 
29
28
 
30
- def combine_backtests(
31
- backtests: List[Backtest],
32
- ) -> Backtest:
29
+ def combine_backtests(backtests):
33
30
  """
34
31
  Combine multiple backtests into a single backtest by aggregating
35
32
  their results.
@@ -72,6 +69,8 @@ def combine_backtests(
72
69
  risk_free_rate = backtest.risk_free_rate
73
70
  break
74
71
 
72
+ from .backtest import Backtest
73
+
75
74
  backtest = Backtest(
76
75
  backtest_summary=summary,
77
76
  metadata=metadata,
@@ -184,10 +183,18 @@ def generate_backtest_summary_metrics(
184
183
  [b.win_rate for b in backtest_metrics],
185
184
  [b.total_number_of_days for b in backtest_metrics]
186
185
  )
186
+ current_win_rate = safe_weighted_mean(
187
+ [b.current_win_rate for b in backtest_metrics],
188
+ [b.total_number_of_days for b in backtest_metrics]
189
+ )
187
190
  win_loss_ratio = safe_weighted_mean(
188
191
  [b.win_loss_ratio for b in backtest_metrics],
189
192
  [b.total_number_of_days for b in backtest_metrics]
190
193
  )
194
+ current_win_loss_ratio = safe_weighted_mean(
195
+ [b.current_win_loss_ratio for b in backtest_metrics],
196
+ [b.total_number_of_days for b in backtest_metrics]
197
+ )
191
198
  number_of_trades = sum(
192
199
  b.number_of_trades for b in backtest_metrics
193
200
  if b.number_of_trades is not None
@@ -251,7 +258,9 @@ def generate_backtest_summary_metrics(
251
258
  max_drawdown_duration=max_drawdown_duration,
252
259
  trades_per_year=trades_per_year,
253
260
  win_rate=win_rate,
261
+ current_win_rate=current_win_rate,
254
262
  win_loss_ratio=win_loss_ratio,
263
+ current_win_loss_ratio=current_win_loss_ratio,
255
264
  number_of_trades=number_of_trades,
256
265
  number_of_trades_closed=number_of_trades_closed,
257
266
  cumulative_exposure=cumulative_exposure,
@@ -240,6 +240,7 @@ class DataProvider(ABC):
240
240
  backtest_index_date: datetime,
241
241
  backtest_start_date: datetime = None,
242
242
  backtest_end_date: datetime = None,
243
+ data_source: DataSource = None,
243
244
  ) -> Any:
244
245
  """
245
246
  Fetches backtest data for a given datasource
@@ -251,6 +252,10 @@ class DataProvider(ABC):
251
252
  backtest data.
252
253
  backtest_end_date (datetime): The end date for the
253
254
  backtest data.
255
+ data_source (Optional[DataSource]): The data source
256
+ specification that is used to fetch the data.
257
+ This param is optional and can be used to
258
+ help identify errors in data fetching.
254
259
 
255
260
  Returns:
256
261
  Any: The data for the given symbol and date range.
@@ -386,7 +386,8 @@ class CCXTOHLCVDataProvider(DataProvider):
386
386
  self,
387
387
  backtest_index_date: datetime,
388
388
  backtest_start_date: datetime = None,
389
- backtest_end_date: datetime = None
389
+ backtest_end_date: datetime = None,
390
+ data_source: DataSource = None
390
391
  ) -> None:
391
392
  """
392
393
  Fetches backtest data for a given datasource
@@ -398,6 +399,8 @@ class CCXTOHLCVDataProvider(DataProvider):
398
399
  backtest data.
399
400
  backtest_end_date (datetime): The end date for the
400
401
  backtest data.
402
+ data_source (Optional[Datasource]): The data source for which to
403
+ fetch backtest data. Defaults to None.
401
404
 
402
405
  Returns:
403
406
  pl.DataFrame: The backtest data for the given datasource.
@@ -407,6 +410,17 @@ class CCXTOHLCVDataProvider(DataProvider):
407
410
  backtest_end_date is not None:
408
411
 
409
412
  if backtest_start_date < self._start_date_data_source:
413
+
414
+ if data_source is not None:
415
+ raise OperationalException(
416
+ f"Request data date {backtest_start_date} "
417
+ f"is before the range of "
418
+ f"the available data "
419
+ f"{self._start_date_data_source} "
420
+ f"- {self._end_date_data_source}."
421
+ f" for data source {data_source.identifier}."
422
+ )
423
+
410
424
  raise OperationalException(
411
425
  f"Request data date {backtest_start_date} "
412
426
  f"is before the range of "
@@ -416,6 +430,17 @@ class CCXTOHLCVDataProvider(DataProvider):
416
430
  )
417
431
 
418
432
  if backtest_end_date > self._end_date_data_source:
433
+
434
+ if data_source is not None:
435
+ raise OperationalException(
436
+ f"Request data date {backtest_end_date} "
437
+ f"is after the range of "
438
+ f"the available data "
439
+ f"{self._start_date_data_source} "
440
+ f"- {self._end_date_data_source}."
441
+ f" for data source {data_source.identifier}."
442
+ )
443
+
419
444
  raise OperationalException(
420
445
  f"Request data date {backtest_end_date} "
421
446
  f"is after the range of "
@@ -442,6 +467,15 @@ class CCXTOHLCVDataProvider(DataProvider):
442
467
  )
443
468
  data = self.window_cache[closest_key]
444
469
  except ValueError:
470
+
471
+ if data_source is not None:
472
+ raise OperationalException(
473
+ "No OHLCV data available for the "
474
+ f"date: {backtest_index_date} "
475
+ f"within the prepared backtest data "
476
+ f"for data source {data_source.identifier}. "
477
+ )
478
+
445
479
  raise OperationalException(
446
480
  "No OHLCV data available for the "
447
481
  f"date: {backtest_index_date} "
@@ -267,18 +267,25 @@ class CSVOHLCVDataProvider(DataProvider):
267
267
  self,
268
268
  backtest_index_date: datetime,
269
269
  backtest_start_date: datetime = None,
270
- backtest_end_date: datetime = None
270
+ backtest_end_date: datetime = None,
271
+ data_source: DataSource = None
271
272
  ) -> None:
272
273
  """
273
274
  Fetches backtest data for a given datasource
274
275
 
275
276
  Args:
276
- backtest_index_date (datetime): The date for which to fetch
277
+ backtest_index_date (datetime): The date for which to fetch
277
278
  backtest data.
278
- backtest_start_date (datetime): The start date for the
279
+ backtest_start_date (datetime): The start date for the
279
280
  backtest data.
280
- backtest_end_date (datetime): The end date for the
281
+ backtest_end_date (datetime): The end date for the
281
282
  backtest data.
283
+ data_source (Optional[DataSource]): The data source specification
284
+ that matches a data provider.
285
+
286
+ Raises:
287
+ OperationalException: If the requested backtest date range
288
+ is outside the available data range.
282
289
 
283
290
  Returns:
284
291
  pl.DataFrame: The backtest data for the given datasource.
@@ -287,6 +294,17 @@ class CSVOHLCVDataProvider(DataProvider):
287
294
  backtest_end_date is not None:
288
295
 
289
296
  if backtest_start_date < self._start_date_data_source:
297
+
298
+ if data_source is not None:
299
+ raise OperationalException(
300
+ f"Request data date {backtest_end_date} "
301
+ f"is after the range of "
302
+ f"the available data "
303
+ f"{self._start_date_data_source} "
304
+ f"- {self._end_date_data_source}."
305
+ f" for data source {data_source.identifier}."
306
+ )
307
+
290
308
  raise OperationalException(
291
309
  f"Request data date {backtest_start_date} "
292
310
  f"is before the range of "
@@ -296,6 +314,17 @@ class CSVOHLCVDataProvider(DataProvider):
296
314
  )
297
315
 
298
316
  if backtest_end_date > self._end_date_data_source:
317
+
318
+ if data_source is not None:
319
+ raise OperationalException(
320
+ f"Request data date {backtest_end_date} "
321
+ f"is after the range of "
322
+ f"the available data "
323
+ f"{self._start_date_data_source} "
324
+ f"- {self._end_date_data_source}."
325
+ f" for data source {data_source.identifier}."
326
+ )
327
+
299
328
  raise OperationalException(
300
329
  f"Request data date {backtest_end_date} "
301
330
  f"is after the range of "
@@ -322,6 +351,15 @@ class CSVOHLCVDataProvider(DataProvider):
322
351
  )
323
352
  data = self.window_cache[closest_key]
324
353
  except ValueError:
354
+
355
+ if data_source is not None:
356
+ raise OperationalException(
357
+ "No data available for the "
358
+ f"date: {backtest_index_date} "
359
+ "within the prepared backtest data "
360
+ f"for data source {data_source.identifier}."
361
+ )
362
+
325
363
  raise OperationalException(
326
364
  "No data available for the "
327
365
  f"date: {backtest_index_date} "
@@ -290,17 +290,20 @@ class PandasOHLCVDataProvider(DataProvider):
290
290
  backtest_index_date: datetime = None,
291
291
  backtest_start_date: datetime = None,
292
292
  backtest_end_date: datetime = None,
293
+ data_source: DataSource = None
293
294
  ) -> None:
294
295
  """
295
296
  Fetches backtest data for a given datasource
296
297
 
297
298
  Args:
298
- backtest_index_date (datetime): The date for which to fetch
299
+ backtest_index_date (datetime): The date for which to fetch
299
300
  backtest data.
300
- backtest_start_date (datetime): The start date for the
301
+ backtest_start_date (datetime): The start date for the
301
302
  backtest data.
302
- backtest_end_date (datetime): The end date for the
303
+ backtest_end_date (datetime): The end date for the
303
304
  backtest data.
305
+ data_source (Optional[DataSource]): The data source for which to
306
+ fetch backtest data.
304
307
 
305
308
  Returns:
306
309
  pl.DataFrame: The backtest data for the given datasource.
@@ -310,6 +313,17 @@ class PandasOHLCVDataProvider(DataProvider):
310
313
  backtest_end_date is not None:
311
314
 
312
315
  if backtest_start_date < self._start_date_data_source:
316
+
317
+ if data_source is not None:
318
+ raise OperationalException(
319
+ f"Request data date {backtest_end_date} "
320
+ f"is after the range of "
321
+ f"the available data "
322
+ f"{self._start_date_data_source} "
323
+ f"- {self._end_date_data_source}."
324
+ f" for data source {data_source.identifier}."
325
+ )
326
+
313
327
  raise OperationalException(
314
328
  f"Request data date {backtest_start_date} "
315
329
  f"is before the range of "
@@ -319,6 +333,17 @@ class PandasOHLCVDataProvider(DataProvider):
319
333
  )
320
334
 
321
335
  if backtest_end_date > self._end_date_data_source:
336
+
337
+ if data_source is not None:
338
+ raise OperationalException(
339
+ f"Request data date {backtest_end_date} "
340
+ f"is after the range of "
341
+ f"the available data "
342
+ f"{self._start_date_data_source} "
343
+ f"- {self._end_date_data_source}."
344
+ f" for data source {data_source.identifier}."
345
+ )
346
+
322
347
  raise OperationalException(
323
348
  f"Request data date {backtest_end_date} "
324
349
  f"is after the range of "
@@ -345,6 +370,15 @@ class PandasOHLCVDataProvider(DataProvider):
345
370
  )
346
371
  data = self.window_cache[closest_key]
347
372
  except ValueError:
373
+
374
+ if data_source is not None:
375
+ raise OperationalException(
376
+ "No data available for the "
377
+ f"date: {backtest_index_date} "
378
+ "within the prepared backtest data "
379
+ f"for data source {data_source.identifier}."
380
+ )
381
+
348
382
  raise OperationalException(
349
383
  "No data available for the "
350
384
  f"date: {backtest_index_date} "
@@ -156,7 +156,6 @@ class DataProviderIndex:
156
156
  f"provider for the defined datasource. If you are using a "
157
157
  "custom data provider, make sure it has a "
158
158
  "data_provider_identifier set"
159
-
160
159
  )
161
160
 
162
161
  # Sort by priority and pick the best one (lowest priority first)
@@ -553,6 +552,7 @@ class DataProviderService:
553
552
  backtest_index_date=backtest_index_date,
554
553
  backtest_start_date=start_date,
555
554
  backtest_end_date=end_date,
555
+ data_source=data_source
556
556
  )
557
557
 
558
558
  def get_vectorized_backtest_data(
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v7.16.18"
3
+ version = "v7.17.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"