investing-algorithm-framework 7.4.0__tar.gz → 7.5.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 (261) hide show
  1. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/PKG-INFO +1 -1
  2. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/__init__.py +3 -2
  3. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app.py +27 -16
  4. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +2 -0
  5. investing_algorithm_framework-7.5.0/investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  6. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/__init__.py +3 -2
  7. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/__init__.py +3 -1
  8. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest.py +33 -0
  9. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +5 -0
  10. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +3 -0
  11. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +22 -1
  12. investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/backtesting/combine_backtests.py +211 -0
  13. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +45 -0
  14. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/pyproject.toml +1 -1
  15. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/LICENSE +0 -0
  16. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/README.md +0 -0
  17. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/__init__.py +0 -0
  18. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  19. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  20. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  21. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
  22. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  23. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
  24. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
  25. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  26. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/context.py +0 -0
  27. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  28. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  29. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  30. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  31. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  32. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  33. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  34. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  35. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  36. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  37. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  38. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  39. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  40. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  41. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  42. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  43. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  44. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  45. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  46. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  47. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  48. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  49. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  50. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  51. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  52. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/strategy.py +0 -0
  53. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/task.py +0 -0
  54. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  55. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  56. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  57. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  58. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  59. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  60. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  61. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  62. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  63. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  64. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  65. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  66. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  67. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  68. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  69. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/cli.py +0 -0
  70. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  71. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  72. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  73. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  74. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  75. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  76. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  77. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  78. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  79. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  80. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  81. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  82. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  83. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  84. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  85. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  86. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  87. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  88. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  89. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  90. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  91. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  92. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  93. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  94. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/create_app.py +0 -0
  95. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/dependency_container.py +0 -0
  96. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  97. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  98. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
  99. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/config.py +0 -0
  100. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/constants.py +0 -0
  101. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  102. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  103. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  104. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  105. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  106. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  107. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  108. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  109. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  110. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  111. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  112. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  113. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  114. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  115. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  116. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  117. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  118. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  119. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  120. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  121. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  122. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  123. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  124. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  125. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  126. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  127. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  128. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  129. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  130. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  131. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  132. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  133. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  134. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  135. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  136. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  137. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  138. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  139. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  140. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  141. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  142. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  143. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
  144. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
  145. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  146. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  147. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  148. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  149. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  150. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  151. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  152. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  153. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  154. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  155. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  156. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  157. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  158. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  159. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  160. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  161. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/download_data.py +0 -0
  162. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  163. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  164. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  165. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  166. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  167. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  168. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  169. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  170. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  171. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  172. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  173. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  174. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  175. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  176. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  177. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  178. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  179. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  180. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  181. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  182. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  183. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  184. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  185. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  186. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  187. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  188. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  189. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  190. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  191. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  192. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  193. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  194. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  195. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  196. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  197. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  198. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  199. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  200. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  201. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  202. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  203. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  204. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  205. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  206. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  207. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
  208. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
  209. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
  210. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
  211. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
  212. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/__init__.py +0 -0
  213. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  214. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
  215. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  216. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  217. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  218. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  219. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  220. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  221. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  222. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  223. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  224. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  225. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  226. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  227. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  228. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  229. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  230. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  231. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  232. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  233. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  234. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  235. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  236. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  237. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  238. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  239. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  240. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  241. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  242. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  243. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  244. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  245. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  246. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  247. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  248. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  249. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  250. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  251. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  252. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  253. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  254. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  255. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  256. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  257. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  258. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  259. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  260. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  261. {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.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.4.0
3
+ Version: 7.5.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -8,7 +8,7 @@ from .app import App, Algorithm, \
8
8
  get_monthly_returns_heatmap_chart, create_weights, \
9
9
  get_yearly_returns_bar_chart, get_entry_and_exit_signals, \
10
10
  get_ohlcv_data_completeness_chart
11
- from .domain import ApiException, \
11
+ from .domain import ApiException, combine_backtests, \
12
12
  OrderType, OperationalException, OrderStatus, OrderSide, \
13
13
  TimeUnit, TimeInterval, Order, Portfolio, Backtest, \
14
14
  Position, TimeFrame, INDEX_DATETIME, MarketCredential, \
@@ -163,5 +163,6 @@ __all__ = [
163
163
  "get_entry_and_exit_signals",
164
164
  "get_growth",
165
165
  "get_growth_percentage",
166
- "BacktestEvaluationFocus"
166
+ "BacktestEvaluationFocus",
167
+ "combine_backtests",
167
168
  ]
@@ -1325,13 +1325,19 @@ class App:
1325
1325
 
1326
1326
  for data_source in data_sources:
1327
1327
  if DataType.OHLCV.equals(data_source.data_type):
1328
+ data_provider = data_provider_service.get(data_source)
1328
1329
  data = data_provider_service.get_data(
1329
1330
  data_source=data_source,
1330
- start_date=backtest_date_range.start_date,
1331
+ start_date=data_provider._start_date_data_source,
1331
1332
  end_date=backtest_date_range.end_date
1332
1333
  )
1333
1334
  original_data_combinations.append((data_source, data))
1334
- original_datasets_ordered_by_symbol[data_source.symbol] = data
1335
+ original_datasets_ordered_by_symbol[data_source.symbol] = \
1336
+ data_provider_service.get_data(
1337
+ data_source=data_source,
1338
+ start_date=data_provider._start_date_data_source,
1339
+ end_date=backtest_date_range.end_date
1340
+ )
1335
1341
 
1336
1342
  for _ in tqdm(
1337
1343
  range(number_of_permutations),
@@ -1356,19 +1362,21 @@ class App:
1356
1362
  self._data_providers = []
1357
1363
 
1358
1364
  for combi in permutated_datasets:
1359
- dp_identifier = combi[0].data_provider_identifier
1365
+ data_source = combi[0]
1366
+ data_provider = PandasOHLCVDataProvider(
1367
+ dataframe=combi[1],
1368
+ symbol=data_source.symbol,
1369
+ market=data_source.market,
1370
+ window_size=data_source.window_size,
1371
+ time_frame=data_source.time_frame,
1372
+ data_provider_identifier=data_source
1373
+ .data_provider_identifier,
1374
+ pandas=data_source.pandas,
1375
+ )
1360
1376
  # Add pandas ohlcv data provider to the data provider service
1361
- self.add_data_provider(
1362
- PandasOHLCVDataProvider(
1363
- dataframe=combi[1],
1364
- symbol=combi[0].symbol,
1365
- market=combi[0].market,
1366
- window_size=combi[0].window_size,
1367
- time_frame=combi[0].time_frame,
1368
- data_provider_identifier=dp_identifier,
1369
- pandas=combi[0].pandas,
1370
- ),
1371
- priority=1
1377
+ data_provider_service.register_data_provider(
1378
+ data_source=data_source,
1379
+ data_provider=data_provider
1372
1380
  )
1373
1381
 
1374
1382
  # Run the backtest with the permuted strategy
@@ -1378,7 +1386,7 @@ class App:
1378
1386
  strategy=strategy,
1379
1387
  snapshot_interval=SnapshotInterval.DAILY,
1380
1388
  risk_free_rate=risk_free_rate,
1381
- show_data_initialization_progress=False
1389
+ skip_data_sources_initialization=True
1382
1390
  )
1383
1391
 
1384
1392
  # Add the results of the permuted backtest to the main backtest
@@ -1391,7 +1399,10 @@ class App:
1391
1399
  real_metrics=backtest_metrics,
1392
1400
  permutated_metrics=permuted_metrics,
1393
1401
  ohlcv_permutated_datasets=permuted_datasets_ordered_by_symbol,
1394
- ohlcv_original_datasets=original_datasets_ordered_by_symbol
1402
+ ohlcv_original_datasets=original_datasets_ordered_by_symbol,
1403
+ backtest_start_date=backtest_date_range.start_date,
1404
+ backtest_end_date=backtest_date_range.end_date,
1405
+ backtest_date_range_name=backtest_date_range.name
1395
1406
  )
1396
1407
  return permutation_test_metrics
1397
1408
 
@@ -4,6 +4,7 @@ from .monthly_returns_heatmap import get_monthly_returns_heatmap_chart
4
4
  from .yearly_returns_barchart import get_yearly_returns_bar_chart
5
5
  from .ohlcv_data_completeness import get_ohlcv_data_completeness_chart
6
6
  from .entry_exist_signals import get_entry_and_exit_signals
7
+ from .line_chart import create_line_scatter
7
8
 
8
9
  __all__ = [
9
10
  "get_equity_curve_with_drawdown_chart",
@@ -12,4 +13,5 @@ __all__ = [
12
13
  "get_yearly_returns_bar_chart",
13
14
  "get_ohlcv_data_completeness_chart",
14
15
  "get_entry_and_exit_signals",
16
+ "create_line_scatter",
15
17
  ]
@@ -0,0 +1,11 @@
1
+ import plotly.graph_objects as go
2
+
3
+
4
+ def create_line_scatter(x, y, name, colour = 'blue'):
5
+ return go.Scatter(
6
+ x=x,
7
+ y=y,
8
+ mode='lines',
9
+ name=name,
10
+ line=dict(color=colour)
11
+ )
@@ -34,7 +34,7 @@ from .utils import random_string, append_dict_as_row_to_csv, \
34
34
  csv_to_list, StoppableThread, load_csv_into_dict, tqdm, \
35
35
  is_timezone_aware, sync_timezones, get_timezone
36
36
  from .backtesting import BacktestRun, BacktestSummaryMetrics, \
37
- BacktestDateRange, Backtest, BacktestMetrics, \
37
+ BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
38
38
  BacktestPermutationTest, BacktestEvaluationFocus
39
39
 
40
40
  __all__ = [
@@ -140,5 +140,6 @@ __all__ = [
140
140
  "is_jupyter_notebook",
141
141
  "tqdm",
142
142
  "DEFAULT_DATETIME_FORMAT",
143
- "BacktestEvaluationFocus"
143
+ "BacktestEvaluationFocus",
144
+ 'combine_backtests'
144
145
  ]
@@ -5,6 +5,7 @@ from .backtest_run import BacktestRun
5
5
  from .backtest import Backtest
6
6
  from .backtest_permutation_test import BacktestPermutationTest
7
7
  from .backtest_evaluation_focuss import BacktestEvaluationFocus
8
+ from .combine_backtests import combine_backtests
8
9
 
9
10
  __all__ = [
10
11
  "Backtest",
@@ -13,5 +14,6 @@ __all__ = [
13
14
  "BacktestMetrics",
14
15
  "BacktestRun",
15
16
  "BacktestPermutationTest",
16
- "BacktestEvaluationFocus"
17
+ "BacktestEvaluationFocus",
18
+ "combine_backtests"
17
19
  ]
@@ -91,6 +91,27 @@ class Backtest:
91
91
  return run
92
92
  return None
93
93
 
94
+ def get_backtest_permutation_test(
95
+ self, date_range: BacktestDateRange
96
+ ) -> Union[BacktestPermutationTest, None]:
97
+ """
98
+ Retrieve a specific BacktestPermutationTest based on
99
+ the provided date range.
100
+
101
+ Args:
102
+ date_range (BacktestDateRange): The date range to search for.
103
+
104
+ Returns:
105
+ Union[BacktestPermutationTest, None]: The
106
+ matching BacktestPermutationTest if found,
107
+ otherwise None.
108
+ """
109
+ for perm_test in self.backtest_permutation_tests:
110
+ if (perm_test.backtest_start_date == date_range.start_date and
111
+ perm_test.backtest_end_date == date_range.end_date):
112
+ return perm_test
113
+ return None
114
+
94
115
  def get_all_backtest_metrics(self) -> List[BacktestMetrics]:
95
116
  """
96
117
  Retrieve all BacktestMetrics from the backtest runs.
@@ -382,3 +403,15 @@ class Backtest:
382
403
  )
383
404
  for run in self.backtest_runs
384
405
  ]
406
+
407
+ def add_permutation_test(
408
+ self, permutation_test: BacktestPermutationTest
409
+ ) -> None:
410
+ """
411
+ Add a permutation test to the backtest.
412
+
413
+ Args:
414
+ permutation_test (BacktestPermutationTest): The permutation test
415
+ to add.
416
+ """
417
+ self.backtest_permutation_tests.append(permutation_test)
@@ -165,6 +165,11 @@ class BacktestMetrics:
165
165
  best_year: Tuple[float, date] = None
166
166
  worst_month: Tuple[float, datetime] = None
167
167
  worst_year: Tuple[float, date] = None
168
+ total_number_of_days: int = None
169
+
170
+ def __post_init__(self):
171
+ self.total_number_of_days = (self.backtest_end_date -
172
+ self.backtest_start_date).days
168
173
 
169
174
  def to_dict(self) -> dict:
170
175
  """
@@ -42,6 +42,9 @@ class BacktestPermutationTest:
42
42
  field(default_factory=dict)
43
43
  ohlcv_original_datasets: Dict[str, pd.DataFrame] = \
44
44
  field(default_factory=dict)
45
+ backtest_start_date: pd.Timestamp = None
46
+ backtest_end_date: pd.Timestamp = None
47
+ backtest_date_range_name: str = None
45
48
 
46
49
  def compute_p_values(
47
50
  self, metrics: List[str] = None, one_sided: bool = True
@@ -20,9 +20,18 @@ class BacktestSummaryMetrics:
20
20
  total_net_gain (float): Total net gain from the backtest.
21
21
  total_net_gain_percentage (float): Total net gain percentage
22
22
  from the backtest.
23
+ average_total_net_gain (float): Average total net gain across
24
+ multiple backtests.
25
+ average_total_net_gain_percentage (float): Average total net gain
26
+ percentage across multiple backtests.
23
27
  gross_loss (float): Total gross loss from all trades.
28
+ average_gross_loss (float): Average gross loss across
29
+ multiple backtests.
24
30
  growth (float): Total growth from the backtest.
25
31
  growth_percentage (float): Total growth percentage from the backtest.
32
+ average_growth (float): Average growth across multiple backtests.
33
+ average_growth_percentage (float): Average growth percentage across
34
+ multiple backtests.
26
35
  trades_average_return (float): Average return per trade.
27
36
  cagr (float): Compound annual growth rate of the backtest.
28
37
  sharpe_ratio (float): Sharpe ratio, risk-adjusted return.
@@ -41,9 +50,14 @@ class BacktestSummaryMetrics:
41
50
  """
42
51
  total_net_gain: float = None
43
52
  total_net_gain_percentage: float = None
53
+ average_total_net_gain: float = None
54
+ average_total_net_gain_percentage: float = None
44
55
  gross_loss: float = None
56
+ average_gross_loss: float = None
45
57
  growth: float = None
46
58
  growth_percentage: float = None
59
+ average_growth: float = None
60
+ average_growth_percentage: float = None
47
61
  trades_average_return: float = None
48
62
  cagr: float = None
49
63
  sharpe_ratio: float = None
@@ -67,9 +81,15 @@ class BacktestSummaryMetrics:
67
81
  return {
68
82
  "total_net_gain": self.total_net_gain,
69
83
  "total_net_gain_percentage": self.total_net_gain_percentage,
84
+ "average_total_net_gain": self.average_total_net_gain,
85
+ "average_total_net_gain_percentage":
86
+ self.average_total_net_gain_percentage,
70
87
  "gross_loss": self.gross_loss,
88
+ "average_gross_loss": self.average_gross_loss,
71
89
  "growth": self.growth,
72
90
  "growth_percentage": self.growth_percentage,
91
+ "average_growth": self.average_growth,
92
+ "average_growth_percentage": self.average_growth_percentage,
73
93
  "trades_average_return": self.trades_average_return,
74
94
  "cagr": self.cagr,
75
95
  "sharpe_ratio": self.sharpe_ratio,
@@ -120,7 +140,8 @@ class BacktestSummaryMetrics:
120
140
  self.cumulative_exposure = other.cumulative_exposure
121
141
  else:
122
142
  self.cumulative_exposure = safe_mean(
123
- self.cumulative_exposure, other.cumulative_exposure
143
+ self.cumulative_exposure,
144
+ other.cumulative_exposure
124
145
  )
125
146
 
126
147
  if self.exposure_ratio is None:
@@ -0,0 +1,211 @@
1
+ from typing import List
2
+
3
+ from investing_algorithm_framework.domain.backtesting import Backtest, \
4
+ BacktestDateRange
5
+ from investing_algorithm_framework.domain.backtesting import \
6
+ BacktestSummaryMetrics
7
+
8
+
9
+ def safe_weighted_mean(values, weights):
10
+ """
11
+ Calculate the weighted mean of a list of values,
12
+ ignoring None values and weights <= 0.
13
+
14
+ Args:
15
+ values (List[float | None]): List of values to average.
16
+ weights (List[float | None]): Corresponding weights for the values.
17
+
18
+ Returns:
19
+ float | None: The weighted mean, or None if no valid values.
20
+ """
21
+ vals = [(v, w) for v, w in zip(values, weights) if
22
+ v is not None and w is not None and w > 0]
23
+ if not vals:
24
+ return None
25
+ total_weight = sum(w for _, w in vals)
26
+ return sum(
27
+ v * w for v, w in vals
28
+ ) / total_weight if total_weight > 0 else None
29
+
30
+
31
+ def combine_backtests(
32
+ backtests: List[Backtest],
33
+ backtest_date_range: BacktestDateRange = None
34
+ ) -> Backtest:
35
+ """
36
+ Combine multiple backtests into a single backtest by aggregating
37
+ their results.
38
+
39
+ Args:
40
+ backtests (List[Backtest]): List of Backtest instances to combine.
41
+ backtest_date_range (BacktestDateRange, optional): The date range
42
+ for the combined backtest.
43
+
44
+ Returns:
45
+ Backtest: A new Backtest instance representing the combined results.
46
+ """
47
+ backtest_metrics = []
48
+ backtest_runs = []
49
+
50
+ for backtest in backtests:
51
+ backtest_metric = None
52
+ backtest_run = None
53
+
54
+ if backtest_date_range is not None:
55
+ backtest_metric = \
56
+ backtest.get_backtest_metrics(backtest_date_range)
57
+ backtest_run = \
58
+ backtest.get_backtest_run(backtest_date_range)
59
+ else:
60
+ backtest_run = backtest.backtest_runs[0] \
61
+ if len(backtest.backtest_runs) > 0 else None
62
+
63
+ if backtest_run is not None:
64
+ backtest_metric = backtest_run.backtest_metrics
65
+
66
+ if backtest_metric is not None:
67
+ backtest_metrics.append(backtest_metric)
68
+ backtest_runs.append(backtest_run)
69
+
70
+ total_net_gain = sum(
71
+ b.total_net_gain for b in backtest_metrics
72
+ if b.total_net_gain is not None
73
+ )
74
+ average_total_net_gain = safe_weighted_mean(
75
+ [b.total_net_gain for b in backtest_metrics],
76
+ [b.total_number_of_days for b in backtest_metrics]
77
+ )
78
+ average_total_net_gain_percentage = safe_weighted_mean(
79
+ [b.total_net_gain_percentage for b in backtest_metrics],
80
+ [b.total_number_of_days for b in backtest_metrics]
81
+ )
82
+ total_net_gain_percentage = sum(
83
+ b.total_net_gain_percentage for b in backtest_metrics
84
+ if b.total_net_gain_percentage is not None
85
+ )
86
+ gross_loss = sum(
87
+ b.gross_loss for b in backtest_metrics
88
+ if b.gross_loss is not None
89
+ )
90
+ average_gross_loss = safe_weighted_mean(
91
+ [b.gross_loss for b in backtest_metrics],
92
+ [b.total_number_of_days for b in backtest_metrics]
93
+ )
94
+ growth = sum(
95
+ b.growth for b in backtest_metrics
96
+ if b.growth is not None
97
+ )
98
+ growth_percentage = sum(
99
+ b.growth_percentage for b in backtest_metrics
100
+ if b.growth_percentage is not None
101
+ )
102
+ average_growth = safe_weighted_mean(
103
+ [b.growth for b in backtest_metrics],
104
+ [b.total_number_of_days for b in backtest_metrics]
105
+ )
106
+ average_growth_percentage = safe_weighted_mean(
107
+ [b.growth_percentage for b in backtest_metrics],
108
+ [b.total_number_of_days for b in backtest_metrics]
109
+ )
110
+ trades_average_return = safe_weighted_mean(
111
+ [b.trades_average_return for b in backtest_metrics],
112
+ [b.total_number_of_days for b in backtest_metrics]
113
+ )
114
+ cagr = safe_weighted_mean(
115
+ [b.cagr for b in backtest_metrics],
116
+ [b.total_number_of_days for b in backtest_metrics]
117
+ )
118
+ sharp_ratio = safe_weighted_mean(
119
+ [b.sharpe_ratio for b in backtest_metrics],
120
+ [b.total_number_of_days for b in backtest_metrics]
121
+ )
122
+ sortino_ratio = safe_weighted_mean(
123
+ [b.sortino_ratio for b in backtest_metrics],
124
+ [b.total_number_of_days for b in backtest_metrics]
125
+ )
126
+ calmar_ratio = safe_weighted_mean(
127
+ [b.calmar_ratio for b in backtest_metrics],
128
+ [b.total_number_of_days for b in backtest_metrics]
129
+ )
130
+ profit_factor = safe_weighted_mean(
131
+ [b.profit_factor for b in backtest_metrics],
132
+ [b.total_number_of_days for b in backtest_metrics]
133
+ )
134
+ annual_volatility = safe_weighted_mean(
135
+ [b.annual_volatility for b in backtest_metrics],
136
+ [b.total_number_of_days for b in backtest_metrics]
137
+ )
138
+ max_drawdown = max(
139
+ (b.max_drawdown for b in backtest_metrics
140
+ if b.max_drawdown is not None), default=None
141
+ )
142
+ max_drawdown_duration = max(
143
+ (b.max_drawdown_duration for b in backtest_metrics
144
+ if b.max_drawdown_duration is not None), default=None
145
+ )
146
+ trades_per_year = safe_weighted_mean(
147
+ [b.trades_per_year for b in backtest_metrics],
148
+ [b.total_number_of_days for b in backtest_metrics]
149
+ )
150
+ win_rate = safe_weighted_mean(
151
+ [b.win_rate for b in backtest_metrics],
152
+ [b.total_number_of_days for b in backtest_metrics]
153
+ )
154
+ win_loss_ratio = safe_weighted_mean(
155
+ [b.win_loss_ratio for b in backtest_metrics],
156
+ [b.total_number_of_days for b in backtest_metrics]
157
+ )
158
+ number_of_trades = sum(
159
+ b.number_of_trades for b in backtest_metrics
160
+ if b.number_of_trades is not None
161
+ )
162
+ cumulative_exposure = safe_weighted_mean(
163
+ [b.cumulative_exposure for b in backtest_metrics],
164
+ [b.total_number_of_days for b in backtest_metrics]
165
+ )
166
+ exposure_ratio = safe_weighted_mean(
167
+ [b.exposure_ratio for b in backtest_metrics],
168
+ [b.total_number_of_days for b in backtest_metrics]
169
+ )
170
+ summary = BacktestSummaryMetrics(
171
+ total_net_gain=total_net_gain,
172
+ total_net_gain_percentage=total_net_gain_percentage,
173
+ average_total_net_gain=average_total_net_gain,
174
+ average_total_net_gain_percentage=average_total_net_gain_percentage,
175
+ gross_loss=gross_loss,
176
+ average_gross_loss=average_gross_loss,
177
+ growth=growth,
178
+ growth_percentage=growth_percentage,
179
+ average_growth=average_growth,
180
+ average_growth_percentage=average_growth_percentage,
181
+ trades_average_return=trades_average_return,
182
+ cagr=cagr,
183
+ sharpe_ratio=sharp_ratio,
184
+ sortino_ratio=sortino_ratio,
185
+ calmar_ratio=calmar_ratio,
186
+ profit_factor=profit_factor,
187
+ annual_volatility=annual_volatility,
188
+ max_drawdown=max_drawdown,
189
+ max_drawdown_duration=max_drawdown_duration,
190
+ trades_per_year=trades_per_year,
191
+ win_rate=win_rate,
192
+ win_loss_ratio=win_loss_ratio,
193
+ number_of_trades=number_of_trades,
194
+ cumulative_exposure=cumulative_exposure,
195
+ exposure_ratio=exposure_ratio
196
+ )
197
+
198
+ metadata = None
199
+
200
+ # Get first non-empty metadata
201
+ for backtest in backtests:
202
+ if backtest.metadata:
203
+ metadata = backtest.metadata
204
+ break
205
+
206
+ backtest = Backtest(
207
+ backtest_summary=summary,
208
+ metadata=metadata,
209
+ backtest_runs=backtest_runs
210
+ )
211
+ return backtest
@@ -322,6 +322,20 @@ class DataProviderService:
322
322
  self.configuration_service = configuration_service
323
323
  self.market_credential_service = market_credential_service
324
324
 
325
+ def get(self, data_source: DataSource) -> Optional[DataProvider]:
326
+ """
327
+ Get a registered data provider by its data source.
328
+
329
+ Args:
330
+ data_source (DataSource): The data source to get the
331
+ data provider for.
332
+
333
+ Returns:
334
+ Optional[DataProvider]: The registered data provider for
335
+ the data source, or None if not found.
336
+ """
337
+ return self.data_provider_index.get(data_source)
338
+
325
339
  def get_data(
326
340
  self,
327
341
  data_source: DataSource,
@@ -578,6 +592,28 @@ class DataProviderService:
578
592
  f"No data provider found for the given parameters: {params}"
579
593
  )
580
594
 
595
+ def register_data_provider(
596
+ self, data_source: DataSource, data_provider: DataProvider
597
+ ) -> DataProvider:
598
+ """
599
+ Function to directly register a data provider for a given data source.
600
+
601
+ This method will not check if the data provider supports the
602
+ data source. It will directly register the data provider in the index.
603
+
604
+ Args:
605
+ data_source (DataSource): The data source to register the
606
+ data provider for.
607
+ data_provider (DataProvider): The data provider to register.
608
+
609
+ Returns:
610
+ DataProvider: The registered data provider.
611
+ """
612
+ data_provider = data_provider.copy(data_source)
613
+ self.data_provider_index.data_providers_lookup[data_source] = \
614
+ data_provider
615
+ return data_provider
616
+
581
617
  def add_data_provider(
582
618
  self, data_provider: DataProvider, priority: int = 3
583
619
  ):
@@ -742,6 +778,15 @@ class DataProviderService:
742
778
 
743
779
  return data_files
744
780
 
781
+ def get_all_registered_data_providers(self) -> List[DataProvider]:
782
+ """
783
+ Function to get all registered data providers.
784
+
785
+ Returns:
786
+ List[DataProvider]: A list of all registered data providers.
787
+ """
788
+ return self.data_provider_index.get_all()
789
+
745
790
  def reset(self):
746
791
  """
747
792
  Function to reset all the data providers and the data provider
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v7.4.0"
3
+ version = "v7.5.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"