investing-algorithm-framework 7.13.0__tar.gz → 7.14.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 (259) hide show
  1. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/PKG-INFO +1 -22
  2. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/README.md +0 -21
  3. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/__init__.py +3 -2
  4. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/app.py +5 -4
  5. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/__init__.py +4 -2
  6. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/__init__.py +4 -2
  7. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -8
  8. investing_algorithm_framework-7.14.0/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +154 -0
  9. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +117 -49
  10. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +5 -8
  11. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/pyproject.toml +1 -1
  12. investing_algorithm_framework-7.13.0/investing_algorithm_framework/domain/backtesting/BacktestInitializer.py +0 -7
  13. investing_algorithm_framework-7.13.0/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -360
  14. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/LICENSE +0 -0
  15. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/__init__.py +0 -0
  16. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  17. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  18. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  19. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
  20. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  21. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
  22. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
  23. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  24. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/context.py +0 -0
  25. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  26. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  27. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  28. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  29. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  30. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  31. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  32. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  33. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  34. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  35. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  36. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  37. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  38. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  39. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  40. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  41. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  42. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  43. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  44. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  45. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  46. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  47. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  48. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  49. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  50. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  51. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  52. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/strategy.py +0 -0
  53. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/task.py +0 -0
  54. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  55. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  56. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  57. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  58. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  59. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  60. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  61. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  62. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  63. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  64. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  65. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  66. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  67. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  68. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  69. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/cli.py +0 -0
  70. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  71. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  72. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  73. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  74. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  75. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  76. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  77. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  78. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  79. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  80. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  81. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  82. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  83. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  84. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  85. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  86. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  87. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  88. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  89. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  90. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  91. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  92. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  93. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  94. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/create_app.py +0 -0
  95. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/dependency_container.py +0 -0
  96. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  97. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  98. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  99. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  100. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
  101. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/config.py +0 -0
  102. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/constants.py +0 -0
  103. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  104. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  105. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  106. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  107. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  108. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  109. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  110. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  111. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  112. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  113. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  114. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  115. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  116. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  117. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  118. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  119. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  120. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  121. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  122. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  123. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  124. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  125. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  126. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  127. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  128. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  129. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  130. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  131. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  132. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  133. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  134. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  135. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  136. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  137. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  138. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  139. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  140. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  141. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  142. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  143. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/positions/__init__.py +0 -0
  144. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/positions/position_size.py +0 -0
  145. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  146. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  147. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  148. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  149. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  150. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  151. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  152. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  153. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  154. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  155. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  156. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  157. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  158. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  159. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  160. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  161. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  162. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  163. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/download_data.py +0 -0
  164. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  165. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  166. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  167. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  168. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  169. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  170. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  171. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  172. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  173. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  174. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  175. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  176. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  177. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  178. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  179. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  180. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  181. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  182. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  183. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  184. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  185. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  186. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  187. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  188. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  189. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  190. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  191. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  192. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  193. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  194. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  195. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  196. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  197. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  198. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  199. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  200. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  201. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  202. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  203. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  204. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  205. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  206. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  207. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  208. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  209. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/__init__.py +0 -0
  210. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  211. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  212. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  213. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  214. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  215. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  216. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  217. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  218. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  219. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  220. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  221. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  222. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  223. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  224. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  225. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  226. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  227. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  228. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  229. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  230. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  231. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  232. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  233. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  234. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  235. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  236. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  237. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  238. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  239. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  240. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  241. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  242. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  243. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  244. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  245. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  246. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  247. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  248. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  249. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  250. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  251. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  252. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  253. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  254. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  255. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  256. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  257. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  258. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  259. {investing_algorithm_framework-7.13.0 → investing_algorithm_framework-7.14.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.13.0
3
+ Version: 7.14.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -212,13 +212,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
212
212
  data_sources=data_sources, time_unit=time_unit, interval=interval
213
213
  )
214
214
 
215
- self.buy_signal_dates = {}
216
- self.sell_signal_dates = {}
217
-
218
- for symbol in self.symbols:
219
- self.buy_signal_dates[symbol] = []
220
- self.sell_signal_dates[symbol] = []
221
-
222
215
  def _prepare_indicators(
223
216
  self,
224
217
  rsi_data,
@@ -299,13 +292,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
299
292
  buy_signal = rsi_oversold & ema_crossover_lookback
300
293
  buy_signals = buy_signal.fillna(False).astype(bool)
301
294
  signals[symbol] = buy_signals
302
-
303
- # Get all dates where there is a sell signal
304
- buy_signal_dates = buy_signals[buy_signals].index.tolist()
305
-
306
- if buy_signal_dates:
307
- self.buy_signal_dates[symbol] += buy_signal_dates
308
-
309
295
  return signals
310
296
 
311
297
  def generate_sell_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
@@ -345,13 +331,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
345
331
  sell_signal = rsi_overbought & ema_crossunder_lookback
346
332
  sell_signal = sell_signal.fillna(False).astype(bool)
347
333
  signals[symbol] = sell_signal
348
-
349
- # Get all dates where there is a sell signal
350
- sell_signal_dates = sell_signal[sell_signal].index.tolist()
351
-
352
- if sell_signal_dates:
353
- self.sell_signal_dates[symbol] += sell_signal_dates
354
-
355
334
  return signals
356
335
 
357
336
 
@@ -176,13 +176,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
176
176
  data_sources=data_sources, time_unit=time_unit, interval=interval
177
177
  )
178
178
 
179
- self.buy_signal_dates = {}
180
- self.sell_signal_dates = {}
181
-
182
- for symbol in self.symbols:
183
- self.buy_signal_dates[symbol] = []
184
- self.sell_signal_dates[symbol] = []
185
-
186
179
  def _prepare_indicators(
187
180
  self,
188
181
  rsi_data,
@@ -263,13 +256,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
263
256
  buy_signal = rsi_oversold & ema_crossover_lookback
264
257
  buy_signals = buy_signal.fillna(False).astype(bool)
265
258
  signals[symbol] = buy_signals
266
-
267
- # Get all dates where there is a sell signal
268
- buy_signal_dates = buy_signals[buy_signals].index.tolist()
269
-
270
- if buy_signal_dates:
271
- self.buy_signal_dates[symbol] += buy_signal_dates
272
-
273
259
  return signals
274
260
 
275
261
  def generate_sell_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
@@ -309,13 +295,6 @@ class RSIEMACrossoverStrategy(TradingStrategy):
309
295
  sell_signal = rsi_overbought & ema_crossunder_lookback
310
296
  sell_signal = sell_signal.fillna(False).astype(bool)
311
297
  signals[symbol] = sell_signal
312
-
313
- # Get all dates where there is a sell signal
314
- sell_signal_dates = sell_signal[sell_signal].index.tolist()
315
-
316
- if sell_signal_dates:
317
- self.sell_signal_dates[symbol] += sell_signal_dates
318
-
319
298
  return signals
320
299
 
321
300
 
@@ -16,7 +16,7 @@ from .domain import ApiException, combine_backtests, PositionSize, \
16
16
  Trade, SYMBOLS, RESERVED_BALANCES, APP_MODE, AppMode, DATETIME_FORMAT, \
17
17
  BacktestDateRange, convert_polars_to_pandas, \
18
18
  DEFAULT_LOGGING_CONFIG, DataType, DataProvider, \
19
- TradeStatus, TradeRiskType, \
19
+ TradeStatus, TradeRiskType, generate_backtest_summary_metrics, \
20
20
  APPLICATION_DIRECTORY, DataSource, OrderExecutor, PortfolioProvider, \
21
21
  SnapshotInterval, AWS_S3_STATE_BUCKET_NAME, BacktestEvaluationFocus
22
22
  from .infrastructure import AzureBlobStorageStateHandler, \
@@ -173,5 +173,6 @@ __all__ = [
173
173
  "get_cumulative_return",
174
174
  "get_cumulative_return_series",
175
175
  "get_total_loss",
176
- "get_total_growth"
176
+ "get_total_growth",
177
+ "generate_backtest_summary_metrics"
177
178
  ]
@@ -20,7 +20,7 @@ from investing_algorithm_framework.domain import DATABASE_NAME, TimeUnit, \
20
20
  PortfolioConfiguration, SnapshotInterval, DataType, combine_backtests, \
21
21
  PortfolioProvider, OrderExecutor, ImproperlyConfigured, \
22
22
  DataProvider, INDEX_DATETIME, tqdm, BacktestPermutationTest, \
23
- LAST_SNAPSHOT_DATETIME, BACKTESTING_FLAG
23
+ LAST_SNAPSHOT_DATETIME, BACKTESTING_FLAG, generate_backtest_summary_metrics
24
24
  from investing_algorithm_framework.infrastructure import setup_sqlalchemy, \
25
25
  create_all_tables, CCXTOrderExecutor, CCXTPortfolioProvider, \
26
26
  BacktestOrderExecutor, CCXTOHLCVDataProvider, clear_db, \
@@ -1022,7 +1022,10 @@ class App:
1022
1022
  )
1023
1023
  backtest = Backtest(
1024
1024
  backtest_runs=[run],
1025
- risk_free_rate=risk_free_rate
1025
+ risk_free_rate=risk_free_rate,
1026
+ backtest_summary=generate_backtest_summary_metrics(
1027
+ [run.backtest_metrics]
1028
+ )
1026
1029
  )
1027
1030
 
1028
1031
  # Add the metadata to the backtest
@@ -1323,9 +1326,7 @@ class App:
1323
1326
  original_datasets_ordered_by_symbol = {}
1324
1327
 
1325
1328
  for data_source in data_sources:
1326
- print(data_source)
1327
1329
  if DataType.OHLCV.equals(data_source.data_type):
1328
- print(data_source.symbol)
1329
1330
  data_provider = data_provider_service.get(data_source)
1330
1331
  data = data_provider_service.get_data(
1331
1332
  data_source=data_source,
@@ -35,7 +35,8 @@ from .utils import random_string, append_dict_as_row_to_csv, \
35
35
  is_timezone_aware, sync_timezones, get_timezone
36
36
  from .backtesting import BacktestRun, BacktestSummaryMetrics, \
37
37
  BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
38
- BacktestPermutationTest, BacktestEvaluationFocus
38
+ BacktestPermutationTest, BacktestEvaluationFocus, \
39
+ generate_backtest_summary_metrics
39
40
  from .positions import PositionSize
40
41
 
41
42
  __all__ = [
@@ -141,5 +142,6 @@ __all__ = [
141
142
  "DEFAULT_DATETIME_FORMAT",
142
143
  "BacktestEvaluationFocus",
143
144
  'combine_backtests',
144
- 'PositionSize'
145
+ 'PositionSize',
146
+ 'generate_backtest_summary_metrics'
145
147
  ]
@@ -5,7 +5,8 @@ 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
+ from .combine_backtests import combine_backtests, \
9
+ generate_backtest_summary_metrics
9
10
 
10
11
  __all__ = [
11
12
  "Backtest",
@@ -15,5 +16,6 @@ __all__ = [
15
16
  "BacktestRun",
16
17
  "BacktestPermutationTest",
17
18
  "BacktestEvaluationFocus",
18
- "combine_backtests"
19
+ "combine_backtests",
20
+ "generate_backtest_summary_metrics"
19
21
  ]
@@ -57,14 +57,6 @@ class Backtest:
57
57
  strategy_ids: List[int] = field(default_factory=list)
58
58
  algorithm_id: int = None
59
59
 
60
- def __post_init__(self):
61
- # Create the BacktestSummaryMetrics instance if it doesn't exist
62
- if self.backtest_summary is None:
63
- self.backtest_summary = BacktestSummaryMetrics()
64
-
65
- for backtest_metrics in self.get_all_backtest_metrics():
66
- self.backtest_summary.add(backtest_metrics)
67
-
68
60
  def get_all_backtest_runs(self) -> List[BacktestRun]:
69
61
  """
70
62
  Retrieve all BacktestRun instances from the backtest.
@@ -0,0 +1,154 @@
1
+ import json
2
+ import os
3
+ from dataclasses import dataclass
4
+ from logging import getLogger
5
+ from pathlib import Path
6
+
7
+ logger = getLogger(__name__)
8
+
9
+
10
+ @dataclass
11
+ class BacktestSummaryMetrics:
12
+ """
13
+ Represents the summarized results of a backtest,
14
+ focusing on key headline performance and risk metrics.
15
+
16
+ Attributes:
17
+ total_net_gain (float): Total net gain from the backtest.
18
+ total_net_gain_percentage (float): Total net gain percentage
19
+ from the backtest.
20
+ total_loss (float): Total gross loss from all trades.
21
+ total_loss_percentage (float): Total gross loss percentage.
22
+ total_growth (float): Total growth from the backtest.
23
+ total_growth_percentage (float): Total growth percentage
24
+ from the backtest.
25
+ average_net_gain (float): Average returns across multiple backtests.
26
+ average_net_gain_percentage (float): Average return percentage across
27
+ multiple backtests.
28
+ average_growth (float): Average growth across multiple backtests.
29
+ average_growth_percentage (float): Average growth percentage across
30
+ multiple backtests.
31
+ average_loss (float): Average loss across multiple backtests.
32
+ average_loss_percentage (float): Average loss percentage across
33
+ multiple backtests.
34
+ average_trade_return (float): Average return per trade.
35
+ average_trade_return_percentage (float): Average return percentage
36
+ per trade.
37
+ average_trade_loss (float): Total gross loss from all trades.
38
+ average_trade_loss_percentage (float): Average trade loss percentage.
39
+ average_trade_gain (float): Average gain from winning trades.
40
+ average_trade_gain_percentage (float): Average gain percentage
41
+ cagr (float): Compound annual growth rate of the backtest.
42
+ sharpe_ratio (float): Sharpe ratio, risk-adjusted return.
43
+ sortino_ratio (float): Sortino ratio, downside-risk adjusted return.
44
+ calmar_ratio (float): CAGR relative to max drawdown.
45
+ profit_factor (float): Total profit / total loss.
46
+ annual_volatility (float): Annualized volatility of returns.
47
+ max_drawdown (float): Maximum drawdown observed.
48
+ max_drawdown_duration (int): Duration of the maximum drawdown.
49
+ trades_per_year (float): Average trades executed per year.
50
+ win_rate (float): Percentage of winning trades.
51
+ win_loss_ratio (float): Ratio of average win to average loss.
52
+ number_of_trades (int): Total number of trades executed.
53
+ cumulative_exposure (float): Total exposure over the backtest period.
54
+ exposure_ratio (float): Ratio of exposure to available capital.
55
+ """
56
+ total_net_gain: float = None
57
+ total_net_gain_percentage: float = None
58
+ total_growth: float = None
59
+ total_growth_percentage: float = None
60
+ total_loss: float = None
61
+ total_loss_percentage: float = None
62
+ average_net_gain: float = None
63
+ average_net_gain_percentage: float = None
64
+ average_growth: float = None
65
+ average_growth_percentage: float = None
66
+ average_loss: float = None
67
+ average_loss_percentage: float = None
68
+ average_trade_return: float = None
69
+ average_trade_return_percentage: float = None
70
+ average_trade_loss: float = None
71
+ average_trade_loss_percentage: float = None
72
+ average_trade_gain: float = None
73
+ average_trade_gain_percentage: float = None
74
+ cagr: float = None
75
+ sharpe_ratio: float = None
76
+ sortino_ratio: float = None
77
+ calmar_ratio: float = None
78
+ profit_factor: float = None
79
+ annual_volatility: float = None
80
+ max_drawdown: float = None
81
+ max_drawdown_duration: int = None
82
+ trades_per_year: float = None
83
+ win_rate: float = None
84
+ win_loss_ratio: float = None
85
+ number_of_trades: int = None
86
+ cumulative_exposure: float = None
87
+ exposure_ratio: float = None
88
+
89
+ def to_dict(self) -> dict:
90
+ """
91
+ Convert the BacktestSummaryMetrics instance to a dictionary.
92
+ """
93
+ return {
94
+ "total_net_gain": self.total_net_gain,
95
+ "total_net_gain_percentage": self.total_net_gain_percentage,
96
+ "total_growth": self.total_growth,
97
+ "total_growth_percentage": self.total_growth_percentage,
98
+ "total_loss": self.total_loss,
99
+ "total_loss_percentage": self.total_loss_percentage,
100
+ "average_loss": self.average_loss,
101
+ "average_loss_percentage": self.average_loss_percentage,
102
+ "average_net_gain": self.average_net_gain,
103
+ "average_net_gain_percentage": self.average_net_gain_percentage,
104
+ "average_growth": self.average_growth,
105
+ "average_growth_percentage": self.average_growth_percentage,
106
+ "average_trade_return": self.average_trade_return,
107
+ "average_trade_return_percentage":
108
+ self.average_trade_return_percentage,
109
+ "average_trade_loss": self.average_trade_loss,
110
+ "average_trade_loss_percentage":
111
+ self.average_trade_loss_percentage,
112
+ "average_trade_gain": self.average_trade_gain,
113
+ "average_trade_gain_percentage":
114
+ self.average_trade_gain_percentage,
115
+ "cagr": self.cagr,
116
+ "sharpe_ratio": self.sharpe_ratio,
117
+ "sortino_ratio": self.sortino_ratio,
118
+ "calmar_ratio": self.calmar_ratio,
119
+ "profit_factor": self.profit_factor,
120
+ "annual_volatility": self.annual_volatility,
121
+ "max_drawdown": self.max_drawdown,
122
+ "max_drawdown_duration": self.max_drawdown_duration,
123
+ "trades_per_year": self.trades_per_year,
124
+ "win_rate": self.win_rate,
125
+ "win_loss_ratio": self.win_loss_ratio,
126
+ "number_of_trades": self.number_of_trades,
127
+ "cumulative_exposure": self.cumulative_exposure,
128
+ "exposure_ratio": self.exposure_ratio,
129
+ }
130
+
131
+ def save(self, file_path: str | Path) -> None:
132
+ """
133
+ Save the summary metrics to a JSON file.
134
+ """
135
+ with open(file_path, 'w') as file:
136
+ json.dump(self.to_dict(), file, indent=4, default=str)
137
+
138
+ @staticmethod
139
+ def open(file_path: str | Path) -> 'BacktestSummaryMetrics':
140
+ """
141
+ Load summary metrics from a JSON file.
142
+ """
143
+ if not os.path.exists(file_path):
144
+ raise FileNotFoundError(f"Metrics file not found at {file_path}")
145
+
146
+ with open(file_path, 'r') as file:
147
+ data = json.load(file)
148
+
149
+ return BacktestSummaryMetrics(**data)
150
+
151
+ def __repr__(self):
152
+ return json.dumps(
153
+ self.to_dict(), indent=4, sort_keys=True, default=str
154
+ )
@@ -1,8 +1,8 @@
1
1
  from typing import List
2
2
 
3
- from investing_algorithm_framework.domain.backtesting import Backtest
4
- from investing_algorithm_framework.domain.backtesting import \
5
- BacktestSummaryMetrics
3
+ from .backtest import Backtest
4
+ from .backtest_summary_metrics import BacktestSummaryMetrics
5
+ from .backtest_metrics import BacktestMetrics
6
6
 
7
7
 
8
8
  def safe_weighted_mean(values, weights):
@@ -55,10 +55,55 @@ def combine_backtests(
55
55
  backtest_metrics.append(backtest_metric)
56
56
  backtest_runs.append(backtest_run)
57
57
 
58
+ summary = generate_backtest_summary_metrics(backtest_metrics)
59
+
60
+ metadata = None
61
+ risk_free_rate = None
62
+
63
+ # Get first non-empty metadata
64
+ for backtest in backtests:
65
+ if backtest.metadata:
66
+ metadata = backtest.metadata
67
+ break
68
+
69
+ # Get the first risk-free rate
70
+ for backtest in backtests:
71
+ if backtest.risk_free_rate is not None:
72
+ risk_free_rate = backtest.risk_free_rate
73
+ break
74
+
75
+ backtest = Backtest(
76
+ backtest_summary=summary,
77
+ metadata=metadata,
78
+ risk_free_rate=risk_free_rate,
79
+ backtest_runs=backtest_runs
80
+ )
81
+ return backtest
82
+
83
+
84
+ def generate_backtest_summary_metrics(
85
+ backtest_metrics: List[BacktestMetrics]
86
+ ) -> BacktestSummaryMetrics:
87
+ """
88
+ Combine multiple BacktestMetrics into a single BacktestMetrics
89
+ by aggregating their results.
90
+
91
+ Args:
92
+ backtest_metrics (List[BacktestMetrics]): List of BacktestMetrics
93
+ instances to combine.
94
+
95
+ Returns:
96
+ BacktestMetrics: A new BacktestMetrics instance representing the
97
+ combined results.
98
+ """
58
99
  total_net_gain = sum(
59
100
  b.total_net_gain for b in backtest_metrics
60
101
  if b.total_net_gain is not None
61
102
  )
103
+ total_net_gain_percentage = sum(
104
+ b.total_net_gain_percentage for b in backtest_metrics
105
+ if b.total_net_gain_percentage is not None
106
+ )
62
107
  average_total_net_gain = safe_weighted_mean(
63
108
  [b.total_net_gain for b in backtest_metrics],
64
109
  [b.total_number_of_days for b in backtest_metrics]
@@ -67,36 +112,36 @@ def combine_backtests(
67
112
  [b.total_net_gain_percentage for b in backtest_metrics],
68
113
  [b.total_number_of_days for b in backtest_metrics]
69
114
  )
70
- total_net_gain_percentage = sum(
71
- b.total_net_gain_percentage for b in backtest_metrics
72
- if b.total_net_gain_percentage is not None
73
- )
74
- gross_loss = sum(
115
+ total_loss = sum(
75
116
  b.gross_loss for b in backtest_metrics
76
117
  if b.gross_loss is not None
77
118
  )
78
- average_gross_loss = safe_weighted_mean(
119
+ total_loss_percentage = sum(
120
+ b.total_loss_percentage for b in backtest_metrics
121
+ if b.total_loss_percentage is not None
122
+ )
123
+ average_total_loss = safe_weighted_mean(
79
124
  [b.gross_loss for b in backtest_metrics],
80
125
  [b.total_number_of_days for b in backtest_metrics]
81
126
  )
82
- growth = sum(
83
- b.growth for b in backtest_metrics
84
- if b.growth is not None
127
+ average_total_loss_percentage = safe_weighted_mean(
128
+ [b.total_loss_percentage for b in backtest_metrics],
129
+ [b.total_number_of_days for b in backtest_metrics]
130
+ )
131
+ total_growth = sum(
132
+ b.total_growth for b in backtest_metrics
133
+ if b.total_growth is not None
85
134
  )
86
- growth_percentage = sum(
87
- b.growth_percentage for b in backtest_metrics
88
- if b.growth_percentage is not None
135
+ total_growth_percentage = sum(
136
+ b.total_growth_percentage for b in backtest_metrics
137
+ if b.total_growth_percentage is not None
89
138
  )
90
139
  average_growth = safe_weighted_mean(
91
- [b.growth for b in backtest_metrics],
140
+ [b.total_growth for b in backtest_metrics],
92
141
  [b.total_number_of_days for b in backtest_metrics]
93
142
  )
94
143
  average_growth_percentage = safe_weighted_mean(
95
- [b.growth_percentage for b in backtest_metrics],
96
- [b.total_number_of_days for b in backtest_metrics]
97
- )
98
- trades_average_return = safe_weighted_mean(
99
- [b.trades_average_return for b in backtest_metrics],
144
+ [b.total_growth_percentage for b in backtest_metrics],
100
145
  [b.total_number_of_days for b in backtest_metrics]
101
146
  )
102
147
  cagr = safe_weighted_mean(
@@ -155,18 +200,43 @@ def combine_backtests(
155
200
  [b.exposure_ratio for b in backtest_metrics],
156
201
  [b.total_number_of_days for b in backtest_metrics]
157
202
  )
158
- summary = BacktestSummaryMetrics(
203
+ average_trade_return = safe_weighted_mean(
204
+ [b.average_trade_return for b in backtest_metrics],
205
+ [b.number_of_trades for b in backtest_metrics]
206
+ )
207
+ average_trade_return_percentage = safe_weighted_mean(
208
+ [b.average_trade_return_percentage for b in backtest_metrics],
209
+ [b.number_of_trades for b in backtest_metrics]
210
+ )
211
+ average_trade_loss = safe_weighted_mean(
212
+ [b.average_trade_loss for b in backtest_metrics],
213
+ [b.number_of_trades for b in backtest_metrics]
214
+ )
215
+ average_trade_loss_percentage = safe_weighted_mean(
216
+ [b.average_trade_loss_percentage for b in backtest_metrics],
217
+ [b.number_of_trades for b in backtest_metrics]
218
+ )
219
+ average_trade_gain = safe_weighted_mean(
220
+ [b.average_trade_gain for b in backtest_metrics],
221
+ [b.number_of_trades for b in backtest_metrics]
222
+ )
223
+ average_trade_gain_percentage = safe_weighted_mean(
224
+ [b.average_trade_gain_percentage for b in backtest_metrics],
225
+ [b.number_of_trades for b in backtest_metrics]
226
+ )
227
+ return BacktestSummaryMetrics(
159
228
  total_net_gain=total_net_gain,
160
229
  total_net_gain_percentage=total_net_gain_percentage,
161
- average_total_net_gain=average_total_net_gain,
162
- average_total_net_gain_percentage=average_total_net_gain_percentage,
163
- gross_loss=gross_loss,
164
- average_gross_loss=average_gross_loss,
165
- growth=growth,
166
- growth_percentage=growth_percentage,
230
+ average_net_gain=average_total_net_gain,
231
+ average_net_gain_percentage=average_total_net_gain_percentage,
232
+ total_loss=total_loss,
233
+ total_loss_percentage=total_loss_percentage,
234
+ average_loss=average_total_loss,
235
+ average_loss_percentage=average_total_loss_percentage,
236
+ total_growth=total_growth,
237
+ total_growth_percentage=total_growth_percentage,
167
238
  average_growth=average_growth,
168
239
  average_growth_percentage=average_growth_percentage,
169
- trades_average_return=trades_average_return,
170
240
  cagr=cagr,
171
241
  sharpe_ratio=sharp_ratio,
172
242
  sortino_ratio=sortino_ratio,
@@ -180,28 +250,26 @@ def combine_backtests(
180
250
  win_loss_ratio=win_loss_ratio,
181
251
  number_of_trades=number_of_trades,
182
252
  cumulative_exposure=cumulative_exposure,
183
- exposure_ratio=exposure_ratio
253
+ exposure_ratio=exposure_ratio,
254
+ average_trade_return=average_trade_return,
255
+ average_trade_return_percentage=average_trade_return_percentage,
256
+ average_trade_loss=average_trade_loss,
257
+ average_trade_loss_percentage=average_trade_loss_percentage,
258
+ average_trade_gain=average_trade_gain,
259
+ average_trade_gain_percentage=average_trade_gain_percentage
184
260
  )
185
261
 
186
- metadata = None
187
- risk_free_rate = None
188
262
 
189
- # Get first non-empty metadata
190
- for backtest in backtests:
191
- if backtest.metadata:
192
- metadata = backtest.metadata
193
- break
263
+ def create_backtest_summary_metrics(
264
+ backtest_metrics: List[BacktestMetrics]
265
+ ) -> BacktestSummaryMetrics:
266
+ """
267
+ Create a combined BacktestSummaryMetrics from multiple backtests.
194
268
 
195
- # Get the first risk-free rate
196
- for backtest in backtests:
197
- if backtest.risk_free_rate is not None:
198
- risk_free_rate = backtest.risk_free_rate
199
- break
269
+ Args:
270
+ backtest_metrics (List[BacktestMetrics]): List of BacktestMetrics
271
+ instances.
200
272
 
201
- backtest = Backtest(
202
- backtest_summary=summary,
203
- metadata=metadata,
204
- risk_free_rate=risk_free_rate,
205
- backtest_runs=backtest_runs
206
- )
207
- return backtest
273
+ Returns:
274
+ BacktestSummaryMetrics: Combined summary metrics.
275
+ """
@@ -13,7 +13,7 @@ import polars as pl
13
13
  from investing_algorithm_framework.domain import BacktestRun, OrderType, \
14
14
  TimeUnit, Trade, OperationalException, BacktestDateRange, \
15
15
  Backtest, TradeStatus, PortfolioSnapshot, Order, OrderStatus, OrderSide, \
16
- Portfolio, DataType
16
+ Portfolio, DataType, generate_backtest_summary_metrics
17
17
  from investing_algorithm_framework.services.data_providers import \
18
18
  DataProviderService
19
19
  from investing_algorithm_framework.services.portfolios import \
@@ -426,16 +426,10 @@ class BacktestService:
426
426
 
427
427
  raise ValueError(f"Strategy profile with id {id} not found.")
428
428
 
429
- def _get_initial_unallocated(
430
- self
431
- ) -> float:
429
+ def _get_initial_unallocated(self) -> float:
432
430
  """
433
431
  Get the initial unallocated amount for the backtest.
434
432
 
435
- Args:
436
- algorithm: The algorithm to create the backtest report for
437
- backtest_date_range: The backtest date range of the backtest
438
-
439
433
  Returns:
440
434
  float: The initial unallocated amount.
441
435
  """
@@ -533,6 +527,9 @@ class BacktestService:
533
527
  run.backtest_metrics = backtest_metrics
534
528
  return Backtest(
535
529
  backtest_runs=[run],
530
+ backtest_summary=generate_backtest_summary_metrics(
531
+ [backtest_metrics]
532
+ )
536
533
  )
537
534
 
538
535
  @staticmethod
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v7.13.0"
3
+ version = "v7.14.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"
@@ -1,7 +0,0 @@
1
- class BacktestInitializer:
2
- def __init__(self, config):
3
- self.config = config
4
-
5
- def initialize(self):
6
- # Initialize backtesting environment based on config
7
- print("Backtesting environment initialized with config:", self.config)