investing-algorithm-framework 7.5.0__tar.gz → 7.7.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 (266) hide show
  1. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/PKG-INFO +250 -63
  2. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/README.md +249 -62
  3. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/__init__.py +8 -3
  4. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/app.py +13 -14
  5. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/context.py +70 -2
  6. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/strategy.py +107 -110
  7. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/dependency_container.py +2 -11
  8. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/__init__.py +4 -4
  9. investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/backtesting/BacktestInitializer.py +7 -0
  10. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +1 -1
  11. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +13 -17
  12. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/data_source.py +14 -2
  13. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +13 -1
  14. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade.py +11 -1
  15. investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/positions/__init__.py +4 -0
  16. investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/positions/position_size.py +41 -0
  17. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/__init__.py +0 -4
  18. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/__init__.py +1 -3
  19. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +1 -1
  20. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -2
  21. investing_algorithm_framework-7.7.0/investing_algorithm_framework/services/__init__.py +113 -0
  22. investing_algorithm_framework-7.7.0/investing_algorithm_framework/services/backtesting/backtest_service.py +569 -0
  23. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +16 -3
  24. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/__init__.py +3 -1
  25. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/drawdown.py +1 -1
  26. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/exposure.py +2 -5
  27. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/returns.py +34 -3
  28. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_service.py +2 -32
  29. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +2 -5
  30. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +3 -3
  31. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/pyproject.toml +1 -1
  32. investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/services/observable.py +0 -51
  33. investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/services/observer.py +0 -19
  34. investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -7
  35. investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -2
  36. investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -322
  37. investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
  38. investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
  39. investing_algorithm_framework-7.5.0/investing_algorithm_framework/services/__init__.py +0 -39
  40. investing_algorithm_framework-7.5.0/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -413
  41. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/LICENSE +0 -0
  42. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/__init__.py +0 -0
  43. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  44. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  45. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  46. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
  47. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
  48. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
  49. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
  50. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  51. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  52. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  53. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  54. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  55. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  56. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  57. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  58. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  59. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  60. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  61. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  62. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  63. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  64. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  65. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  66. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  67. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  68. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  69. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  70. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  71. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  72. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  73. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  74. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  75. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  76. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  77. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  78. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/task.py +0 -0
  79. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  80. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  81. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  82. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  83. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  84. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  85. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  86. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  87. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  88. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  89. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  90. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  91. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  92. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  93. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  94. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/cli.py +0 -0
  95. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  96. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  97. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  98. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  99. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  100. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  101. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  102. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  103. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  104. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  105. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  106. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  107. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  108. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  109. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  110. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  111. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  112. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  113. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  114. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  115. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  116. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  117. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  118. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  119. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/create_app.py +0 -0
  120. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  121. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  122. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  123. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  124. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  125. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  126. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
  127. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/config.py +0 -0
  128. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/constants.py +0 -0
  129. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  130. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  131. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  132. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  133. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  134. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  135. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  136. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  137. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  138. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  139. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  140. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  141. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  142. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  143. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  144. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  145. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  146. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  147. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  148. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  149. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  150. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  151. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  152. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  153. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  154. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  155. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  156. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  157. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  158. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  159. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  160. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
  161. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  162. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  163. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  164. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  165. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  166. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  167. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  168. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  169. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  170. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  171. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  172. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  173. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  174. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  175. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  176. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  177. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  178. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  179. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  180. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  181. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  182. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  183. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/download_data.py +0 -0
  184. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  185. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  186. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  187. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  188. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  189. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  190. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  191. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  192. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  193. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  194. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
  195. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  196. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  197. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  198. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  199. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  200. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  201. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  202. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  203. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  204. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  205. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  206. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  207. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  208. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  209. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  210. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  211. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  212. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
  213. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  214. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  215. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  216. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  217. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  218. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  219. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  220. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  221. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  222. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  223. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  224. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  225. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  226. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
  227. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  228. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  229. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  230. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  231. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  232. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  233. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  234. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  235. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  236. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  237. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  238. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  239. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  240. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  241. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  242. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  243. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  244. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  245. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  246. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  247. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  248. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  249. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  250. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  251. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  252. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  253. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  254. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  255. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  256. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  257. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  258. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  259. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  260. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  261. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  262. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  263. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  264. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  265. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  266. {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.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.5.0
3
+ Version: 7.7.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -50,17 +50,6 @@ Description-Content-Type: text/markdown
50
50
  </div>
51
51
 
52
52
  The Investing Algorithm Framework is a Python-based framework built to streamline the entire lifecycle of quantitative trading strategies from signal generation and backtesting to live deployment.
53
- It offers a complete quantitative workflow, featuring two dedicated backtesting engines:
54
-
55
- * A vectorized backtest engine for fast signal research and prototyping
56
-
57
- * An event-based backtest engine for realistic and accurate strategy evaluation
58
-
59
- The framework supports live trading across multiple exchanges and offers flexible deployment options, including Azure Functions and AWS Lambda.
60
- Designed for extensibility, it allows you to integrate custom strategies, data providers, and order executors, enabling support for any exchange or broker.
61
- It natively supports multiple data formats, including OHLCV, ticker, and custom datasets with seamless compatibility for both Pandas and Polars DataFrames.
62
-
63
-
64
53
 
65
54
  ## Sponsors
66
55
 
@@ -79,6 +68,7 @@ It natively supports multiple data formats, including OHLCV, ticker, and custom
79
68
  - [x] Event-Driven Backtest Engine: Accurate and realistic backtesting with event-driven architecture.
80
69
  - [x] Vectorized Backtest Engine: Fast signal research and prototyping with vectorized operations.
81
70
  - [x] Permutation testing: Run permutation tests to evaluate the strategy statistical significance.
71
+ - [x] Metric tracking and backtest reports evaluation/comparison: Track and compare key performance metrics like CAGR, Sharpe ratio, max drawdown, and more (See example usage for a complete list of metrics the framework collects).
82
72
  - [x] Backtest Reporting: Generate detailed reports to analyse and compare backtests.
83
73
  - [x] Live Trading: Execute trades in real-time with support for multiple exchanges via ccxt.
84
74
  - [x] Portfolio Management: Manage portfolios, trades, and positions with persistence via SQLite.
@@ -88,6 +78,13 @@ It natively supports multiple data formats, including OHLCV, ticker, and custom
88
78
  - [x] Web API: Interact with your bot via REST API.
89
79
  - [x] PyIndicators Integration: Perform technical analysis directly on your dataframes.
90
80
  - [x] Extensibility: Add custom strategies, data providers, order executors so you can connect your trading bot to your favorite exchange or broker.
81
+ - [x] Modular Design: Build your bot using modular components for easy customization and maintenance.
82
+ - [x] Multiple exchanges and brokers: **Detailed guides and API references to help you get started and make the most of the framework.
83
+ and offers flexible deployment options, including Azure Functions and AWS Lambda.
84
+ Designed for extensibility, it allows you to integrate custom strategies, data providers, and order executors, enabling support for any exchange or broker.
85
+ It natively supports multiple data formats, including OHLCV, ticker, and custom datasets with seamless compatibility for both Pandas and Polars DataFrames.
86
+
87
+
91
88
 
92
89
  ## 🚀 Quickstart
93
90
 
@@ -106,10 +103,10 @@ Run the following command to set up your project:
106
103
  investing-algorithm-framewor init
107
104
  ```
108
105
 
109
- For a web-enabled version:
106
+ For a aws lambda compatible project, run:
110
107
 
111
108
  ```bash
112
- investing-algorithm-framework init --web
109
+ investing-algorithm-framework init --type aws_lambda
113
110
  ```
114
111
 
115
112
  This will create:
@@ -133,74 +130,264 @@ the 20, 50 and 100 period exponential moving averages (EMA) and the
133
130
  > You can install it using pip: pip install pyindicators.
134
131
 
135
132
  ```python
136
- import logging.config
137
- from dotenv import load_dotenv
133
+ from typing import Dict, Any
134
+ from datetime import datetime, timezone
138
135
 
139
- from pyindicators import ema, rsi, crossunder, crossover, is_above
136
+ import pandas as pd
137
+ from pyindicators import ema, rsi, crossover, crossunder
140
138
 
141
- from investing_algorithm_framework import create_app, TimeUnit, Context, BacktestDateRange, \
142
- DEFAULT_LOGGING_CONFIG, TradingStrategy, SnapshotInterval, BacktestReport, DataSource
139
+ from investing_algorithm_framework import TradingStrategy, DataSource, \
140
+ TimeUnit, DataType, PositionSize, create_app, RESOURCE_DIRECTORY, \
141
+ BacktestDateRange, BacktestReport
143
142
 
144
- load_dotenv()
145
- logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
146
- logger = logging.getLogger(__name__)
147
143
 
148
- app = create_app()
149
- # Registered bitvavo market, credentials are read from .env file by default
150
- app.add_market(market="BITVAVO", trading_symbol="EUR", initial_balance=100)
151
-
152
- class MyStrategy(TradingStrategy):
153
- interval = 2
144
+ class RSIEMACrossoverStrategy(TradingStrategy):
154
145
  time_unit = TimeUnit.HOUR
155
- data_sources = [
156
- DataSource(data_type="OHLCV", market="bitvavo", symbol="BTC/EUR", window_size=200, time_frame="2h", identifier="BTC-ohlcv", pandas=True),
146
+ interval = 2
147
+ symbols = ["BTC"]
148
+ position_sizes = [
149
+ PositionSize(
150
+ symbol="BTC", percentage_of_portfolio=20.0
151
+ ),
152
+ PositionSize(
153
+ symbol="ETH", percentage_of_portfolio=20.0
154
+ )
157
155
  ]
158
- symbols = ["BTC/EUR"]
159
156
 
160
- def run_strategy(self, context: Context, data):
157
+ def __init__(
158
+ self,
159
+ time_unit: TimeUnit,
160
+ interval: int,
161
+ market: str,
162
+ rsi_time_frame: str,
163
+ rsi_period: int,
164
+ rsi_overbought_threshold,
165
+ rsi_oversold_threshold,
166
+ ema_time_frame,
167
+ ema_short_period,
168
+ ema_long_period,
169
+ ema_cross_lookback_window: int = 10
170
+ ):
171
+ self.rsi_time_frame = rsi_time_frame
172
+ self.rsi_period = rsi_period
173
+ self.rsi_result_column = f"rsi_{self.rsi_period}"
174
+ self.rsi_overbought_threshold = rsi_overbought_threshold
175
+ self.rsi_oversold_threshold = rsi_oversold_threshold
176
+ self.ema_time_frame = ema_time_frame
177
+ self.ema_short_result_column = f"ema_{ema_short_period}"
178
+ self.ema_long_result_column = f"ema_{ema_long_period}"
179
+ self.ema_crossunder_result_column = "ema_crossunder"
180
+ self.ema_crossover_result_column = "ema_crossover"
181
+ self.ema_short_period = ema_short_period
182
+ self.ema_long_period = ema_long_period
183
+ self.ema_cross_lookback_window = ema_cross_lookback_window
184
+ data_sources = []
185
+
186
+ for symbol in self.symbols:
187
+ full_symbol = f"{symbol}/EUR"
188
+ data_sources.append(
189
+ DataSource(
190
+ identifier=f"{symbol}_rsi_data",
191
+ data_type=DataType.OHLCV,
192
+ time_frame=self.rsi_time_frame,
193
+ market=market,
194
+ symbol=full_symbol,
195
+ pandas=True,
196
+ window_size=800
197
+ )
198
+ )
199
+ data_sources.append(
200
+ DataSource(
201
+ identifier=f"{symbol}_ema_data",
202
+ data_type=DataType.OHLCV,
203
+ time_frame=self.ema_time_frame,
204
+ market=market,
205
+ symbol=full_symbol,
206
+ pandas=True,
207
+ window_size=800
208
+ )
209
+ )
161
210
 
162
- if context.has_open_orders(target_symbol="BTC"):
163
- logger.info("There are open orders, skipping strategy iteration.")
164
- return
211
+ super().__init__(
212
+ data_sources=data_sources, time_unit=time_unit, interval=interval
213
+ )
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
+ def _prepare_indicators(
223
+ self,
224
+ rsi_data,
225
+ ema_data
226
+ ):
227
+ """
228
+ Helper function to prepare the indicators
229
+ for the strategy. The indicators are calculated
230
+ using the pyindicators library: https://github.com/coding-kitties/PyIndicators
231
+ """
232
+ ema_data = ema(
233
+ ema_data,
234
+ period=self.ema_short_period,
235
+ source_column="Close",
236
+ result_column=self.ema_short_result_column
237
+ )
238
+ ema_data = ema(
239
+ ema_data,
240
+ period=self.ema_long_period,
241
+ source_column="Close",
242
+ result_column=self.ema_long_result_column
243
+ )
244
+ # Detect crossover (short EMA crosses above long EMA)
245
+ ema_data = crossover(
246
+ ema_data,
247
+ first_column=self.ema_short_result_column,
248
+ second_column=self.ema_long_result_column,
249
+ result_column=self.ema_crossover_result_column
250
+ )
251
+ # Detect crossunder (short EMA crosses below long EMA)
252
+ ema_data = crossunder(
253
+ ema_data,
254
+ first_column=self.ema_short_result_column,
255
+ second_column=self.ema_long_result_column,
256
+ result_column=self.ema_crossunder_result_column
257
+ )
258
+ rsi_data = rsi(
259
+ rsi_data,
260
+ period=self.rsi_period,
261
+ source_column="Close",
262
+ result_column=self.rsi_result_column
263
+ )
264
+
265
+ return ema_data, rsi_data
266
+
267
+ def generate_buy_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
268
+ """
269
+ Generate buy signals based on the moving average crossover.
270
+
271
+ data (Dict[str, Any]): Dictionary containing all the data for
272
+ the strategy data sources.
273
+
274
+ Returns:
275
+ Dict[str, pd.Series]: A dictionary where keys are symbols and values
276
+ are pandas Series indicating buy signals (True/False).
277
+ """
278
+
279
+ signals = {}
280
+
281
+ for symbol in self.symbols:
282
+ ema_data_identifier = f"{symbol}_ema_data"
283
+ rsi_data_identifier = f"{symbol}_rsi_data"
284
+ ema_data, rsi_data = self._prepare_indicators(
285
+ data[ema_data_identifier].copy(),
286
+ data[rsi_data_identifier].copy()
287
+ )
165
288
 
166
- data = data["BTC-ohlcv"]
167
- data = ema(data, source_column="Close", period=20, result_column="ema_20")
168
- data = ema(data, source_column="Close", period=50, result_column="ema_50")
169
- data = ema(data, source_column="Close", period=100, result_column="ema_100")
170
- data = crossunder(data, first_column="ema_50", second_column="ema_100", result_column="crossunder_50_20")
171
- data = crossover(data, first_column="ema_50", second_column="ema_100", result_column="crossover_50_20")
172
- data = rsi(data, source_column="Close", period=14, result_column="rsi_14")
289
+ # crossover confirmed
290
+ ema_crossover_lookback = ema_data[
291
+ self.ema_crossover_result_column].rolling(
292
+ window=self.ema_cross_lookback_window
293
+ ).max().astype(bool)
173
294
 
174
- if context.has_position("BTC") and self.sell_signal(data):
175
- context.create_limit_sell_order(
176
- "BTC", percentage_of_position=100, price=data["Close"].iloc[-1]
177
- )
178
- return
295
+ # use only RSI column
296
+ rsi_oversold = rsi_data[self.rsi_result_column] \
297
+ < self.rsi_oversold_threshold
298
+
299
+ buy_signal = rsi_oversold & ema_crossover_lookback
300
+ buy_signals = buy_signal.fillna(False).astype(bool)
301
+ 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
+ return signals
310
+
311
+ def generate_sell_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
312
+ """
313
+ Generate sell signals based on the moving average crossover.
314
+
315
+ Args:
316
+ data (Dict[str, Any]): Dictionary containing all the data for
317
+ the strategy data sources.
318
+
319
+ Returns:
320
+ Dict[str, pd.Series]: A dictionary where keys are symbols and values
321
+ are pandas Series indicating sell signals (True/False).
322
+ """
179
323
 
180
- if not context.has_position("BTC") and self.buy_signal(data):
181
- context.create_limit_buy_order(
182
- "BTC", percentage_of_portfolio=20, price=data["Close"].iloc[-1]
324
+ signals = {}
325
+ for symbol in self.symbols:
326
+ ema_data_identifier = f"{symbol}_ema_data"
327
+ rsi_data_identifier = f"{symbol}_rsi_data"
328
+ ema_data, rsi_data = self._prepare_indicators(
329
+ data[ema_data_identifier].copy(),
330
+ data[rsi_data_identifier].copy()
183
331
  )
184
- return
185
332
 
186
- def buy_signal(self, data) -> bool:
187
- return False
333
+ # Confirmed by crossover between short-term EMA and long-term EMA
334
+ # within a given lookback window
335
+ ema_crossunder_lookback = ema_data[
336
+ self.ema_crossunder_result_column].rolling(
337
+ window=self.ema_cross_lookback_window
338
+ ).max().astype(bool)
188
339
 
189
- def sell_signal(self, data) -> bool:
190
- return False
340
+ # use only RSI column
341
+ rsi_overbought = rsi_data[self.rsi_result_column] \
342
+ >= self.rsi_overbought_threshold
343
+
344
+ # Combine both conditions
345
+ sell_signal = rsi_overbought & ema_crossunder_lookback
346
+ sell_signal = sell_signal.fillna(False).astype(bool)
347
+ 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
+ return signals
191
356
 
192
- date_range = BacktestDateRange(
193
- start_date="2023-08-24 00:00:00", end_date="2023-12-02 00:00:00"
194
- )
195
- app.add_strategy(MyStrategy)
196
357
 
197
358
  if __name__ == "__main__":
198
- # Run the backtest with a daily snapshot interval for end-of-day granular reporting
359
+ app = create_app()
360
+ app.add_strategy(
361
+ RSIEMACrossoverStrategy(
362
+ time_unit=TimeUnit.HOUR,
363
+ interval=2,
364
+ market="bitvavo",
365
+ rsi_time_frame="2h",
366
+ rsi_period=14,
367
+ rsi_overbought_threshold=70,
368
+ rsi_oversold_threshold=30,
369
+ ema_time_frame="2h",
370
+ ema_short_period=12,
371
+ ema_long_period=26,
372
+ ema_cross_lookback_window=10
373
+ )
374
+ )
375
+
376
+ # Market credentials for coinbase for both the portfolio connection and data sources will
377
+ # be read from .env file, when not registering a market credential object in the app.
378
+ app.add_market(
379
+ market="bitvavo",
380
+ trading_symbol="EUR",
381
+ )
382
+ backtest_range = BacktestDateRange(
383
+ start_date=datetime(2023, 1, 1, tzinfo=timezone.utc),
384
+ end_date=datetime(2024, 6, 1, tzinfo=timezone.utc)
385
+ )
199
386
  backtest = app.run_backtest(
200
- backtest_date_range=date_range, initial_amount=100, snapshot_interval=SnapshotInterval.DAILY
387
+ backtest_date_range=backtest_range, initial_amount=1000
201
388
  )
202
- backtest_report = BacktestReport(backtests=[backtest])
203
- backtest_report.show()
389
+ report = BacktestReport(backtest)
390
+ report.show(backtest_date_range=backtest_range, browser=True)
204
391
  ```
205
392
 
206
393
  > You can find more examples [here](./examples) folder.