investing-algorithm-framework 7.1.0__tar.gz → 7.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/PKG-INFO +1 -1
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/__init__.py +2 -2
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/__init__.py +2 -2
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm.py +3 -1
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/analysis/__init__.py +2 -2
- investing_algorithm_framework-7.2.0/investing_algorithm_framework/app/analysis/ranking.py +178 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app.py +23 -2
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/strategy.py +1 -1
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/win_rate.py +3 -3
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/pyproject.toml +1 -1
- investing_algorithm_framework-7.1.0/investing_algorithm_framework/app/analysis/ranking.py +0 -58
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/LICENSE +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/README.md +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_position.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_results.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-7.1.0 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
|
@@ -5,7 +5,7 @@ from .app import App, Algorithm, \
|
|
|
5
5
|
pretty_print_orders, pretty_print_backtest, select_backtest_date_ranges, \
|
|
6
6
|
get_equity_curve_with_drawdown_chart, \
|
|
7
7
|
get_rolling_sharpe_ratio_chart, rank_results, \
|
|
8
|
-
get_monthly_returns_heatmap_chart,
|
|
8
|
+
get_monthly_returns_heatmap_chart, create_weights, \
|
|
9
9
|
get_yearly_returns_bar_chart, get_entry_and_exit_signals, \
|
|
10
10
|
get_ohlcv_data_completeness_chart
|
|
11
11
|
from .domain import ApiException, \
|
|
@@ -159,7 +159,7 @@ __all__ = [
|
|
|
159
159
|
"get_yearly_returns_bar_chart",
|
|
160
160
|
"get_ohlcv_data_completeness_chart",
|
|
161
161
|
"rank_results",
|
|
162
|
-
"
|
|
162
|
+
"create_weights",
|
|
163
163
|
"get_entry_and_exit_signals",
|
|
164
164
|
"get_growth",
|
|
165
165
|
"get_growth_percentage"
|
|
@@ -14,7 +14,7 @@ from .reporting import add_html_report, \
|
|
|
14
14
|
get_yearly_returns_bar_chart, \
|
|
15
15
|
get_ohlcv_data_completeness_chart, get_entry_and_exit_signals
|
|
16
16
|
from .analysis import select_backtest_date_ranges, rank_results, \
|
|
17
|
-
|
|
17
|
+
create_weights
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
__all__ = [
|
|
@@ -39,6 +39,6 @@ __all__ = [
|
|
|
39
39
|
"get_yearly_returns_bar_chart",
|
|
40
40
|
"get_ohlcv_data_completeness_chart",
|
|
41
41
|
"rank_results",
|
|
42
|
-
"
|
|
42
|
+
"create_weights",
|
|
43
43
|
"get_entry_and_exit_signals"
|
|
44
44
|
]
|
|
@@ -33,7 +33,8 @@ class Algorithm:
|
|
|
33
33
|
strategies=None,
|
|
34
34
|
tasks: List = None,
|
|
35
35
|
data_sources: List[DataSource] = None,
|
|
36
|
-
on_strategy_run_hooks=None
|
|
36
|
+
on_strategy_run_hooks=None,
|
|
37
|
+
metadata=None
|
|
37
38
|
):
|
|
38
39
|
self._name = name
|
|
39
40
|
self._context = {}
|
|
@@ -46,6 +47,7 @@ class Algorithm:
|
|
|
46
47
|
self._tasks = []
|
|
47
48
|
self._data_sources = []
|
|
48
49
|
self._on_strategy_run_hooks = []
|
|
50
|
+
self.metadata = metadata
|
|
49
51
|
|
|
50
52
|
if data_sources is not None:
|
|
51
53
|
self._data_sources = data_sources
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from .backtest_data_ranges import select_backtest_date_ranges
|
|
2
|
-
from .ranking import rank_results,
|
|
2
|
+
from .ranking import rank_results, create_weights
|
|
3
3
|
|
|
4
4
|
__all__ = [
|
|
5
5
|
"select_backtest_date_ranges",
|
|
6
6
|
"rank_results",
|
|
7
|
-
"
|
|
7
|
+
"create_weights"
|
|
8
8
|
]
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
default_weights = {
|
|
2
|
+
# Profitability
|
|
3
|
+
"total_net_gain": 3.0,
|
|
4
|
+
"total_net_loss": 0.0,
|
|
5
|
+
"total_return": 0.0,
|
|
6
|
+
"avg_return_per_trade": 0.0,
|
|
7
|
+
|
|
8
|
+
# Risk-adjusted returns
|
|
9
|
+
"sharpe_ratio": 1.0,
|
|
10
|
+
"sortino_ratio": 1.0,
|
|
11
|
+
"profit_factor": 1.0,
|
|
12
|
+
|
|
13
|
+
# Risk
|
|
14
|
+
"max_drawdown": -2.0,
|
|
15
|
+
"max_drawdown_duration": -0.5,
|
|
16
|
+
|
|
17
|
+
# Trading activity
|
|
18
|
+
"number_of_trades": 2.0,
|
|
19
|
+
"win_rate": 3.0,
|
|
20
|
+
|
|
21
|
+
# Exposure
|
|
22
|
+
"exposure_factor": 0.5,
|
|
23
|
+
"exposure_ratio": 0.0,
|
|
24
|
+
"exposure_time": 0.0,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def normalize(value, min_val, max_val):
|
|
29
|
+
"""
|
|
30
|
+
Normalize a value to a range [0, 1].
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
value (float): The value to normalize.
|
|
34
|
+
min_val (float): The minimum value of the range.
|
|
35
|
+
max_val (float): The maximum value of the range.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
float: The normalized value.
|
|
39
|
+
"""
|
|
40
|
+
if max_val == min_val:
|
|
41
|
+
return 0
|
|
42
|
+
return (value - min_val) / (max_val - min_val)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def compute_score(metrics, weights, ranges):
|
|
46
|
+
"""
|
|
47
|
+
Compute a weighted score for the given metrics.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
metrics: The metrics to evaluate.
|
|
51
|
+
weights: The weights to apply to each metric.
|
|
52
|
+
ranges: The min/max ranges for each metric.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
float: The computed score.
|
|
56
|
+
"""
|
|
57
|
+
score = 0
|
|
58
|
+
for key, weight in weights.items():
|
|
59
|
+
|
|
60
|
+
if not hasattr(metrics, key):
|
|
61
|
+
continue
|
|
62
|
+
value = getattr(metrics, key)
|
|
63
|
+
|
|
64
|
+
if key in ranges:
|
|
65
|
+
value = normalize(value, ranges[key][0], ranges[key][1])
|
|
66
|
+
score += weight * value
|
|
67
|
+
return score
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def create_weights(
|
|
71
|
+
focus: str = "balanced",
|
|
72
|
+
gain: float = 3.0,
|
|
73
|
+
win_rate: float = 3.0,
|
|
74
|
+
trades: float = 2.0,
|
|
75
|
+
custom_weights: dict | None = None,
|
|
76
|
+
) -> dict:
|
|
77
|
+
"""
|
|
78
|
+
Utility to generate weights dicts for ranking backtests.
|
|
79
|
+
|
|
80
|
+
This function does not assign weights to every possible performance
|
|
81
|
+
metric. Instead, it focuses on a curated subset of commonly relevant
|
|
82
|
+
ones (profitability, win rate, trade frequency, and risk-adjusted returns).
|
|
83
|
+
The rationale is to avoid overfitting ranking logic to noisy or redundant
|
|
84
|
+
statistics (e.g., monthly return breakdowns, best/worst trade), while
|
|
85
|
+
keeping the weighting system simple and interpretable.
|
|
86
|
+
Users who need fine-grained control can pass `custom_weights` to fully
|
|
87
|
+
override defaults.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
focus (str): One of [
|
|
91
|
+
"balanced", "profit", "frequency", "risk_adjusted"
|
|
92
|
+
].
|
|
93
|
+
gain (float): Weight for total_net_gain (default only).
|
|
94
|
+
win_rate (float): Weight for win_rate (default only).
|
|
95
|
+
trades (float): Weight for number_of_trades (default only).
|
|
96
|
+
custom_weights (dict): Full override for weights (all metrics).
|
|
97
|
+
If provided, it takes precedence over presets.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
dict: A dictionary of weights for ranking backtests.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# default / balanced
|
|
104
|
+
base = {
|
|
105
|
+
"total_net_gain": gain,
|
|
106
|
+
"win_rate": win_rate,
|
|
107
|
+
"number_of_trades": trades,
|
|
108
|
+
"sharpe_ratio": 1.0,
|
|
109
|
+
"sortino_ratio": 1.0,
|
|
110
|
+
"profit_factor": 1.0,
|
|
111
|
+
"max_drawdown": -2.0,
|
|
112
|
+
"max_drawdown_duration": -0.5,
|
|
113
|
+
"total_net_loss": 0.0,
|
|
114
|
+
"total_return": 0.0,
|
|
115
|
+
"avg_return_per_trade": 0.0,
|
|
116
|
+
"exposure_factor": 0.5,
|
|
117
|
+
"exposure_ratio": 0.0,
|
|
118
|
+
"exposure_time": 0.0,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# apply presets
|
|
122
|
+
if focus == "profit":
|
|
123
|
+
base.update({
|
|
124
|
+
"total_net_gain": 5.0,
|
|
125
|
+
"win_rate": 2.0,
|
|
126
|
+
"number_of_trades": 1.0,
|
|
127
|
+
})
|
|
128
|
+
elif focus == "frequency":
|
|
129
|
+
base.update({
|
|
130
|
+
"number_of_trades": 4.0,
|
|
131
|
+
"win_rate": 2.0,
|
|
132
|
+
"total_net_gain": 2.0,
|
|
133
|
+
})
|
|
134
|
+
elif focus == "risk_adjusted":
|
|
135
|
+
base.update({
|
|
136
|
+
"sharpe_ratio": 3.0,
|
|
137
|
+
"sortino_ratio": 3.0,
|
|
138
|
+
"max_drawdown": -3.0,
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
# if full custom dict is given → override everything
|
|
142
|
+
if custom_weights is not None:
|
|
143
|
+
base = {**base, **custom_weights}
|
|
144
|
+
|
|
145
|
+
return base
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def rank_results(backtests, focus=None, weights=None):
|
|
149
|
+
"""
|
|
150
|
+
Rank backtest results based on specified focus and weights.
|
|
151
|
+
Args:
|
|
152
|
+
backtests (list): List of backtest results to rank.
|
|
153
|
+
focus (str, optional): Focus for ranking. If None,
|
|
154
|
+
uses default weights. Options: "balanced", "profit",
|
|
155
|
+
"frequency", "risk_adjusted".
|
|
156
|
+
weights (dict, optional): Custom weights for ranking metrics.
|
|
157
|
+
If None, uses default weights based on focus.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
list: Sorted list of backtests based on computed scores.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
if weights is None:
|
|
164
|
+
weights = create_weights(focus=focus)
|
|
165
|
+
|
|
166
|
+
# First compute metric ranges for normalization
|
|
167
|
+
ranges = {}
|
|
168
|
+
for key in weights:
|
|
169
|
+
values = [getattr(bt.backtest_metrics, key, None) for bt in backtests]
|
|
170
|
+
values = [v for v in values if isinstance(v, (int, float))]
|
|
171
|
+
if values:
|
|
172
|
+
ranges[key] = (min(values), max(values))
|
|
173
|
+
|
|
174
|
+
return sorted(
|
|
175
|
+
backtests,
|
|
176
|
+
key=lambda bt: compute_score(bt.backtest_metrics, weights, ranges),
|
|
177
|
+
reverse=True
|
|
178
|
+
)
|
|
@@ -898,7 +898,16 @@ class App:
|
|
|
898
898
|
risk_free_rate=risk_free_rate,
|
|
899
899
|
)
|
|
900
900
|
|
|
901
|
-
|
|
901
|
+
# Add the metadata to the backtest
|
|
902
|
+
if metadata is None:
|
|
903
|
+
|
|
904
|
+
if algorithm.metadata is not None:
|
|
905
|
+
backtest.metadata = algorithm.metadata
|
|
906
|
+
else:
|
|
907
|
+
backtest.metadata = {}
|
|
908
|
+
else:
|
|
909
|
+
backtest.metadata = metadata
|
|
910
|
+
|
|
902
911
|
self.cleanup_backtest_resources()
|
|
903
912
|
|
|
904
913
|
if save and directory:
|
|
@@ -965,6 +974,18 @@ class App:
|
|
|
965
974
|
data_sources, backtest_date_range
|
|
966
975
|
)
|
|
967
976
|
|
|
977
|
+
if risk_free_rate is None:
|
|
978
|
+
logger.info("No risk free rate provided, retrieving it...")
|
|
979
|
+
risk_free_rate = get_risk_free_rate_us()
|
|
980
|
+
|
|
981
|
+
if risk_free_rate is None:
|
|
982
|
+
raise OperationalException(
|
|
983
|
+
"Could not retrieve risk free rate for backtest metrics."
|
|
984
|
+
"Please provide a risk free as an argument when running "
|
|
985
|
+
"your backtest or make sure you have an internet "
|
|
986
|
+
"connection"
|
|
987
|
+
)
|
|
988
|
+
|
|
968
989
|
for strategy in tqdm(strategies):
|
|
969
990
|
backtests.append(
|
|
970
991
|
self.run_vector_backtest(
|
|
@@ -1063,7 +1084,7 @@ class App:
|
|
|
1063
1084
|
# Add the metadata to the backtest
|
|
1064
1085
|
if metadata is None:
|
|
1065
1086
|
|
|
1066
|
-
if strategy.metadata is
|
|
1087
|
+
if strategy.metadata is None:
|
|
1067
1088
|
backtest.metadata = {}
|
|
1068
1089
|
else:
|
|
1069
1090
|
backtest.metadata = strategy.metadata
|
|
@@ -42,7 +42,7 @@ def get_win_rate(trades: List[Trade]) -> float:
|
|
|
42
42
|
The percentage of trades that are profitable.
|
|
43
43
|
|
|
44
44
|
Formula:
|
|
45
|
-
Win Rate =
|
|
45
|
+
Win Rate = Number of Profitable Trades / Total Number of Trades
|
|
46
46
|
|
|
47
47
|
Example: If 60 out of 100 trades are profitable, the win rate is 60%.
|
|
48
48
|
|
|
@@ -50,7 +50,7 @@ def get_win_rate(trades: List[Trade]) -> float:
|
|
|
50
50
|
trades (List[Trade]): List of trades from the backtest report.
|
|
51
51
|
|
|
52
52
|
Returns:
|
|
53
|
-
float: The win rate as a percentage (e.g., 75
|
|
53
|
+
float: The win rate as a percentage (e.g., o.75 for 75% win rate).
|
|
54
54
|
"""
|
|
55
55
|
trades = [
|
|
56
56
|
trade for trade in trades if TradeStatus.CLOSED.equals(trade.status)
|
|
@@ -61,7 +61,7 @@ def get_win_rate(trades: List[Trade]) -> float:
|
|
|
61
61
|
if total_trades == 0:
|
|
62
62
|
return 0.0
|
|
63
63
|
|
|
64
|
-
return
|
|
64
|
+
return positive_trades / total_trades
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
def get_win_loss_ratio(trades: List[Trade]) -> float:
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
from investing_algorithm_framework.domain import Backtest
|
|
2
|
-
|
|
3
|
-
defaults_ranking_weights = {
|
|
4
|
-
"total_net_gain": 2.0,
|
|
5
|
-
"sharpe_ratio": 1.0,
|
|
6
|
-
"sortino_ratio": 1.0,
|
|
7
|
-
"win_rate": 1.0,
|
|
8
|
-
"profit_factor": 1.0,
|
|
9
|
-
"max_drawdown": -1.0, # negative weight to penalize high drawdown
|
|
10
|
-
"max_drawdown_duration": -0.5, # penalize long drawdown periods
|
|
11
|
-
"number_of_trades": 0.5,
|
|
12
|
-
"exposure_factor": 0.5,
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def compute_score(metrics: dict, weights: dict) -> float:
|
|
17
|
-
score = 0
|
|
18
|
-
for key, weight in weights.items():
|
|
19
|
-
|
|
20
|
-
# Metrics are attributes to the backtest
|
|
21
|
-
if not hasattr(metrics, key):
|
|
22
|
-
continue
|
|
23
|
-
|
|
24
|
-
# Get the value of the metric
|
|
25
|
-
value = getattr(metrics, key)
|
|
26
|
-
|
|
27
|
-
try:
|
|
28
|
-
score += weight * value
|
|
29
|
-
except TypeError:
|
|
30
|
-
continue # skip if value is not a number
|
|
31
|
-
return score
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def rank_results(
|
|
35
|
-
backtests: list[Backtest], weights=defaults_ranking_weights
|
|
36
|
-
) -> list[Backtest]:
|
|
37
|
-
"""
|
|
38
|
-
Rank backtests based on their metrics and the provided weights.
|
|
39
|
-
|
|
40
|
-
The default weights are defined in `defaults_ranking_weights`.
|
|
41
|
-
Please note that the weights should be adjusted based on the
|
|
42
|
-
specific analysis needs. You can modify the `weights` parameter
|
|
43
|
-
to include or exclude metrics as needed and reuse
|
|
44
|
-
the `defaults_ranking_weights` as a starting point.
|
|
45
|
-
|
|
46
|
-
Args:
|
|
47
|
-
backtests (list[Backtest]): List of Backtest objects to rank.
|
|
48
|
-
weights (dict): Weights for each metric to compute the score.
|
|
49
|
-
|
|
50
|
-
Returns:
|
|
51
|
-
list[Backtest]: List of Backtest objects sorted by
|
|
52
|
-
their computed score.
|
|
53
|
-
"""
|
|
54
|
-
return sorted(
|
|
55
|
-
backtests,
|
|
56
|
-
key=lambda bt: compute_score(bt.backtest_metrics, weights),
|
|
57
|
-
reverse=True
|
|
58
|
-
)
|
|
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
|