investing-algorithm-framework 7.0.3__tar.gz → 7.2.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 (257) hide show
  1. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/PKG-INFO +1 -1
  2. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/__init__.py +2 -2
  3. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/__init__.py +2 -2
  4. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm.py +3 -1
  5. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/analysis/__init__.py +2 -2
  6. investing_algorithm_framework-7.2.0/investing_algorithm_framework/app/analysis/ranking.py +178 -0
  7. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app.py +127 -8
  8. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/strategy.py +9 -1
  9. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/win_rate.py +3 -3
  10. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/pyproject.toml +1 -1
  11. investing_algorithm_framework-7.0.3/investing_algorithm_framework/app/analysis/ranking.py +0 -58
  12. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/LICENSE +0 -0
  13. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/README.md +0 -0
  14. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  15. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  16. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  17. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  18. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/context.py +0 -0
  19. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  20. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  21. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  22. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  23. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  24. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  25. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  26. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  27. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  28. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  29. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  30. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  31. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  32. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  33. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  34. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  35. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  36. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  37. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  38. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  39. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  40. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  41. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  42. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  43. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  44. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  45. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/task.py +0 -0
  46. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  47. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  48. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  49. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  50. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  51. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  52. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  53. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  54. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  55. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  56. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  57. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  58. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  59. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  60. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  61. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/cli.py +0 -0
  62. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  63. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  64. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  65. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  66. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  67. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  68. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  69. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  70. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  71. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  72. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  73. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  74. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  75. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  76. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  77. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  78. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  79. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  80. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  81. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  82. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  83. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  84. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  85. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  86. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/create_app.py +0 -0
  87. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/dependency_container.py +0 -0
  88. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  89. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  90. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  91. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  92. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  93. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_position.py +0 -0
  94. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_results.py +0 -0
  95. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/config.py +0 -0
  96. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/constants.py +0 -0
  97. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  98. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  99. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  100. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  101. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  102. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  103. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  104. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  105. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  106. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  107. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  108. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  109. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  110. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  111. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  112. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  113. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  114. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  115. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  116. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  117. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  118. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  119. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  120. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  121. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  122. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  123. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  124. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  125. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  126. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  127. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  128. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  129. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  130. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  131. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  132. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  133. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  134. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  135. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  136. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  137. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  138. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  139. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
  140. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
  141. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  142. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  143. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  144. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  145. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  146. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  147. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  148. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  149. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  150. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  151. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  152. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  153. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  154. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  155. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  156. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  157. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/download_data.py +0 -0
  158. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  159. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  160. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  161. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  162. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  163. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  164. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  165. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  166. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  167. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  168. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  169. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  170. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  171. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  172. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  173. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  174. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  175. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  176. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  177. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  178. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  179. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  180. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  181. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  182. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  183. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  184. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  185. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  186. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  187. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  188. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  189. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  190. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  191. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  192. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  193. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  194. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  195. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  196. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  197. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  198. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  199. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  200. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  201. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  202. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  203. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
  204. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
  205. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
  206. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
  207. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
  208. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/__init__.py +0 -0
  209. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  210. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
  211. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  212. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  213. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  214. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  215. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  216. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  217. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  218. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  219. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  220. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  221. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  222. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  223. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  224. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  225. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  226. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  227. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  228. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  229. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  230. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  231. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  232. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  233. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  234. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  235. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  236. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  237. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  238. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  239. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  240. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  241. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  242. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  243. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  244. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  245. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  246. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  247. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  248. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  249. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  250. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  251. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  252. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  253. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  254. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  255. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  256. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  257. {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.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.0.3
3
+ Version: 7.2.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -5,7 +5,7 @@ from .app import App, Algorithm, \
5
5
  pretty_print_orders, pretty_print_backtest, select_backtest_date_ranges, \
6
6
  get_equity_curve_with_drawdown_chart, \
7
7
  get_rolling_sharpe_ratio_chart, rank_results, \
8
- get_monthly_returns_heatmap_chart, defaults_ranking_weights, \
8
+ get_monthly_returns_heatmap_chart, create_weights, \
9
9
  get_yearly_returns_bar_chart, get_entry_and_exit_signals, \
10
10
  get_ohlcv_data_completeness_chart
11
11
  from .domain import ApiException, \
@@ -159,7 +159,7 @@ __all__ = [
159
159
  "get_yearly_returns_bar_chart",
160
160
  "get_ohlcv_data_completeness_chart",
161
161
  "rank_results",
162
- "defaults_ranking_weights",
162
+ "create_weights",
163
163
  "get_entry_and_exit_signals",
164
164
  "get_growth",
165
165
  "get_growth_percentage"
@@ -14,7 +14,7 @@ from .reporting import add_html_report, \
14
14
  get_yearly_returns_bar_chart, \
15
15
  get_ohlcv_data_completeness_chart, get_entry_and_exit_signals
16
16
  from .analysis import select_backtest_date_ranges, rank_results, \
17
- defaults_ranking_weights
17
+ create_weights
18
18
 
19
19
 
20
20
  __all__ = [
@@ -39,6 +39,6 @@ __all__ = [
39
39
  "get_yearly_returns_bar_chart",
40
40
  "get_ohlcv_data_completeness_chart",
41
41
  "rank_results",
42
- "defaults_ranking_weights",
42
+ "create_weights",
43
43
  "get_entry_and_exit_signals"
44
44
  ]
@@ -33,7 +33,8 @@ class Algorithm:
33
33
  strategies=None,
34
34
  tasks: List = None,
35
35
  data_sources: List[DataSource] = None,
36
- on_strategy_run_hooks=None
36
+ on_strategy_run_hooks=None,
37
+ metadata=None
37
38
  ):
38
39
  self._name = name
39
40
  self._context = {}
@@ -46,6 +47,7 @@ class Algorithm:
46
47
  self._tasks = []
47
48
  self._data_sources = []
48
49
  self._on_strategy_run_hooks = []
50
+ self.metadata = metadata
49
51
 
50
52
  if data_sources is not None:
51
53
  self._data_sources = data_sources
@@ -1,8 +1,8 @@
1
1
  from .backtest_data_ranges import select_backtest_date_ranges
2
- from .ranking import rank_results, defaults_ranking_weights
2
+ from .ranking import rank_results, create_weights
3
3
 
4
4
  __all__ = [
5
5
  "select_backtest_date_ranges",
6
6
  "rank_results",
7
- "defaults_ranking_weights"
7
+ "create_weights"
8
8
  ]
@@ -0,0 +1,178 @@
1
+ default_weights = {
2
+ # Profitability
3
+ "total_net_gain": 3.0,
4
+ "total_net_loss": 0.0,
5
+ "total_return": 0.0,
6
+ "avg_return_per_trade": 0.0,
7
+
8
+ # Risk-adjusted returns
9
+ "sharpe_ratio": 1.0,
10
+ "sortino_ratio": 1.0,
11
+ "profit_factor": 1.0,
12
+
13
+ # Risk
14
+ "max_drawdown": -2.0,
15
+ "max_drawdown_duration": -0.5,
16
+
17
+ # Trading activity
18
+ "number_of_trades": 2.0,
19
+ "win_rate": 3.0,
20
+
21
+ # Exposure
22
+ "exposure_factor": 0.5,
23
+ "exposure_ratio": 0.0,
24
+ "exposure_time": 0.0,
25
+ }
26
+
27
+
28
+ def normalize(value, min_val, max_val):
29
+ """
30
+ Normalize a value to a range [0, 1].
31
+
32
+ Args:
33
+ value (float): The value to normalize.
34
+ min_val (float): The minimum value of the range.
35
+ max_val (float): The maximum value of the range.
36
+
37
+ Returns:
38
+ float: The normalized value.
39
+ """
40
+ if max_val == min_val:
41
+ return 0
42
+ return (value - min_val) / (max_val - min_val)
43
+
44
+
45
+ def compute_score(metrics, weights, ranges):
46
+ """
47
+ Compute a weighted score for the given metrics.
48
+
49
+ Args:
50
+ metrics: The metrics to evaluate.
51
+ weights: The weights to apply to each metric.
52
+ ranges: The min/max ranges for each metric.
53
+
54
+ Returns:
55
+ float: The computed score.
56
+ """
57
+ score = 0
58
+ for key, weight in weights.items():
59
+
60
+ if not hasattr(metrics, key):
61
+ continue
62
+ value = getattr(metrics, key)
63
+
64
+ if key in ranges:
65
+ value = normalize(value, ranges[key][0], ranges[key][1])
66
+ score += weight * value
67
+ return score
68
+
69
+
70
+ def create_weights(
71
+ focus: str = "balanced",
72
+ gain: float = 3.0,
73
+ win_rate: float = 3.0,
74
+ trades: float = 2.0,
75
+ custom_weights: dict | None = None,
76
+ ) -> dict:
77
+ """
78
+ Utility to generate weights dicts for ranking backtests.
79
+
80
+ This function does not assign weights to every possible performance
81
+ metric. Instead, it focuses on a curated subset of commonly relevant
82
+ ones (profitability, win rate, trade frequency, and risk-adjusted returns).
83
+ The rationale is to avoid overfitting ranking logic to noisy or redundant
84
+ statistics (e.g., monthly return breakdowns, best/worst trade), while
85
+ keeping the weighting system simple and interpretable.
86
+ Users who need fine-grained control can pass `custom_weights` to fully
87
+ override defaults.
88
+
89
+ Args:
90
+ focus (str): One of [
91
+ "balanced", "profit", "frequency", "risk_adjusted"
92
+ ].
93
+ gain (float): Weight for total_net_gain (default only).
94
+ win_rate (float): Weight for win_rate (default only).
95
+ trades (float): Weight for number_of_trades (default only).
96
+ custom_weights (dict): Full override for weights (all metrics).
97
+ If provided, it takes precedence over presets.
98
+
99
+ Returns:
100
+ dict: A dictionary of weights for ranking backtests.
101
+ """
102
+
103
+ # default / balanced
104
+ base = {
105
+ "total_net_gain": gain,
106
+ "win_rate": win_rate,
107
+ "number_of_trades": trades,
108
+ "sharpe_ratio": 1.0,
109
+ "sortino_ratio": 1.0,
110
+ "profit_factor": 1.0,
111
+ "max_drawdown": -2.0,
112
+ "max_drawdown_duration": -0.5,
113
+ "total_net_loss": 0.0,
114
+ "total_return": 0.0,
115
+ "avg_return_per_trade": 0.0,
116
+ "exposure_factor": 0.5,
117
+ "exposure_ratio": 0.0,
118
+ "exposure_time": 0.0,
119
+ }
120
+
121
+ # apply presets
122
+ if focus == "profit":
123
+ base.update({
124
+ "total_net_gain": 5.0,
125
+ "win_rate": 2.0,
126
+ "number_of_trades": 1.0,
127
+ })
128
+ elif focus == "frequency":
129
+ base.update({
130
+ "number_of_trades": 4.0,
131
+ "win_rate": 2.0,
132
+ "total_net_gain": 2.0,
133
+ })
134
+ elif focus == "risk_adjusted":
135
+ base.update({
136
+ "sharpe_ratio": 3.0,
137
+ "sortino_ratio": 3.0,
138
+ "max_drawdown": -3.0,
139
+ })
140
+
141
+ # if full custom dict is given → override everything
142
+ if custom_weights is not None:
143
+ base = {**base, **custom_weights}
144
+
145
+ return base
146
+
147
+
148
+ def rank_results(backtests, focus=None, weights=None):
149
+ """
150
+ Rank backtest results based on specified focus and weights.
151
+ Args:
152
+ backtests (list): List of backtest results to rank.
153
+ focus (str, optional): Focus for ranking. If None,
154
+ uses default weights. Options: "balanced", "profit",
155
+ "frequency", "risk_adjusted".
156
+ weights (dict, optional): Custom weights for ranking metrics.
157
+ If None, uses default weights based on focus.
158
+
159
+ Returns:
160
+ list: Sorted list of backtests based on computed scores.
161
+ """
162
+
163
+ if weights is None:
164
+ weights = create_weights(focus=focus)
165
+
166
+ # First compute metric ranges for normalization
167
+ ranges = {}
168
+ for key in weights:
169
+ values = [getattr(bt.backtest_metrics, key, None) for bt in backtests]
170
+ values = [v for v in values if isinstance(v, (int, float))]
171
+ if values:
172
+ ranges[key] = (min(values), max(values))
173
+
174
+ return sorted(
175
+ backtests,
176
+ key=lambda bt: compute_score(bt.backtest_metrics, weights, ranges),
177
+ reverse=True
178
+ )
@@ -381,6 +381,10 @@ class App:
381
381
  None
382
382
  """
383
383
  logger.info("Initializing data sources")
384
+
385
+ if data_sources is None or len(data_sources) == 0:
386
+ return
387
+
384
388
  data_provider_service = self.container.data_provider_service()
385
389
  data_provider_service.reset()
386
390
 
@@ -415,6 +419,10 @@ class App:
415
419
  None
416
420
  """
417
421
  logger.info("Initializing data sources for backtest")
422
+
423
+ if data_sources is None or len(data_sources) == 0:
424
+ return
425
+
418
426
  data_provider_service = self.container.data_provider_service()
419
427
  data_provider_service.reset()
420
428
 
@@ -890,7 +898,16 @@ class App:
890
898
  risk_free_rate=risk_free_rate,
891
899
  )
892
900
 
893
- backtest.metadata = metadata if metadata is not None else {}
901
+ # Add the metadata to the backtest
902
+ if metadata is None:
903
+
904
+ if algorithm.metadata is not None:
905
+ backtest.metadata = algorithm.metadata
906
+ else:
907
+ backtest.metadata = {}
908
+ else:
909
+ backtest.metadata = metadata
910
+
894
911
  self.cleanup_backtest_resources()
895
912
 
896
913
  if save and directory:
@@ -900,18 +917,102 @@ class App:
900
917
 
901
918
  return backtest
902
919
 
920
+ def run_vector_backtests(
921
+ self,
922
+ backtest_date_range: BacktestDateRange,
923
+ initial_amount,
924
+ strategies: List[TradingStrategy],
925
+ snapshot_interval: SnapshotInterval = SnapshotInterval.DAILY,
926
+ risk_free_rate: Optional[float] = None,
927
+ skip_data_sources_initialization: bool = False
928
+ ):
929
+ """
930
+ Run vectorized backtests for a set of strategies. The provided
931
+ set of strategies need to have their 'buy_signal_vectorized' and
932
+ 'sell_signal_vectorized' methods implemented to support vectorized
933
+ backtesting.
934
+
935
+ Args:
936
+ backtest_date_range: The date range to run the backtest for
937
+ (instance of BacktestDateRange)
938
+ initial_amount: The initial amount to start the backtest with.
939
+ This will be the amount of trading currency that the backtest
940
+ portfolio will start with.
941
+ strategies (List[TradingStrategy]): List of strategy objects
942
+ that need to be backtested. Each strategy should implement
943
+ the 'buy_signal_vectorized' and 'sell_signal_vectorized'
944
+ methods to support vectorized backtesting.
945
+ snapshot_interval (SnapshotInterval): The snapshot
946
+ interval to use for the backtest. This is used to determine
947
+ how often the portfolio snapshot should be taken during the
948
+ backtest. The default is TRADE_CLOSE, which means that the
949
+ portfolio snapshot will be taken at the end of each trade.
950
+ risk_free_rate (Optional[float]): The risk-free rate to use for
951
+ the backtest. This is used to calculate the Sharpe ratio
952
+ and other performance metrics. If not provided, the default
953
+ risk-free rate will be tried to be fetched from the
954
+ US Treasury website.
955
+ skip_data_sources_initialization (bool): Whether to skip the
956
+ initialization of data sources. This is useful when the data
957
+ sources are already initialized, and you want to skip the
958
+ initialization step. This will speed up the backtesting
959
+ process, but make sure that the data sources are already
960
+ initialized before calling this method.
961
+
962
+ Returns:
963
+ List[Backtest]: List of Backtest instances for each strategy
964
+ that was backtested.
965
+ """
966
+ backtests = []
967
+ data_sources = []
968
+
969
+ for strategy in strategies:
970
+ data_sources.extend(strategy.data_sources)
971
+
972
+ if not skip_data_sources_initialization:
973
+ self.initialize_data_sources_backtest(
974
+ data_sources, backtest_date_range
975
+ )
976
+
977
+ if risk_free_rate is None:
978
+ logger.info("No risk free rate provided, retrieving it...")
979
+ risk_free_rate = get_risk_free_rate_us()
980
+
981
+ if risk_free_rate is None:
982
+ raise OperationalException(
983
+ "Could not retrieve risk free rate for backtest metrics."
984
+ "Please provide a risk free as an argument when running "
985
+ "your backtest or make sure you have an internet "
986
+ "connection"
987
+ )
988
+
989
+ for strategy in tqdm(strategies):
990
+ backtests.append(
991
+ self.run_vector_backtest(
992
+ backtest_date_range=backtest_date_range,
993
+ initial_amount=initial_amount,
994
+ strategy=strategy,
995
+ snapshot_interval=snapshot_interval,
996
+ risk_free_rate=risk_free_rate,
997
+ skip_data_sources_initialization=True
998
+ )
999
+ )
1000
+
1001
+ return backtests
1002
+
903
1003
  def run_vector_backtest(
904
1004
  self,
905
1005
  backtest_date_range: BacktestDateRange,
906
1006
  initial_amount,
907
- strategy,
1007
+ strategy: TradingStrategy,
908
1008
  snapshot_interval: SnapshotInterval = SnapshotInterval.DAILY,
909
1009
  metadata: Optional[Dict[str, str]] = None,
910
1010
  risk_free_rate: Optional[float] = None,
1011
+ skip_data_sources_initialization: bool = False
911
1012
  ) -> Backtest:
912
1013
  """
913
- Run a vectorized backtest for an algorithm. The provided algorithm
914
- or set of strategies need to have their 'buy_signal_vectorized' and
1014
+ Run vectorized backtests for a strategy. The provided
1015
+ strategy needs to have its 'buy_signal_vectorized' and
915
1016
  'sell_signal_vectorized' methods implemented to support vectorized
916
1017
  backtesting.
917
1018
 
@@ -937,6 +1038,12 @@ class App:
937
1038
  backtest report. This can be used to store additional
938
1039
  information about the backtest, such as the author, version,
939
1040
  parameters or any other relevant information.
1041
+ skip_data_sources_initialization (bool): Whether to skip the
1042
+ initialization of data sources. This is useful when the data
1043
+ sources are already initialized, and you want to skip the
1044
+ initialization step. This will speed up the backtesting
1045
+ process, but make sure that the data sources are already
1046
+ initialized before calling this method.
940
1047
 
941
1048
  Returns:
942
1049
  Backtest: Instance of Backtest
@@ -947,9 +1054,11 @@ class App:
947
1054
  snapshot_interval=snapshot_interval,
948
1055
  initial_amount=initial_amount
949
1056
  )
950
- self.initialize_data_sources_backtest(
951
- strategy.data_sources, backtest_date_range
952
- )
1057
+
1058
+ if not skip_data_sources_initialization:
1059
+ self.initialize_data_sources_backtest(
1060
+ strategy.data_sources, backtest_date_range
1061
+ )
953
1062
 
954
1063
  if risk_free_rate is None:
955
1064
  logger.info("No risk free rate provided, retrieving it...")
@@ -971,7 +1080,17 @@ class App:
971
1080
  initial_amount=initial_amount,
972
1081
  risk_free_rate=risk_free_rate
973
1082
  )
974
- backtest.metadata = metadata if metadata is not None else {}
1083
+
1084
+ # Add the metadata to the backtest
1085
+ if metadata is None:
1086
+
1087
+ if strategy.metadata is None:
1088
+ backtest.metadata = {}
1089
+ else:
1090
+ backtest.metadata = strategy.metadata
1091
+ else:
1092
+ backtest.metadata = metadata
1093
+
975
1094
  return backtest
976
1095
 
977
1096
  def run_backtests(
@@ -27,8 +27,12 @@ class TradingStrategy:
27
27
  sources to use for the strategy. The data sources will be used
28
28
  to indentify data providers that will be called to gather data
29
29
  and pass to the strategy before its run.
30
+ metadata (optional): Dict[str, Any] - a dictionary
31
+ containing metadata about the strategy. This can be used to
32
+ store additional information about the strategy, such as its
33
+ author, version, description, params etc.
30
34
  """
31
- time_unit: str = None
35
+ time_unit: TimeUnit = None
32
36
  interval: int = None
33
37
  worker_id: str = None
34
38
  strategy_id: str = None
@@ -36,6 +40,7 @@ class TradingStrategy:
36
40
  data_sources: List[DataSource] = None
37
41
  traces = None
38
42
  context: Context = None
43
+ metadata: Dict[str, Any] = None
39
44
 
40
45
  def __init__(
41
46
  self,
@@ -43,6 +48,7 @@ class TradingStrategy:
43
48
  time_unit=None,
44
49
  interval=None,
45
50
  data_sources=None,
51
+ metadata=None,
46
52
  worker_id=None,
47
53
  decorated=None
48
54
  ):
@@ -65,6 +71,8 @@ class TradingStrategy:
65
71
  if data_sources is not None:
66
72
  self.data_sources = data_sources
67
73
 
74
+ self.metadata = metadata
75
+
68
76
  if decorated is not None:
69
77
  self.decorated = decorated
70
78
 
@@ -42,7 +42,7 @@ def get_win_rate(trades: List[Trade]) -> float:
42
42
  The percentage of trades that are profitable.
43
43
 
44
44
  Formula:
45
- Win Rate = (Number of Profitable Trades / Total Number of Trades) * 100
45
+ Win Rate = Number of Profitable Trades / Total Number of Trades
46
46
 
47
47
  Example: If 60 out of 100 trades are profitable, the win rate is 60%.
48
48
 
@@ -50,7 +50,7 @@ def get_win_rate(trades: List[Trade]) -> float:
50
50
  trades (List[Trade]): List of trades from the backtest report.
51
51
 
52
52
  Returns:
53
- float: The win rate as a percentage (e.g., 75.0 for 75% win rate).
53
+ float: The win rate as a percentage (e.g., o.75 for 75% win rate).
54
54
  """
55
55
  trades = [
56
56
  trade for trade in trades if TradeStatus.CLOSED.equals(trade.status)
@@ -61,7 +61,7 @@ def get_win_rate(trades: List[Trade]) -> float:
61
61
  if total_trades == 0:
62
62
  return 0.0
63
63
 
64
- return (positive_trades / total_trades) * 100.0
64
+ return positive_trades / total_trades
65
65
 
66
66
 
67
67
  def get_win_loss_ratio(trades: List[Trade]) -> float:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v7.0.3"
3
+ version = "v7.2.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"
@@ -1,58 +0,0 @@
1
- from investing_algorithm_framework.domain import Backtest
2
-
3
- defaults_ranking_weights = {
4
- "total_net_gain": 2.0,
5
- "sharpe_ratio": 1.0,
6
- "sortino_ratio": 1.0,
7
- "win_rate": 1.0,
8
- "profit_factor": 1.0,
9
- "max_drawdown": -1.0, # negative weight to penalize high drawdown
10
- "max_drawdown_duration": -0.5, # penalize long drawdown periods
11
- "number_of_trades": 0.5,
12
- "exposure_factor": 0.5,
13
- }
14
-
15
-
16
- def compute_score(metrics: dict, weights: dict) -> float:
17
- score = 0
18
- for key, weight in weights.items():
19
-
20
- # Metrics are attributes to the backtest
21
- if not hasattr(metrics, key):
22
- continue
23
-
24
- # Get the value of the metric
25
- value = getattr(metrics, key)
26
-
27
- try:
28
- score += weight * value
29
- except TypeError:
30
- continue # skip if value is not a number
31
- return score
32
-
33
-
34
- def rank_results(
35
- backtests: list[Backtest], weights=defaults_ranking_weights
36
- ) -> list[Backtest]:
37
- """
38
- Rank backtests based on their metrics and the provided weights.
39
-
40
- The default weights are defined in `defaults_ranking_weights`.
41
- Please note that the weights should be adjusted based on the
42
- specific analysis needs. You can modify the `weights` parameter
43
- to include or exclude metrics as needed and reuse
44
- the `defaults_ranking_weights` as a starting point.
45
-
46
- Args:
47
- backtests (list[Backtest]): List of Backtest objects to rank.
48
- weights (dict): Weights for each metric to compute the score.
49
-
50
- Returns:
51
- list[Backtest]: List of Backtest objects sorted by
52
- their computed score.
53
- """
54
- return sorted(
55
- backtests,
56
- key=lambda bt: compute_score(bt.backtest_metrics, weights),
57
- reverse=True
58
- )