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