investing-algorithm-framework 7.4.1__tar.gz → 7.5.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.4.1 → investing_algorithm_framework-7.5.0}/PKG-INFO +1 -1
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/__init__.py +3 -2
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/__init__.py +3 -2
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/__init__.py +3 -1
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +5 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +22 -1
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/backtesting/combine_backtests.py +211 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/pyproject.toml +1 -1
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/LICENSE +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/README.md +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/strategy.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.1 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
|
@@ -8,7 +8,7 @@ from .app import App, Algorithm, \
|
|
|
8
8
|
get_monthly_returns_heatmap_chart, create_weights, \
|
|
9
9
|
get_yearly_returns_bar_chart, get_entry_and_exit_signals, \
|
|
10
10
|
get_ohlcv_data_completeness_chart
|
|
11
|
-
from .domain import ApiException, \
|
|
11
|
+
from .domain import ApiException, combine_backtests, \
|
|
12
12
|
OrderType, OperationalException, OrderStatus, OrderSide, \
|
|
13
13
|
TimeUnit, TimeInterval, Order, Portfolio, Backtest, \
|
|
14
14
|
Position, TimeFrame, INDEX_DATETIME, MarketCredential, \
|
|
@@ -163,5 +163,6 @@ __all__ = [
|
|
|
163
163
|
"get_entry_and_exit_signals",
|
|
164
164
|
"get_growth",
|
|
165
165
|
"get_growth_percentage",
|
|
166
|
-
"BacktestEvaluationFocus"
|
|
166
|
+
"BacktestEvaluationFocus",
|
|
167
|
+
"combine_backtests",
|
|
167
168
|
]
|
|
@@ -34,7 +34,7 @@ from .utils import random_string, append_dict_as_row_to_csv, \
|
|
|
34
34
|
csv_to_list, StoppableThread, load_csv_into_dict, tqdm, \
|
|
35
35
|
is_timezone_aware, sync_timezones, get_timezone
|
|
36
36
|
from .backtesting import BacktestRun, BacktestSummaryMetrics, \
|
|
37
|
-
BacktestDateRange, Backtest, BacktestMetrics, \
|
|
37
|
+
BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
|
|
38
38
|
BacktestPermutationTest, BacktestEvaluationFocus
|
|
39
39
|
|
|
40
40
|
__all__ = [
|
|
@@ -140,5 +140,6 @@ __all__ = [
|
|
|
140
140
|
"is_jupyter_notebook",
|
|
141
141
|
"tqdm",
|
|
142
142
|
"DEFAULT_DATETIME_FORMAT",
|
|
143
|
-
"BacktestEvaluationFocus"
|
|
143
|
+
"BacktestEvaluationFocus",
|
|
144
|
+
'combine_backtests'
|
|
144
145
|
]
|
|
@@ -5,6 +5,7 @@ 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
9
|
|
|
9
10
|
__all__ = [
|
|
10
11
|
"Backtest",
|
|
@@ -13,5 +14,6 @@ __all__ = [
|
|
|
13
14
|
"BacktestMetrics",
|
|
14
15
|
"BacktestRun",
|
|
15
16
|
"BacktestPermutationTest",
|
|
16
|
-
"BacktestEvaluationFocus"
|
|
17
|
+
"BacktestEvaluationFocus",
|
|
18
|
+
"combine_backtests"
|
|
17
19
|
]
|
|
@@ -165,6 +165,11 @@ class BacktestMetrics:
|
|
|
165
165
|
best_year: Tuple[float, date] = None
|
|
166
166
|
worst_month: Tuple[float, datetime] = None
|
|
167
167
|
worst_year: Tuple[float, date] = None
|
|
168
|
+
total_number_of_days: int = None
|
|
169
|
+
|
|
170
|
+
def __post_init__(self):
|
|
171
|
+
self.total_number_of_days = (self.backtest_end_date -
|
|
172
|
+
self.backtest_start_date).days
|
|
168
173
|
|
|
169
174
|
def to_dict(self) -> dict:
|
|
170
175
|
"""
|
|
@@ -20,9 +20,18 @@ class BacktestSummaryMetrics:
|
|
|
20
20
|
total_net_gain (float): Total net gain from the backtest.
|
|
21
21
|
total_net_gain_percentage (float): Total net gain percentage
|
|
22
22
|
from the backtest.
|
|
23
|
+
average_total_net_gain (float): Average total net gain across
|
|
24
|
+
multiple backtests.
|
|
25
|
+
average_total_net_gain_percentage (float): Average total net gain
|
|
26
|
+
percentage across multiple backtests.
|
|
23
27
|
gross_loss (float): Total gross loss from all trades.
|
|
28
|
+
average_gross_loss (float): Average gross loss across
|
|
29
|
+
multiple backtests.
|
|
24
30
|
growth (float): Total growth from the backtest.
|
|
25
31
|
growth_percentage (float): Total growth percentage from the backtest.
|
|
32
|
+
average_growth (float): Average growth across multiple backtests.
|
|
33
|
+
average_growth_percentage (float): Average growth percentage across
|
|
34
|
+
multiple backtests.
|
|
26
35
|
trades_average_return (float): Average return per trade.
|
|
27
36
|
cagr (float): Compound annual growth rate of the backtest.
|
|
28
37
|
sharpe_ratio (float): Sharpe ratio, risk-adjusted return.
|
|
@@ -41,9 +50,14 @@ class BacktestSummaryMetrics:
|
|
|
41
50
|
"""
|
|
42
51
|
total_net_gain: float = None
|
|
43
52
|
total_net_gain_percentage: float = None
|
|
53
|
+
average_total_net_gain: float = None
|
|
54
|
+
average_total_net_gain_percentage: float = None
|
|
44
55
|
gross_loss: float = None
|
|
56
|
+
average_gross_loss: float = None
|
|
45
57
|
growth: float = None
|
|
46
58
|
growth_percentage: float = None
|
|
59
|
+
average_growth: float = None
|
|
60
|
+
average_growth_percentage: float = None
|
|
47
61
|
trades_average_return: float = None
|
|
48
62
|
cagr: float = None
|
|
49
63
|
sharpe_ratio: float = None
|
|
@@ -67,9 +81,15 @@ class BacktestSummaryMetrics:
|
|
|
67
81
|
return {
|
|
68
82
|
"total_net_gain": self.total_net_gain,
|
|
69
83
|
"total_net_gain_percentage": self.total_net_gain_percentage,
|
|
84
|
+
"average_total_net_gain": self.average_total_net_gain,
|
|
85
|
+
"average_total_net_gain_percentage":
|
|
86
|
+
self.average_total_net_gain_percentage,
|
|
70
87
|
"gross_loss": self.gross_loss,
|
|
88
|
+
"average_gross_loss": self.average_gross_loss,
|
|
71
89
|
"growth": self.growth,
|
|
72
90
|
"growth_percentage": self.growth_percentage,
|
|
91
|
+
"average_growth": self.average_growth,
|
|
92
|
+
"average_growth_percentage": self.average_growth_percentage,
|
|
73
93
|
"trades_average_return": self.trades_average_return,
|
|
74
94
|
"cagr": self.cagr,
|
|
75
95
|
"sharpe_ratio": self.sharpe_ratio,
|
|
@@ -120,7 +140,8 @@ class BacktestSummaryMetrics:
|
|
|
120
140
|
self.cumulative_exposure = other.cumulative_exposure
|
|
121
141
|
else:
|
|
122
142
|
self.cumulative_exposure = safe_mean(
|
|
123
|
-
self.cumulative_exposure,
|
|
143
|
+
self.cumulative_exposure,
|
|
144
|
+
other.cumulative_exposure
|
|
124
145
|
)
|
|
125
146
|
|
|
126
147
|
if self.exposure_ratio is None:
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from investing_algorithm_framework.domain.backtesting import Backtest, \
|
|
4
|
+
BacktestDateRange
|
|
5
|
+
from investing_algorithm_framework.domain.backtesting import \
|
|
6
|
+
BacktestSummaryMetrics
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def safe_weighted_mean(values, weights):
|
|
10
|
+
"""
|
|
11
|
+
Calculate the weighted mean of a list of values,
|
|
12
|
+
ignoring None values and weights <= 0.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
values (List[float | None]): List of values to average.
|
|
16
|
+
weights (List[float | None]): Corresponding weights for the values.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
float | None: The weighted mean, or None if no valid values.
|
|
20
|
+
"""
|
|
21
|
+
vals = [(v, w) for v, w in zip(values, weights) if
|
|
22
|
+
v is not None and w is not None and w > 0]
|
|
23
|
+
if not vals:
|
|
24
|
+
return None
|
|
25
|
+
total_weight = sum(w for _, w in vals)
|
|
26
|
+
return sum(
|
|
27
|
+
v * w for v, w in vals
|
|
28
|
+
) / total_weight if total_weight > 0 else None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def combine_backtests(
|
|
32
|
+
backtests: List[Backtest],
|
|
33
|
+
backtest_date_range: BacktestDateRange = None
|
|
34
|
+
) -> Backtest:
|
|
35
|
+
"""
|
|
36
|
+
Combine multiple backtests into a single backtest by aggregating
|
|
37
|
+
their results.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
backtests (List[Backtest]): List of Backtest instances to combine.
|
|
41
|
+
backtest_date_range (BacktestDateRange, optional): The date range
|
|
42
|
+
for the combined backtest.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Backtest: A new Backtest instance representing the combined results.
|
|
46
|
+
"""
|
|
47
|
+
backtest_metrics = []
|
|
48
|
+
backtest_runs = []
|
|
49
|
+
|
|
50
|
+
for backtest in backtests:
|
|
51
|
+
backtest_metric = None
|
|
52
|
+
backtest_run = None
|
|
53
|
+
|
|
54
|
+
if backtest_date_range is not None:
|
|
55
|
+
backtest_metric = \
|
|
56
|
+
backtest.get_backtest_metrics(backtest_date_range)
|
|
57
|
+
backtest_run = \
|
|
58
|
+
backtest.get_backtest_run(backtest_date_range)
|
|
59
|
+
else:
|
|
60
|
+
backtest_run = backtest.backtest_runs[0] \
|
|
61
|
+
if len(backtest.backtest_runs) > 0 else None
|
|
62
|
+
|
|
63
|
+
if backtest_run is not None:
|
|
64
|
+
backtest_metric = backtest_run.backtest_metrics
|
|
65
|
+
|
|
66
|
+
if backtest_metric is not None:
|
|
67
|
+
backtest_metrics.append(backtest_metric)
|
|
68
|
+
backtest_runs.append(backtest_run)
|
|
69
|
+
|
|
70
|
+
total_net_gain = sum(
|
|
71
|
+
b.total_net_gain for b in backtest_metrics
|
|
72
|
+
if b.total_net_gain is not None
|
|
73
|
+
)
|
|
74
|
+
average_total_net_gain = safe_weighted_mean(
|
|
75
|
+
[b.total_net_gain for b in backtest_metrics],
|
|
76
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
77
|
+
)
|
|
78
|
+
average_total_net_gain_percentage = safe_weighted_mean(
|
|
79
|
+
[b.total_net_gain_percentage for b in backtest_metrics],
|
|
80
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
81
|
+
)
|
|
82
|
+
total_net_gain_percentage = sum(
|
|
83
|
+
b.total_net_gain_percentage for b in backtest_metrics
|
|
84
|
+
if b.total_net_gain_percentage is not None
|
|
85
|
+
)
|
|
86
|
+
gross_loss = sum(
|
|
87
|
+
b.gross_loss for b in backtest_metrics
|
|
88
|
+
if b.gross_loss is not None
|
|
89
|
+
)
|
|
90
|
+
average_gross_loss = safe_weighted_mean(
|
|
91
|
+
[b.gross_loss for b in backtest_metrics],
|
|
92
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
93
|
+
)
|
|
94
|
+
growth = sum(
|
|
95
|
+
b.growth for b in backtest_metrics
|
|
96
|
+
if b.growth is not None
|
|
97
|
+
)
|
|
98
|
+
growth_percentage = sum(
|
|
99
|
+
b.growth_percentage for b in backtest_metrics
|
|
100
|
+
if b.growth_percentage is not None
|
|
101
|
+
)
|
|
102
|
+
average_growth = safe_weighted_mean(
|
|
103
|
+
[b.growth for b in backtest_metrics],
|
|
104
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
105
|
+
)
|
|
106
|
+
average_growth_percentage = safe_weighted_mean(
|
|
107
|
+
[b.growth_percentage for b in backtest_metrics],
|
|
108
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
109
|
+
)
|
|
110
|
+
trades_average_return = safe_weighted_mean(
|
|
111
|
+
[b.trades_average_return for b in backtest_metrics],
|
|
112
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
113
|
+
)
|
|
114
|
+
cagr = safe_weighted_mean(
|
|
115
|
+
[b.cagr for b in backtest_metrics],
|
|
116
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
117
|
+
)
|
|
118
|
+
sharp_ratio = safe_weighted_mean(
|
|
119
|
+
[b.sharpe_ratio for b in backtest_metrics],
|
|
120
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
121
|
+
)
|
|
122
|
+
sortino_ratio = safe_weighted_mean(
|
|
123
|
+
[b.sortino_ratio for b in backtest_metrics],
|
|
124
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
125
|
+
)
|
|
126
|
+
calmar_ratio = safe_weighted_mean(
|
|
127
|
+
[b.calmar_ratio for b in backtest_metrics],
|
|
128
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
129
|
+
)
|
|
130
|
+
profit_factor = safe_weighted_mean(
|
|
131
|
+
[b.profit_factor for b in backtest_metrics],
|
|
132
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
133
|
+
)
|
|
134
|
+
annual_volatility = safe_weighted_mean(
|
|
135
|
+
[b.annual_volatility for b in backtest_metrics],
|
|
136
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
137
|
+
)
|
|
138
|
+
max_drawdown = max(
|
|
139
|
+
(b.max_drawdown for b in backtest_metrics
|
|
140
|
+
if b.max_drawdown is not None), default=None
|
|
141
|
+
)
|
|
142
|
+
max_drawdown_duration = max(
|
|
143
|
+
(b.max_drawdown_duration for b in backtest_metrics
|
|
144
|
+
if b.max_drawdown_duration is not None), default=None
|
|
145
|
+
)
|
|
146
|
+
trades_per_year = safe_weighted_mean(
|
|
147
|
+
[b.trades_per_year for b in backtest_metrics],
|
|
148
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
149
|
+
)
|
|
150
|
+
win_rate = safe_weighted_mean(
|
|
151
|
+
[b.win_rate for b in backtest_metrics],
|
|
152
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
153
|
+
)
|
|
154
|
+
win_loss_ratio = safe_weighted_mean(
|
|
155
|
+
[b.win_loss_ratio for b in backtest_metrics],
|
|
156
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
157
|
+
)
|
|
158
|
+
number_of_trades = sum(
|
|
159
|
+
b.number_of_trades for b in backtest_metrics
|
|
160
|
+
if b.number_of_trades is not None
|
|
161
|
+
)
|
|
162
|
+
cumulative_exposure = safe_weighted_mean(
|
|
163
|
+
[b.cumulative_exposure for b in backtest_metrics],
|
|
164
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
165
|
+
)
|
|
166
|
+
exposure_ratio = safe_weighted_mean(
|
|
167
|
+
[b.exposure_ratio for b in backtest_metrics],
|
|
168
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
169
|
+
)
|
|
170
|
+
summary = BacktestSummaryMetrics(
|
|
171
|
+
total_net_gain=total_net_gain,
|
|
172
|
+
total_net_gain_percentage=total_net_gain_percentage,
|
|
173
|
+
average_total_net_gain=average_total_net_gain,
|
|
174
|
+
average_total_net_gain_percentage=average_total_net_gain_percentage,
|
|
175
|
+
gross_loss=gross_loss,
|
|
176
|
+
average_gross_loss=average_gross_loss,
|
|
177
|
+
growth=growth,
|
|
178
|
+
growth_percentage=growth_percentage,
|
|
179
|
+
average_growth=average_growth,
|
|
180
|
+
average_growth_percentage=average_growth_percentage,
|
|
181
|
+
trades_average_return=trades_average_return,
|
|
182
|
+
cagr=cagr,
|
|
183
|
+
sharpe_ratio=sharp_ratio,
|
|
184
|
+
sortino_ratio=sortino_ratio,
|
|
185
|
+
calmar_ratio=calmar_ratio,
|
|
186
|
+
profit_factor=profit_factor,
|
|
187
|
+
annual_volatility=annual_volatility,
|
|
188
|
+
max_drawdown=max_drawdown,
|
|
189
|
+
max_drawdown_duration=max_drawdown_duration,
|
|
190
|
+
trades_per_year=trades_per_year,
|
|
191
|
+
win_rate=win_rate,
|
|
192
|
+
win_loss_ratio=win_loss_ratio,
|
|
193
|
+
number_of_trades=number_of_trades,
|
|
194
|
+
cumulative_exposure=cumulative_exposure,
|
|
195
|
+
exposure_ratio=exposure_ratio
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
metadata = None
|
|
199
|
+
|
|
200
|
+
# Get first non-empty metadata
|
|
201
|
+
for backtest in backtests:
|
|
202
|
+
if backtest.metadata:
|
|
203
|
+
metadata = backtest.metadata
|
|
204
|
+
break
|
|
205
|
+
|
|
206
|
+
backtest = Backtest(
|
|
207
|
+
backtest_summary=summary,
|
|
208
|
+
metadata=metadata,
|
|
209
|
+
backtest_runs=backtest_runs
|
|
210
|
+
)
|
|
211
|
+
return backtest
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|