investing-algorithm-framework 6.8.1__tar.gz → 6.9.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.
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/PKG-INFO +82 -20
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/README.md +79 -19
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/__init__.py +18 -50
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/__init__.py +11 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/app.py +48 -12
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/context.py +148 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/__init__.py +16 -0
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/domain/utils/backtesting.py → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/ascii.py +61 -297
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/backtest_report.py +235 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/charts/__init__.py +11 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +89 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/generate.py +199 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/__init__.py +83 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/cagr.py +4 -8
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/calmar_ratio.py +7 -6
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/drawdown.py +84 -16
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/equity_curve.py +5 -6
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/exposure.py +152 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/mean_daily_return.py +3 -4
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/profit_factor.py +23 -15
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/recovery.py +12 -14
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/returns.py +453 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/sharp_ratio.py +61 -7
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/sortino_ratio.py +14 -10
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/standard_deviation.py +3 -5
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/treynor_ratio.py +0 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/ulcer.py +0 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/value_at_risk.py +0 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/volatility.py +69 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/win_rate.py +25 -12
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +209 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +73 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +143 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/tables/utils.py +28 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +160 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/cli.py +60 -4
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +404 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -1
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/initialize_app.py +584 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +36 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/env.example.template +2 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/readme.md.template +1 -1
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/requirements_azure_function.txt.template +3 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/dependency_container.py +1 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/__init__.py +11 -21
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/constants.py +3 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/data_provider.py +3 -1
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/__init__.py +3 -3
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/domain/models/backtesting/__init__.py +9 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/domain/models/backtesting/backtest_reports_evaluation.py +0 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/domain/models/backtesting/backtest_results.py +440 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/market/market_credential.py +2 -1
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +4 -1
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +1 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -78
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +29 -3
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +27 -3
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -12
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/__init__.py +3 -2
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -1
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/__init__.py +3 -1
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
- investing_algorithm_framework-6.9.0/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +113 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +57 -346
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/pyproject.toml +3 -1
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/initialize_app.py +0 -311
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/app_web.py.template +0 -18
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/env.example.template +0 -2
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -2
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/requirements_azure_function.txt.template +0 -3
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -13
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/domain/models/backtesting/__init__.py +0 -11
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/domain/models/backtesting/backtest_report.py +0 -735
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/metrics/__init__.py +0 -46
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/metrics/exposure.py +0 -85
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/metrics/net_profit.py +0 -17
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/metrics/volatility.py +0 -56
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/overfitting/__init__.py +0 -9
- investing_algorithm_framework-6.8.1/investing_algorithm_framework/overfitting/permutations.py +0 -101
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/LICENSE +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- /investing_algorithm_framework-6.8.1/investing_algorithm_framework/domain/models/backtesting/backtest_reports_evaluation.py → /investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/evaluation.py +0 -0
- /investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/__init__.py → /investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/alpha.py +0 -0
- /investing_algorithm_framework-6.8.1/investing_algorithm_framework/domain/models/tracing/__init__.py → /investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting/metrics/beta.py +0 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-6.8.1/investing_algorithm_framework → investing_algorithm_framework-6.9.0/investing_algorithm_framework/app/reporting}/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/strategy.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- /investing_algorithm_framework-6.8.1/investing_algorithm_framework/cli/templates/app-web.py.template → /investing_algorithm_framework-6.9.0/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/backtesting/backtest_position.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/data_source.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/date_range.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/market_data_type.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trading_data_types.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/models/trading_time_frame.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/market_data_sources.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/market_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/market_data_sources/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/market_data_sources/ccxt.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/market_data_sources/csv.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/market_data_sources/pandas.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/market_service/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/market_service/ccxt_market_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/market_data_source_service/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/market_data_source_service/backtest_market_data_source_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/market_data_source_service/data_provider_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/market_data_source_service/market_data_source_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-6.8.1 → investing_algorithm_framework-6.9.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: 6.
|
|
3
|
+
Version: 6.9.0
|
|
4
4
|
Summary: A framework for creating trading bots
|
|
5
5
|
Author: MDUYN
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -17,10 +17,12 @@ Requires-Dist: azure-mgmt-resource (>=23.2.0,<24.0.0)
|
|
|
17
17
|
Requires-Dist: azure-mgmt-storage (>=21.2.1,<22.0.0)
|
|
18
18
|
Requires-Dist: azure-mgmt-web (>=7.3.1,<8.0.0)
|
|
19
19
|
Requires-Dist: azure-storage-blob (>=12.24.0,<13.0.0)
|
|
20
|
+
Requires-Dist: boto3 (>=1.38.41,<2.0.0)
|
|
20
21
|
Requires-Dist: ccxt (>=4.2.48)
|
|
21
22
|
Requires-Dist: dependency-injector (>=4.40.0)
|
|
22
23
|
Requires-Dist: jupyter (>=1.0.0)
|
|
23
24
|
Requires-Dist: marshmallow (>=3.5.0)
|
|
25
|
+
Requires-Dist: plotly (>=6.1.2,<7.0.0)
|
|
24
26
|
Requires-Dist: polars[numpy,pandas] (>=0.20.10)
|
|
25
27
|
Requires-Dist: pyarrow (>=19.0.1)
|
|
26
28
|
Requires-Dist: python-dateutil (>=2.8.2)
|
|
@@ -43,13 +45,20 @@ Description-Content-Type: text/markdown
|
|
|
43
45
|
|
|
44
46
|
> If you like what we do, consider starring, sharing and contributing!
|
|
45
47
|
|
|
48
|
+
<div align="center">
|
|
49
|
+
<img src="static/showcase.svg" alt="Investing Algorithm Framework Logo" style="height: 50vh; max-height: 750px;">
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
The investing algorithm framework is a Python framework designed to help you build, backtest, and deploy quantitative trading strategies. It comes with a event-based backtesting engine, ensuring an accurate and realistic evaluation of your strategies. The framework supports live trading with multiple exchanges and has various deployment options including Azure Functions and AWS Lambda.
|
|
53
|
+
The framework is designed to be extensible, allowing you to add custom strategies, data providers, and order executors. It also supports multiple data sources, including OHLCV, ticker, and custom data, with integration for both Polars and Pandas.
|
|
54
|
+
|
|
46
55
|
## Sponsors
|
|
47
56
|
|
|
48
57
|
<a href="https://www.finterion.com/" target="_blank">
|
|
49
58
|
<picture style="height: 30px;">
|
|
50
59
|
<source media="(prefers-color-scheme: dark)" srcset="static/sponsors/finterion-dark.png">
|
|
51
60
|
<source media="(prefers-color-scheme: light)" srcset="static/sponsors/finterion-light.png">
|
|
52
|
-
<img src="static/sponsors/finterion-light.
|
|
61
|
+
<img src="static/sponsors/finterion-light.png" alt="Finterion Logo" width="200px" height="50px">
|
|
53
62
|
</picture>
|
|
54
63
|
</a>
|
|
55
64
|
|
|
@@ -100,17 +109,30 @@ This will create:
|
|
|
100
109
|
---
|
|
101
110
|
|
|
102
111
|
## 📈 Example: A Simple Trading Bot
|
|
103
|
-
The following example
|
|
112
|
+
The following example trading bot implements a simple moving average strategy.
|
|
113
|
+
The strategy will use data from bitvavo exchange and will calculate
|
|
114
|
+
the 20, 50 and 100 period exponential moving averages (EMA) and the
|
|
115
|
+
14 period relative strength index (RSI).
|
|
116
|
+
|
|
117
|
+
> This example uses [PyIndicators](https://github.com/coding-kitties/pyindicators) for technical analysis.
|
|
118
|
+
> This dependency is not part of the framework, but is used to perform technical analysis on the dataframes.
|
|
119
|
+
> You can install it using pip: pip install pyindicators.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
104
122
|
|
|
105
123
|
```python
|
|
106
124
|
import logging.config
|
|
107
125
|
from dotenv import load_dotenv
|
|
108
126
|
|
|
109
|
-
from
|
|
110
|
-
|
|
127
|
+
from pyindicators import ema, rsi
|
|
128
|
+
|
|
129
|
+
from investing_algorithm_framework import create_app, TimeUnit, Context, BacktestDateRange, \
|
|
130
|
+
CCXTOHLCVMarketDataSource, CCXTTickerMarketDataSource, DEFAULT_LOGGING_CONFIG, \
|
|
131
|
+
TradingStrategy, SnapshotInterval, convert_polars_to_pandas
|
|
111
132
|
|
|
112
133
|
load_dotenv()
|
|
113
134
|
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|
|
135
|
+
logger = logging.getLogger(__name__)
|
|
114
136
|
|
|
115
137
|
# OHLCV data for candles
|
|
116
138
|
bitvavo_btc_eur_ohlcv_2h = CCXTOHLCVMarketDataSource(
|
|
@@ -131,24 +153,64 @@ app = create_app()
|
|
|
131
153
|
# Registered bitvavo market, credentials are read from .env file by default
|
|
132
154
|
app.add_market(market="BITVAVO", trading_symbol="EUR", initial_balance=100)
|
|
133
155
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
time_unit=TimeUnit.
|
|
137
|
-
|
|
138
|
-
|
|
156
|
+
class MyStrategy(TradingStrategy):
|
|
157
|
+
interval = 2
|
|
158
|
+
time_unit = TimeUnit.HOUR
|
|
159
|
+
data_sources = [bitvavo_btc_eur_ohlcv_2h, bitvavo_btc_eur_ticker]
|
|
160
|
+
|
|
161
|
+
def run_strategy(self, context: Context, market_data):
|
|
162
|
+
|
|
163
|
+
if context.has_open_orders(target_symbol="BTC"):
|
|
164
|
+
logger.info("There are open orders, skipping strategy iteration.")
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
print(market_data)
|
|
168
|
+
|
|
169
|
+
data = convert_polars_to_pandas(market_data["BTC-ohlcv"])
|
|
170
|
+
data = ema(data, source_column="Close", period=20, result_column="ema_20")
|
|
171
|
+
data = ema(data, source_column="Close", period=50, result_column="ema_50")
|
|
172
|
+
data = ema(data, source_column="Close", period=100, result_column="ema_100")
|
|
173
|
+
data = rsi(data, source_column="Close", period=14, result_column="rsi_14")
|
|
174
|
+
|
|
175
|
+
if context.has_position("BTC") and self.sell_signal(data):
|
|
176
|
+
context.create_limit_sell_order(
|
|
177
|
+
"BTC", percentage_of_position=100, price=data["Close"].iloc[-1]
|
|
178
|
+
)
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
if not context.has_position("BTC") and self.buy_signal(data):
|
|
182
|
+
context.create_limit_buy_order(
|
|
183
|
+
"BTC", percentage_of_portfolio=20, price=data["Close"].iloc[-1]
|
|
184
|
+
)
|
|
185
|
+
return
|
|
186
|
+
|
|
187
|
+
def buy_signal(self, data):
|
|
188
|
+
if len(data) < 100:
|
|
189
|
+
return False
|
|
190
|
+
last_row = data.iloc[-1]
|
|
191
|
+
if last_row["ema_20"] > last_row["ema_50"] and last_row["ema_50"] > last_row["ema_100"]:
|
|
192
|
+
return True
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
def sell_signal(self, data):
|
|
196
|
+
|
|
197
|
+
if data["ema_20"].iloc[-1] < data["ema_50"].iloc[-1] and \
|
|
198
|
+
data["ema_20"].iloc[-2] >= data["ema_50"].iloc[-2]:
|
|
199
|
+
return True
|
|
200
|
+
|
|
201
|
+
return False
|
|
202
|
+
|
|
203
|
+
date_range = BacktestDateRange(
|
|
204
|
+
start_date="2023-08-24 00:00:00", end_date="2023-12-02 00:00:00"
|
|
139
205
|
)
|
|
140
|
-
|
|
141
|
-
# Access the data sources with the indentifier
|
|
142
|
-
polars_df = market_data["BTC-ohlcv"]
|
|
143
|
-
ticker_data = market_data["BTC-ticker"]
|
|
144
|
-
unallocated_balance = context.get_unallocated()
|
|
145
|
-
positions = context.get_positions()
|
|
146
|
-
trades = context.get_trades()
|
|
147
|
-
open_trades = context.get_open_trades()
|
|
148
|
-
closed_trades = context.get_closed_trades()
|
|
206
|
+
app.add_strategy(MyStrategy)
|
|
149
207
|
|
|
150
208
|
if __name__ == "__main__":
|
|
151
|
-
|
|
209
|
+
# Run the backtest with a daily snapshot interval for end-of-day granular reporting
|
|
210
|
+
backtest_report = app.run_backtest(
|
|
211
|
+
backtest_date_range=date_range, initial_amount=100, snapshot_interval=SnapshotInterval.STRATEGY_ITERATION
|
|
212
|
+
)
|
|
213
|
+
backtest_report.show()
|
|
152
214
|
```
|
|
153
215
|
|
|
154
216
|
> You can find more examples [here](./examples) folder.
|
|
@@ -9,13 +9,20 @@
|
|
|
9
9
|
|
|
10
10
|
> If you like what we do, consider starring, sharing and contributing!
|
|
11
11
|
|
|
12
|
+
<div align="center">
|
|
13
|
+
<img src="static/showcase.svg" alt="Investing Algorithm Framework Logo" style="height: 50vh; max-height: 750px;">
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
The investing algorithm framework is a Python framework designed to help you build, backtest, and deploy quantitative trading strategies. It comes with a event-based backtesting engine, ensuring an accurate and realistic evaluation of your strategies. The framework supports live trading with multiple exchanges and has various deployment options including Azure Functions and AWS Lambda.
|
|
17
|
+
The framework is designed to be extensible, allowing you to add custom strategies, data providers, and order executors. It also supports multiple data sources, including OHLCV, ticker, and custom data, with integration for both Polars and Pandas.
|
|
18
|
+
|
|
12
19
|
## Sponsors
|
|
13
20
|
|
|
14
21
|
<a href="https://www.finterion.com/" target="_blank">
|
|
15
22
|
<picture style="height: 30px;">
|
|
16
23
|
<source media="(prefers-color-scheme: dark)" srcset="static/sponsors/finterion-dark.png">
|
|
17
24
|
<source media="(prefers-color-scheme: light)" srcset="static/sponsors/finterion-light.png">
|
|
18
|
-
<img src="static/sponsors/finterion-light.
|
|
25
|
+
<img src="static/sponsors/finterion-light.png" alt="Finterion Logo" width="200px" height="50px">
|
|
19
26
|
</picture>
|
|
20
27
|
</a>
|
|
21
28
|
|
|
@@ -66,17 +73,30 @@ This will create:
|
|
|
66
73
|
---
|
|
67
74
|
|
|
68
75
|
## 📈 Example: A Simple Trading Bot
|
|
69
|
-
The following example
|
|
76
|
+
The following example trading bot implements a simple moving average strategy.
|
|
77
|
+
The strategy will use data from bitvavo exchange and will calculate
|
|
78
|
+
the 20, 50 and 100 period exponential moving averages (EMA) and the
|
|
79
|
+
14 period relative strength index (RSI).
|
|
80
|
+
|
|
81
|
+
> This example uses [PyIndicators](https://github.com/coding-kitties/pyindicators) for technical analysis.
|
|
82
|
+
> This dependency is not part of the framework, but is used to perform technical analysis on the dataframes.
|
|
83
|
+
> You can install it using pip: pip install pyindicators.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
70
86
|
|
|
71
87
|
```python
|
|
72
88
|
import logging.config
|
|
73
89
|
from dotenv import load_dotenv
|
|
74
90
|
|
|
75
|
-
from
|
|
76
|
-
|
|
91
|
+
from pyindicators import ema, rsi
|
|
92
|
+
|
|
93
|
+
from investing_algorithm_framework import create_app, TimeUnit, Context, BacktestDateRange, \
|
|
94
|
+
CCXTOHLCVMarketDataSource, CCXTTickerMarketDataSource, DEFAULT_LOGGING_CONFIG, \
|
|
95
|
+
TradingStrategy, SnapshotInterval, convert_polars_to_pandas
|
|
77
96
|
|
|
78
97
|
load_dotenv()
|
|
79
98
|
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|
|
99
|
+
logger = logging.getLogger(__name__)
|
|
80
100
|
|
|
81
101
|
# OHLCV data for candles
|
|
82
102
|
bitvavo_btc_eur_ohlcv_2h = CCXTOHLCVMarketDataSource(
|
|
@@ -97,24 +117,64 @@ app = create_app()
|
|
|
97
117
|
# Registered bitvavo market, credentials are read from .env file by default
|
|
98
118
|
app.add_market(market="BITVAVO", trading_symbol="EUR", initial_balance=100)
|
|
99
119
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
time_unit=TimeUnit.
|
|
103
|
-
|
|
104
|
-
|
|
120
|
+
class MyStrategy(TradingStrategy):
|
|
121
|
+
interval = 2
|
|
122
|
+
time_unit = TimeUnit.HOUR
|
|
123
|
+
data_sources = [bitvavo_btc_eur_ohlcv_2h, bitvavo_btc_eur_ticker]
|
|
124
|
+
|
|
125
|
+
def run_strategy(self, context: Context, market_data):
|
|
126
|
+
|
|
127
|
+
if context.has_open_orders(target_symbol="BTC"):
|
|
128
|
+
logger.info("There are open orders, skipping strategy iteration.")
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
print(market_data)
|
|
132
|
+
|
|
133
|
+
data = convert_polars_to_pandas(market_data["BTC-ohlcv"])
|
|
134
|
+
data = ema(data, source_column="Close", period=20, result_column="ema_20")
|
|
135
|
+
data = ema(data, source_column="Close", period=50, result_column="ema_50")
|
|
136
|
+
data = ema(data, source_column="Close", period=100, result_column="ema_100")
|
|
137
|
+
data = rsi(data, source_column="Close", period=14, result_column="rsi_14")
|
|
138
|
+
|
|
139
|
+
if context.has_position("BTC") and self.sell_signal(data):
|
|
140
|
+
context.create_limit_sell_order(
|
|
141
|
+
"BTC", percentage_of_position=100, price=data["Close"].iloc[-1]
|
|
142
|
+
)
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
if not context.has_position("BTC") and self.buy_signal(data):
|
|
146
|
+
context.create_limit_buy_order(
|
|
147
|
+
"BTC", percentage_of_portfolio=20, price=data["Close"].iloc[-1]
|
|
148
|
+
)
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
def buy_signal(self, data):
|
|
152
|
+
if len(data) < 100:
|
|
153
|
+
return False
|
|
154
|
+
last_row = data.iloc[-1]
|
|
155
|
+
if last_row["ema_20"] > last_row["ema_50"] and last_row["ema_50"] > last_row["ema_100"]:
|
|
156
|
+
return True
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
def sell_signal(self, data):
|
|
160
|
+
|
|
161
|
+
if data["ema_20"].iloc[-1] < data["ema_50"].iloc[-1] and \
|
|
162
|
+
data["ema_20"].iloc[-2] >= data["ema_50"].iloc[-2]:
|
|
163
|
+
return True
|
|
164
|
+
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
date_range = BacktestDateRange(
|
|
168
|
+
start_date="2023-08-24 00:00:00", end_date="2023-12-02 00:00:00"
|
|
105
169
|
)
|
|
106
|
-
|
|
107
|
-
# Access the data sources with the indentifier
|
|
108
|
-
polars_df = market_data["BTC-ohlcv"]
|
|
109
|
-
ticker_data = market_data["BTC-ticker"]
|
|
110
|
-
unallocated_balance = context.get_unallocated()
|
|
111
|
-
positions = context.get_positions()
|
|
112
|
-
trades = context.get_trades()
|
|
113
|
-
open_trades = context.get_open_trades()
|
|
114
|
-
closed_trades = context.get_closed_trades()
|
|
170
|
+
app.add_strategy(MyStrategy)
|
|
115
171
|
|
|
116
172
|
if __name__ == "__main__":
|
|
117
|
-
|
|
173
|
+
# Run the backtest with a daily snapshot interval for end-of-day granular reporting
|
|
174
|
+
backtest_report = app.run_backtest(
|
|
175
|
+
backtest_date_range=date_range, initial_amount=100, snapshot_interval=SnapshotInterval.STRATEGY_ITERATION
|
|
176
|
+
)
|
|
177
|
+
backtest_report.show()
|
|
118
178
|
```
|
|
119
179
|
|
|
120
180
|
> You can find more examples [here](./examples) folder.
|
|
@@ -1,38 +1,29 @@
|
|
|
1
1
|
from investing_algorithm_framework.app import App, Algorithm, \
|
|
2
|
-
TradingStrategy, StatelessAction, Task, AppHook, Context
|
|
2
|
+
TradingStrategy, StatelessAction, Task, AppHook, Context, \
|
|
3
|
+
add_html_report, add_metrics, BacktestReport, \
|
|
4
|
+
BacktestReportsEvaluation, pretty_print_trades, pretty_print_positions, \
|
|
5
|
+
pretty_print_orders, pretty_print_backtest
|
|
3
6
|
from investing_algorithm_framework.domain import ApiException, \
|
|
4
7
|
TradingDataType, TradingTimeFrame, OrderType, OperationalException, \
|
|
5
8
|
OrderStatus, OrderSide, TimeUnit, TimeInterval, Order, Portfolio, \
|
|
6
9
|
Position, TimeFrame, BACKTESTING_INDEX_DATETIME, MarketCredential, \
|
|
7
|
-
PortfolioConfiguration, RESOURCE_DIRECTORY,
|
|
10
|
+
PortfolioConfiguration, RESOURCE_DIRECTORY, \
|
|
8
11
|
Trade, OHLCVMarketDataSource, OrderBookMarketDataSource, SYMBOLS, \
|
|
9
|
-
TickerMarketDataSource, MarketService,
|
|
10
|
-
pretty_print_backtest_reports_evaluation, load_backtest_reports, \
|
|
12
|
+
TickerMarketDataSource, MarketService, \
|
|
11
13
|
RESERVED_BALANCES, APP_MODE, AppMode, DATETIME_FORMAT, \
|
|
12
|
-
|
|
13
|
-
DateRange,
|
|
14
|
-
|
|
15
|
-
APPLICATION_DIRECTORY,
|
|
16
|
-
|
|
17
|
-
SnapshotInterval
|
|
14
|
+
BacktestDateRange, convert_polars_to_pandas, \
|
|
15
|
+
DateRange, DEFAULT_LOGGING_CONFIG, \
|
|
16
|
+
BacktestResult, TradeStatus, MarketDataType, TradeRiskType, \
|
|
17
|
+
APPLICATION_DIRECTORY, DataSource, OrderExecutor, PortfolioProvider, \
|
|
18
|
+
SnapshotInterval, AWS_S3_STATE_BUCKET_NAME
|
|
18
19
|
from investing_algorithm_framework.infrastructure import \
|
|
19
20
|
CCXTOrderBookMarketDataSource, CCXTOHLCVMarketDataSource, \
|
|
20
21
|
CCXTTickerMarketDataSource, CSVOHLCVMarketDataSource, \
|
|
21
22
|
CSVTickerMarketDataSource, AzureBlobStorageStateHandler, \
|
|
22
|
-
PandasOHLCVBacktestMarketDataSource, PandasOHLCVMarketDataSource
|
|
23
|
+
PandasOHLCVBacktestMarketDataSource, PandasOHLCVMarketDataSource, \
|
|
24
|
+
AWSS3StorageStateHandler
|
|
23
25
|
from .create_app import create_app
|
|
24
26
|
from .download_data import download
|
|
25
|
-
from .overfitting import create_ohlcv_shuffle_permutation, \
|
|
26
|
-
create_ohlcv_shuffle_returns_and_reconstruct_permutation, \
|
|
27
|
-
create_ohlcv_shuffle_block_permutation
|
|
28
|
-
from .metrics import get_volatility, get_sortino_ratio, get_profit_factor, \
|
|
29
|
-
get_cumulative_profit_factor_series, get_rolling_profit_factor_series, \
|
|
30
|
-
get_sharpe_ratio, get_price_efficiency_ratio, get_equity_curve, \
|
|
31
|
-
get_drawdown_series, get_max_drawdown, get_cagr, \
|
|
32
|
-
get_standard_deviation_returns, get_standard_deviation_downside_returns, \
|
|
33
|
-
get_max_drawdown_absolute, get_exposure_time, get_average_trade_duration, \
|
|
34
|
-
get_net_profit, get_win_rate, get_win_loss_ratio, get_calmar_ratio, \
|
|
35
|
-
get_trade_frequency
|
|
36
27
|
|
|
37
28
|
__all__ = [
|
|
38
29
|
"Algorithm",
|
|
@@ -70,19 +61,16 @@ __all__ = [
|
|
|
70
61
|
"MarketCredential",
|
|
71
62
|
"MarketService",
|
|
72
63
|
"OperationalException",
|
|
73
|
-
"pretty_print_backtest_reports_evaluation",
|
|
74
64
|
"BacktestReportsEvaluation",
|
|
75
|
-
"load_backtest_reports",
|
|
76
65
|
"SYMBOLS",
|
|
77
66
|
"RESERVED_BALANCES",
|
|
78
67
|
"APP_MODE",
|
|
79
68
|
"AppMode",
|
|
80
69
|
"DATETIME_FORMAT",
|
|
81
|
-
"
|
|
70
|
+
"BacktestResult",
|
|
82
71
|
"BacktestDateRange",
|
|
83
72
|
"convert_polars_to_pandas",
|
|
84
73
|
"DateRange",
|
|
85
|
-
"get_backtest_report",
|
|
86
74
|
"AzureBlobStorageStateHandler",
|
|
87
75
|
"DEFAULT_LOGGING_CONFIG",
|
|
88
76
|
"BacktestReport",
|
|
@@ -98,31 +86,11 @@ __all__ = [
|
|
|
98
86
|
"DataSource",
|
|
99
87
|
"OrderExecutor",
|
|
100
88
|
"PortfolioProvider",
|
|
101
|
-
"get_profit_factor",
|
|
102
|
-
"get_cumulative_profit_factor_series",
|
|
103
|
-
"get_rolling_profit_factor_series",
|
|
104
|
-
"get_sharpe_ratio",
|
|
105
|
-
"get_price_efficiency_ratio",
|
|
106
|
-
"get_equity_curve",
|
|
107
|
-
"get_drawdown_series",
|
|
108
|
-
"get_max_drawdown",
|
|
109
|
-
"create_ohlcv_shuffle_permutation",
|
|
110
|
-
"create_ohlcv_shuffle_returns_and_reconstruct_permutation",
|
|
111
|
-
"create_ohlcv_shuffle_block_permutation",
|
|
112
89
|
"PandasOHLCVBacktestMarketDataSource",
|
|
113
90
|
"PandasOHLCVMarketDataSource",
|
|
114
|
-
"get_volatility",
|
|
115
|
-
"get_sortino_ratio",
|
|
116
|
-
"get_cagr",
|
|
117
|
-
"get_standard_deviation_returns",
|
|
118
|
-
"get_standard_deviation_downside_returns",
|
|
119
91
|
"SnapshotInterval",
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"get_win_rate",
|
|
125
|
-
"get_win_loss_ratio",
|
|
126
|
-
"get_calmar_ratio",
|
|
127
|
-
"get_trade_frequency",
|
|
92
|
+
"add_metrics",
|
|
93
|
+
"add_html_report",
|
|
94
|
+
"AWSS3StorageStateHandler",
|
|
95
|
+
"AWS_S3_STATE_BUCKET_NAME"
|
|
128
96
|
]
|
|
@@ -5,6 +5,9 @@ from investing_algorithm_framework.app.task import Task
|
|
|
5
5
|
from investing_algorithm_framework.app.web import create_flask_app
|
|
6
6
|
from .algorithm import Algorithm
|
|
7
7
|
from .context import Context
|
|
8
|
+
from .reporting import add_html_report, add_metrics, \
|
|
9
|
+
BacktestReport, pretty_print_backtest, BacktestReportsEvaluation, \
|
|
10
|
+
pretty_print_trades, pretty_print_positions, pretty_print_orders
|
|
8
11
|
|
|
9
12
|
|
|
10
13
|
__all__ = [
|
|
@@ -16,4 +19,12 @@ __all__ = [
|
|
|
16
19
|
"Task",
|
|
17
20
|
"AppHook",
|
|
18
21
|
"Context",
|
|
22
|
+
"add_html_report",
|
|
23
|
+
"add_metrics",
|
|
24
|
+
"BacktestReport",
|
|
25
|
+
"pretty_print_backtest",
|
|
26
|
+
"BacktestReportsEvaluation",
|
|
27
|
+
"pretty_print_trades",
|
|
28
|
+
"pretty_print_positions",
|
|
29
|
+
"pretty_print_orders"
|
|
19
30
|
]
|
|
@@ -16,16 +16,18 @@ from investing_algorithm_framework.app.web import create_flask_app
|
|
|
16
16
|
from investing_algorithm_framework.domain import DATABASE_NAME, TimeUnit, \
|
|
17
17
|
DATABASE_DIRECTORY_PATH, RESOURCE_DIRECTORY, ENVIRONMENT, Environment, \
|
|
18
18
|
SQLALCHEMY_DATABASE_URI, OperationalException, StateHandler, \
|
|
19
|
-
BACKTESTING_START_DATE, BACKTESTING_END_DATE,
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
BACKTESTING_START_DATE, BACKTESTING_END_DATE, APP_MODE, MarketCredential, \
|
|
20
|
+
AppMode, BacktestDateRange, DATABASE_DIRECTORY_NAME, \
|
|
21
|
+
BACKTESTING_INITIAL_AMOUNT, SNAPSHOT_INTERVAL, \
|
|
22
22
|
MarketDataSource, PortfolioConfiguration, SnapshotInterval, \
|
|
23
23
|
PortfolioProvider, OrderExecutor, ImproperlyConfigured
|
|
24
24
|
from investing_algorithm_framework.infrastructure import setup_sqlalchemy, \
|
|
25
25
|
create_all_tables, CCXTOrderExecutor, CCXTPortfolioProvider
|
|
26
26
|
from investing_algorithm_framework.services import OrderBacktestService, \
|
|
27
|
-
BacktestMarketDataSourceService, BacktestPortfolioService
|
|
27
|
+
BacktestMarketDataSourceService, BacktestPortfolioService, \
|
|
28
|
+
BacktestService
|
|
28
29
|
from .app_hook import AppHook
|
|
30
|
+
from .reporting import BacktestReport
|
|
29
31
|
|
|
30
32
|
logger = logging.getLogger("investing_algorithm_framework")
|
|
31
33
|
COLOR_RESET = '\033[0m'
|
|
@@ -426,6 +428,7 @@ class App:
|
|
|
426
428
|
Returns:
|
|
427
429
|
None
|
|
428
430
|
"""
|
|
431
|
+
strategy_orchestrator_service = None
|
|
429
432
|
|
|
430
433
|
try:
|
|
431
434
|
configuration_service = self.container.configuration_service()
|
|
@@ -466,6 +469,8 @@ class App:
|
|
|
466
469
|
data_sources=self._market_data_sources,
|
|
467
470
|
on_strategy_run_hooks=self._on_strategy_run_hooks,
|
|
468
471
|
)
|
|
472
|
+
self.initialize_data_sources(algorithm)
|
|
473
|
+
|
|
469
474
|
strategy_orchestrator_service = \
|
|
470
475
|
self.container.strategy_orchestrator_service()
|
|
471
476
|
strategy_orchestrator_service.initialize(algorithm)
|
|
@@ -709,8 +714,10 @@ class App:
|
|
|
709
714
|
algorithm=None,
|
|
710
715
|
strategy=None,
|
|
711
716
|
strategies: List = None,
|
|
712
|
-
save_strategy=
|
|
713
|
-
snapshot_interval: SnapshotInterval = SnapshotInterval.TRADE_CLOSE
|
|
717
|
+
save_strategy=True,
|
|
718
|
+
snapshot_interval: SnapshotInterval = SnapshotInterval.TRADE_CLOSE,
|
|
719
|
+
strategy_directory_path: Optional[str] = None,
|
|
720
|
+
report_name: Optional[str] = None
|
|
714
721
|
) -> BacktestReport:
|
|
715
722
|
"""
|
|
716
723
|
Run a backtest for an algorithm.
|
|
@@ -738,6 +745,15 @@ class App:
|
|
|
738
745
|
how often the portfolio snapshot should be taken during the
|
|
739
746
|
backtest. The default is TRADE_CLOSE, which means that the
|
|
740
747
|
portfolio snapshot will be taken at the end of each trade.
|
|
748
|
+
strategy_directory_path (Optional[str]): The directory path
|
|
749
|
+
where the strategy is located. This is used to save the
|
|
750
|
+
strategy if save_strategy is True. If not provided,
|
|
751
|
+
the framework tries to determine the path via the
|
|
752
|
+
algorithm or strategy object.
|
|
753
|
+
report_name (Optional[str]): The name of the report. If not
|
|
754
|
+
provided, the framework will generate a name based on the
|
|
755
|
+
algorithm name and the backtest date range and the current
|
|
756
|
+
date and time.
|
|
741
757
|
|
|
742
758
|
Returns:
|
|
743
759
|
Instance of BacktestReport
|
|
@@ -780,7 +796,6 @@ class App:
|
|
|
780
796
|
on_strategy_run_hooks=self._on_strategy_run_hooks,
|
|
781
797
|
)
|
|
782
798
|
self.initialize_data_sources(algorithm)
|
|
783
|
-
|
|
784
799
|
strategy_orchestrator_service = \
|
|
785
800
|
self.container.strategy_orchestrator_service()
|
|
786
801
|
strategy_orchestrator_service.initialize(algorithm)
|
|
@@ -801,19 +816,37 @@ class App:
|
|
|
801
816
|
|
|
802
817
|
# Run the backtest with the backtest_service and collect and
|
|
803
818
|
# save the report
|
|
804
|
-
|
|
819
|
+
results = backtest_service.run_backtest(
|
|
805
820
|
algorithm=algorithm,
|
|
806
821
|
context=context,
|
|
807
822
|
strategy_orchestrator_service=strategy_orchestrator_service,
|
|
808
823
|
initial_amount=initial_amount,
|
|
809
824
|
backtest_date_range=backtest_date_range
|
|
810
825
|
)
|
|
811
|
-
|
|
812
|
-
|
|
826
|
+
report = BacktestReport(results=results)
|
|
827
|
+
|
|
828
|
+
if output_directory is None:
|
|
829
|
+
output_directory = os.path.join(
|
|
830
|
+
config[RESOURCE_DIRECTORY], "backtest_reports"
|
|
831
|
+
)
|
|
832
|
+
|
|
833
|
+
if report_name is None:
|
|
834
|
+
report_name = BacktestService.create_report_directory_name(report)
|
|
835
|
+
|
|
836
|
+
output_directory = os.path.join(output_directory, report_name)
|
|
837
|
+
report.save(
|
|
838
|
+
path=output_directory,
|
|
813
839
|
algorithm=algorithm,
|
|
814
|
-
|
|
815
|
-
save_strategy=save_strategy
|
|
840
|
+
strategy_directory_path=strategy_directory_path,
|
|
841
|
+
save_strategy=save_strategy
|
|
816
842
|
)
|
|
843
|
+
# print(report.html_report)
|
|
844
|
+
# backtest_service.save_report(
|
|
845
|
+
# report=report,
|
|
846
|
+
# algorithm=algorithm,
|
|
847
|
+
# output_directory=output_directory,
|
|
848
|
+
# save_strategy=save_strategy,
|
|
849
|
+
# )
|
|
817
850
|
return report
|
|
818
851
|
|
|
819
852
|
def run_backtests(
|
|
@@ -1154,6 +1187,8 @@ class App:
|
|
|
1154
1187
|
None
|
|
1155
1188
|
"""
|
|
1156
1189
|
|
|
1190
|
+
logger.info("Adding strategy")
|
|
1191
|
+
|
|
1157
1192
|
if inspect.isclass(strategy):
|
|
1158
1193
|
|
|
1159
1194
|
if not issubclass(strategy, TradingStrategy):
|
|
@@ -1187,6 +1222,7 @@ class App:
|
|
|
1187
1222
|
)
|
|
1188
1223
|
|
|
1189
1224
|
if strategy.market_data_sources is not None:
|
|
1225
|
+
logger.info("Adding market data sources from strategy")
|
|
1190
1226
|
self.add_data_sources(strategy.market_data_sources)
|
|
1191
1227
|
|
|
1192
1228
|
self._strategies.append(strategy)
|