investing-algorithm-framework 7.12.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 (260) hide show
  1. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/PKG-INFO +1 -22
  2. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/README.md +0 -21
  3. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/__init__.py +15 -13
  4. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/ranking.py +24 -7
  5. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/app.py +5 -4
  6. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +2 -2
  7. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/__init__.py +4 -2
  8. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/__init__.py +4 -2
  9. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -8
  10. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +60 -38
  11. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +7 -7
  12. investing_algorithm_framework-7.14.0/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +154 -0
  13. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +117 -49
  14. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order.py +5 -1
  15. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/__init__.py +17 -11
  16. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +5 -8
  17. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/__init__.py +20 -12
  18. investing_algorithm_framework-7.14.0/investing_algorithm_framework/services/metrics/generate.py +245 -0
  19. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/recovery.py +2 -2
  20. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/returns.py +54 -202
  21. investing_algorithm_framework-7.14.0/investing_algorithm_framework/services/metrics/trades.py +343 -0
  22. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/pyproject.toml +1 -1
  23. investing_algorithm_framework-7.12.0/investing_algorithm_framework/domain/backtesting/BacktestInitializer.py +0 -7
  24. investing_algorithm_framework-7.12.0/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -271
  25. investing_algorithm_framework-7.12.0/investing_algorithm_framework/services/metrics/generate.py +0 -395
  26. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/LICENSE +0 -0
  27. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/__init__.py +0 -0
  28. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  29. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  30. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  31. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
  32. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  33. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
  34. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  35. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/context.py +0 -0
  36. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  37. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  38. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  39. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  40. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  41. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  42. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  43. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  44. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  45. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  46. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  47. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  48. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  49. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  50. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  51. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  52. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  53. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  54. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  55. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  56. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  57. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  58. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  59. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  60. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  61. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  62. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/strategy.py +0 -0
  63. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/task.py +0 -0
  64. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  65. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  66. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  67. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  68. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  69. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  70. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  71. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  72. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  73. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  74. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  75. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  76. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  77. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  78. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  79. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/cli.py +0 -0
  80. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  81. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  82. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  83. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  84. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  85. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  86. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  87. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  88. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  89. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  90. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  91. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  92. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  93. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  94. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  95. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  96. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  97. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  98. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  99. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  100. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  101. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  102. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  103. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  104. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/create_app.py +0 -0
  105. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/dependency_container.py +0 -0
  106. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  107. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  108. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  109. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/config.py +0 -0
  110. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/constants.py +0 -0
  111. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  112. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  113. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  114. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  115. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  116. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  117. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  118. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  119. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  120. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  121. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  122. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  123. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  124. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  125. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  126. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  127. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  128. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  129. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  130. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  131. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  132. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  133. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  134. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  135. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  136. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  137. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  138. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  139. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  140. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  141. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  142. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  143. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  144. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  145. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  146. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  147. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  148. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  149. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  150. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/positions/__init__.py +0 -0
  151. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/positions/position_size.py +0 -0
  152. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  153. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  154. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  155. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  156. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  157. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  158. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  159. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  160. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  161. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  162. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  163. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  164. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  165. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  166. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  167. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  168. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  169. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  170. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/download_data.py +0 -0
  171. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  172. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  173. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  174. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  175. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  176. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  177. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  178. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  179. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  180. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  181. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  182. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  183. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  184. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  185. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  186. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  187. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  188. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  189. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  190. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  191. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  192. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  193. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  194. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  195. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  196. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  197. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  198. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  199. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  200. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  201. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  202. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  203. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  204. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  205. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  206. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  207. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  208. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  209. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  210. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  211. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  212. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  213. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  214. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  215. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  216. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  217. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  218. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  219. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  220. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  221. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  222. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  223. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  224. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  225. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  226. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  227. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  228. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  229. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  230. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  231. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  232. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  233. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  234. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  235. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  236. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  237. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  238. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  239. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  240. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  241. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  242. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  243. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  244. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  245. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  246. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  247. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  248. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  249. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  250. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  251. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  252. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  253. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  254. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  255. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  256. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  257. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  258. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  259. {investing_algorithm_framework-7.12.0 → investing_algorithm_framework-7.14.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  260. {investing_algorithm_framework-7.12.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.12.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, \
@@ -35,14 +35,15 @@ from .services import get_annual_volatility, get_sortino_ratio, \
35
35
  get_calmar_ratio, get_trade_frequency, get_yearly_returns, \
36
36
  get_monthly_returns, get_best_year, get_best_month, get_worst_year, \
37
37
  get_worst_month, get_best_trade, get_worst_trade, \
38
- get_average_yearly_return, get_average_gain, get_average_loss, \
39
- get_average_monthly_return, get_percentage_winning_months, \
40
- get_max_drawdown_duration, get_max_daily_drawdown, get_trades_per_day, \
38
+ get_average_yearly_return, get_average_trade_gain, \
39
+ get_average_trade_loss, get_average_monthly_return, \
40
+ get_percentage_winning_months, get_max_drawdown_duration, \
41
+ get_max_daily_drawdown, get_trades_per_day, \
41
42
  get_trades_per_year, get_average_monthly_return_losing_months, \
42
43
  get_average_monthly_return_winning_months, get_percentage_winning_years, \
43
- get_rolling_sharpe_ratio, create_backtest_metrics, get_growth, \
44
- get_growth_percentage, get_cumulative_exposure, get_median_return, \
45
- get_average_return, get_risk_free_rate_us, get_cumulative_return, \
44
+ get_rolling_sharpe_ratio, create_backtest_metrics, get_total_growth, \
45
+ get_total_loss, get_cumulative_exposure, get_median_trade_return, \
46
+ get_average_trade_return, get_risk_free_rate_us, get_cumulative_return, \
46
47
  get_cumulative_return_series
47
48
 
48
49
 
@@ -135,8 +136,8 @@ __all__ = [
135
136
  "get_best_trade",
136
137
  "get_worst_trade",
137
138
  "get_average_yearly_return",
138
- "get_average_gain",
139
- "get_average_loss",
139
+ "get_average_trade_gain",
140
+ "get_average_trade_loss",
140
141
  "get_average_monthly_return",
141
142
  "get_percentage_winning_months",
142
143
  "get_average_trade_duration",
@@ -163,14 +164,15 @@ __all__ = [
163
164
  "rank_results",
164
165
  "create_weights",
165
166
  "get_entry_and_exit_signals",
166
- "get_growth",
167
- "get_growth_percentage",
168
167
  "BacktestEvaluationFocus",
169
168
  "combine_backtests",
170
169
  "PositionSize",
171
- "get_median_return",
172
- "get_average_return",
170
+ "get_median_trade_return",
171
+ "get_average_trade_return",
173
172
  "get_risk_free_rate_us",
174
173
  "get_cumulative_return",
175
174
  "get_cumulative_return_series",
175
+ "get_total_loss",
176
+ "get_total_growth",
177
+ "generate_backtest_summary_metrics"
176
178
  ]
@@ -195,9 +195,9 @@ def combine_backtest_metrics(
195
195
  backtest_start_date=start_date,
196
196
  backtest_end_date=end_date,
197
197
  equity_curve=[], # leave empty to avoid misleading curves
198
- growth=safe_mean([m.growth for m in backtest_metrics]),
199
- growth_percentage=safe_mean(
200
- [m.growth_percentage for m in backtest_metrics]),
198
+ total_growth=safe_mean([m.total_growth for m in backtest_metrics]),
199
+ total_growth_percentage=safe_mean(
200
+ [m.total_growth_percentage for m in backtest_metrics]),
201
201
  total_net_gain=safe_mean([m.total_net_gain for m in backtest_metrics]),
202
202
  total_net_gain_percentage=safe_mean(
203
203
  [m.total_net_gain_percentage for m in backtest_metrics]),
@@ -228,10 +228,27 @@ def combine_backtest_metrics(
228
228
  exposure_ratio=safe_mean(
229
229
  [m.exposure_ratio for m in backtest_metrics]
230
230
  ),
231
- trades_average_gain=safe_mean(
232
- [m.trades_average_gain for m in backtest_metrics]),
233
- trades_average_loss=safe_mean(
234
- [m.trades_average_loss for m in backtest_metrics]),
231
+ average_trade_gain=safe_mean(
232
+ [m.average_trade_gain for m in backtest_metrics]),
233
+ average_trade_gain_percentage=(
234
+ safe_mean(
235
+ [m.average_trade_gain_percentage for m in backtest_metrics]
236
+ )
237
+ ),
238
+ average_trade_loss=safe_mean(
239
+ [m.average_trade_loss for m in backtest_metrics]),
240
+ average_trade_loss_percentage=(
241
+ safe_mean(
242
+ [m.average_trade_loss_percentage for m in backtest_metrics]
243
+ )
244
+ ),
245
+ median_trade_return=safe_mean(
246
+ [m.median_trade_return for m in backtest_metrics]),
247
+ median_trade_return_percentage=(
248
+ safe_mean(
249
+ [m.median_trade_return_percentage for m in backtest_metrics]
250
+ )
251
+ ),
235
252
  best_trade=max((
236
253
  m.best_trade for m in backtest_metrics if m.best_trade),
237
254
  key=lambda t: t.net_gain if t else float('-inf'),
@@ -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,
@@ -88,8 +88,8 @@ def create_html_trade_metrics_table(results, report):
88
88
  copy_results['Worst Trade'] = f"{worst_trade['net_gain']:.2f} {report.trading_symbol}"
89
89
  copy_results['Worst Trade Date'] = safe_format_date(worst_trade['opened_at'], format_str=DEFAULT_DATETIME_FORMAT)
90
90
 
91
- copy_results['Trades Average Gain'] = f"{safe_format(copy_results['trades_average_gain'], string_format)} {report.trading_symbol} {copy_results['trades_average_gain_percentage']:.2f}%"
92
- copy_results['Trades Average Loss'] = f"{safe_format(copy_results['trades_average_loss'], string_format)} {report.trading_symbol} {copy_results['trades_average_loss_percentage']:.2f}%"
91
+ copy_results['Trades Average Gain'] = f"{safe_format(copy_results['average_trade_gain'], string_format)} {report.trading_symbol} {copy_results['trades_average_gain_percentage']:.2f}%"
92
+ copy_results['Trades Average Loss'] = f"{safe_format(copy_results['average_trade_loss'], string_format)} {report.trading_symbol} {copy_results['trades_average_loss_percentage']:.2f}%"
93
93
  copy_results['Average Trade Duration'] = f"{copy_results['average_trade_duration']:.2f} hours"
94
94
  copy_results['Number of Trades'] = f"{copy_results['number_of_trades']}"
95
95
  copy_results['Win Rate'] = f"{copy_results['win_rate']:.2f}%"
@@ -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.
@@ -23,17 +23,19 @@ class BacktestMetrics:
23
23
  Attributes:
24
24
  backtest_start_date (datetime): The start date of the backtest.
25
25
  backtest_end_date (datetime): The end date of the backtest.
26
+ final_value (float): The final value of the portfolio at the end
27
+ of the backtest.
26
28
  equity_curve (List[Tuple[datetime, float]]): A list of
27
29
  tuples representing the equity curve, where each tuple
28
30
  contains a date and the corresponding portfolio value.
29
- growth (float): The growth of the portfolio over the backtest period.
30
- growth_percentage (float): The percentage growth of the portfolio
31
+ total_growth (float): The growth of the portfolio over the
32
+ backtest period.
33
+ total_growth_percentage (float): The percentage growth of the portfolio
31
34
  over the backtest period.
32
- final_value (float): The final value of the portfolio at the end
33
- of the backtest.
34
35
  total_net_gain (float): The total return of the backtest.
35
36
  total_net_gain_percentage (float): The total return percentage
36
37
  total_loss (float): The total loss of the backtest.
38
+ total_loss_percentage (float): The total loss percentage
37
39
  cagr (float): The compound annual growth rate of the backtest.
38
40
  sharpe_ratio (float): The Sharpe ratio of the backtest, indicating
39
41
  risk-adjusted return.
@@ -68,15 +70,24 @@ class BacktestMetrics:
68
70
  average exposure of the portfolio.
69
71
  cumulative_exposure (float): The cumulative exposure, indicating the
70
72
  total exposure of the portfolio over the backtest period.
71
- trades_average_gain (float): The average gain from winning trades.
72
- trades_average_gain_percentage (float): The average gain percentage
73
- from winning trades.
74
- trades_average_loss (float): The average loss from losing trades.
75
- trades_average_loss_percentage (float): The average loss percentage
73
+ average_trade_size (float): The average size of trades executed
74
+ during the backtest.
75
+ average_trade_loss (float): The average loss from losing trades.
76
+ average_trade_loss_percentage (float): The average loss percentage
76
77
  from losing trades.
77
- trades_average_return (float): The average return from all trades.
78
- trades_average_return_percentage (float): The average return
79
- percentage from all trades.
78
+ average_trade_gain (float): The average gain from winning trades.
79
+ average_trade_gain_percentage (float): The average gain percentage
80
+ from winning trades.
81
+ average_trade_return (float): The average return from all trades.
82
+ average_trade_return_percentage (float): The average return percentage
83
+ from all trades.
84
+ median_trade_return (float): The median return from all trades.
85
+ median_trade_return_percentage (float): The median return percentage
86
+ from all trades.
87
+ number_of_positive_trades (int): The total number of profitable trades
88
+ executed during the backtest.
89
+ number_of_negative_trades (int): The total number of unprofitable
90
+ trades executed during the backtest.
80
91
  best_trade (float): A string representation of the best trade,
81
92
  including net gain and percentage.
82
93
  worst_trade (float): A string representation of the worst trade,
@@ -123,10 +134,12 @@ class BacktestMetrics:
123
134
  backtest_start_date: datetime
124
135
  backtest_end_date: datetime
125
136
  equity_curve: List[Tuple[float, datetime]] = field(default_factory=list)
126
- growth: float = 0.0
127
- growth_percentage: float = 0.0
137
+ total_growth: float = 0.0
138
+ total_growth_percentage: float = 0.0
128
139
  total_net_gain: float = 0.0
129
140
  total_net_gain_percentage: float = 0.0
141
+ total_loss: float = 0.0
142
+ total_loss_percentage: float = 0.0
130
143
  final_value: float = 0.0
131
144
  cumulative_return: float = 0.0
132
145
  cumulative_return_series: List[Tuple[float, datetime]] = \
@@ -152,24 +165,28 @@ class BacktestMetrics:
152
165
  trade_per_day: float = 0.0
153
166
  exposure_ratio: float = 0.0
154
167
  cumulative_exposure: float = 0.0
155
- trades_average_gain: float = 0.0
156
- trades_average_gain_percentage: float = 0.0
157
- trades_average_loss: float = 0.0
158
- trades_average_loss_percentage: float = 0.0
159
- trades_average_return: float = 0.0
160
- trades_average_return_percentage: float = 0.0
161
168
  best_trade: Trade = None
162
169
  worst_trade: Trade = None
170
+ number_of_positive_trades: int = 0
171
+ percentage_positive_trades: float = 0.0
172
+ number_of_negative_trades: int = 0
173
+ percentage_negative_trades: float = 0.0
163
174
  average_trade_duration: float = 0.0
164
175
  average_trade_size: float = 0.0
176
+ average_trade_loss: float = 0.0
177
+ average_trade_loss_percentage: float = 0.0
178
+ average_trade_gain: float = 0.0
179
+ average_trade_gain_percentage: float = 0.0
180
+ average_trade_return: float = 0.0
181
+ average_trade_return_percentage: float = 0.0
182
+ median_trade_return: float = 0.0
183
+ median_trade_return_percentage: float = 0.0
165
184
  number_of_trades: int = 0
166
185
  number_of_trades_closed: int = 0
167
186
  number_of_trades_opened: int = 0
168
187
  number_of_trades_open_at_end: int = 0
169
188
  win_rate: float = 0.0
170
189
  win_loss_ratio: float = 0.0
171
- percentage_positive_trades: float = 0.0
172
- percentage_negative_trades: float = 0.0
173
190
  percentage_winning_months: float = 0.0
174
191
  percentage_winning_years: float = 0.0
175
192
  average_monthly_return: float = 0.0
@@ -198,11 +215,13 @@ class BacktestMetrics:
198
215
  "backtest_end_date": self.backtest_end_date.isoformat(),
199
216
  "equity_curve": [(value, date.isoformat())
200
217
  for value, date in self.equity_curve],
218
+ "final_value": self.final_value,
201
219
  "total_net_gain": self.total_net_gain,
202
220
  "total_net_gain_percentage": self.total_net_gain_percentage,
203
- "final_value": self.final_value,
204
- "growth": self.growth,
205
- "growth_percentage": self.growth_percentage,
221
+ "total_growth": self.total_growth,
222
+ "total_growth_percentage": self.total_growth_percentage,
223
+ "total_loss": self.total_loss,
224
+ "total_loss_percentage": self.total_loss_percentage,
206
225
  "cumulative_return": self.cumulative_return,
207
226
  "cumulative_return_series": [(value, date.isoformat())
208
227
  for value, date in
@@ -216,8 +235,6 @@ class BacktestMetrics:
216
235
  "sortino_ratio": self.sortino_ratio,
217
236
  "calmar_ratio": self.calmar_ratio,
218
237
  "profit_factor": self.profit_factor,
219
- "gross_profit": self.gross_profit,
220
- "gross_loss": self.gross_loss,
221
238
  "annual_volatility": self.annual_volatility,
222
239
  "monthly_returns": [(value, date.isoformat())
223
240
  for value, date in self.monthly_returns],
@@ -233,15 +250,22 @@ class BacktestMetrics:
233
250
  "trade_per_day": self.trade_per_day,
234
251
  "exposure_ratio": self.exposure_ratio,
235
252
  "cumulative_exposure": self.cumulative_exposure,
236
- "trades_average_gain": self.trades_average_gain,
237
- "trades_average_gain_percentage":
238
- self.trades_average_gain_percentage,
239
- "trades_average_loss": self.trades_average_loss,
240
- "trades_average_loss_percentage":
241
- self.trades_average_loss_percentage,
242
- "trades_average_return": self.trades_average_return,
243
- "trades_average_return_percentage":
244
- self.trades_average_return_percentage,
253
+ "average_trade_gain": self.average_trade_gain,
254
+ "average_trade_gain_percentage":
255
+ self.average_trade_gain_percentage,
256
+ "average_trade_loss": self.average_trade_loss,
257
+ "average_trade_loss_percentage":
258
+ self.average_trade_loss_percentage,
259
+ "average_trade_return": self.average_trade_return,
260
+ "average_trade_return_percentage":
261
+ self.average_trade_return_percentage,
262
+ "median_trade_return": self.median_trade_return,
263
+ "median_trade_return_percentage":
264
+ self.median_trade_return_percentage,
265
+ "number_of_positive_trades": self.number_of_positive_trades,
266
+ "percentage_positive_trades": self.percentage_positive_trades,
267
+ "number_of_negative_trades": self.number_of_negative_trades,
268
+ "percentage_negative_trades": self.percentage_negative_trades,
245
269
  "best_trade": self.best_trade.to_dict()
246
270
  if self.best_trade else None,
247
271
  "worst_trade": self.worst_trade.to_dict()
@@ -253,8 +277,6 @@ class BacktestMetrics:
253
277
  "win_loss_ratio": self.win_loss_ratio,
254
278
  "percentage_winning_months": self.percentage_winning_months,
255
279
  "percentage_winning_years": self.percentage_winning_years,
256
- "percentage_positive_trades": self.percentage_positive_trades,
257
- "percentage_negative_trades": self.percentage_negative_trades,
258
280
  "average_monthly_return": self.average_monthly_return,
259
281
  "average_monthly_return_losing_months":
260
282
  self.average_monthly_return_losing_months,
@@ -66,13 +66,13 @@ class BacktestRun:
66
66
  backtest_start_date: datetime
67
67
  backtest_end_date: datetime
68
68
  trading_symbol: str
69
- initial_unallocated: float
70
- number_of_runs: int
71
- portfolio_snapshots: List[PortfolioSnapshot]
72
- trades: List[Trade]
73
- orders: List[Order]
74
- positions: List[Position]
75
- created_at: datetime
69
+ initial_unallocated: float = 0.0
70
+ number_of_runs: int = 0
71
+ portfolio_snapshots: List[PortfolioSnapshot] = field(default_factory=list)
72
+ trades: List[Trade] = field(default_factory=list)
73
+ orders: List[Order] = field(default_factory=list)
74
+ positions: List[Position] = field(default_factory=list)
75
+ created_at: datetime = None,
76
76
  symbols: List[str] = field(default_factory=list)
77
77
  number_of_days: int = 0
78
78
  number_of_trades: int = 0
@@ -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
+ )