investing-algorithm-framework 7.0.3__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.0.3 → investing_algorithm_framework-7.2.0}/PKG-INFO +1 -1
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/__init__.py +2 -2
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/__init__.py +2 -2
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm.py +3 -1
- {investing_algorithm_framework-7.0.3 → 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.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app.py +127 -8
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/strategy.py +9 -1
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/win_rate.py +3 -3
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/pyproject.toml +1 -1
- investing_algorithm_framework-7.0.3/investing_algorithm_framework/app/analysis/ranking.py +0 -58
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/LICENSE +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/README.md +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_position.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/backtesting/backtest_results.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.0.3 → investing_algorithm_framework-7.2.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-7.0.3 → 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
|
+
)
|
|
@@ -381,6 +381,10 @@ class App:
|
|
|
381
381
|
None
|
|
382
382
|
"""
|
|
383
383
|
logger.info("Initializing data sources")
|
|
384
|
+
|
|
385
|
+
if data_sources is None or len(data_sources) == 0:
|
|
386
|
+
return
|
|
387
|
+
|
|
384
388
|
data_provider_service = self.container.data_provider_service()
|
|
385
389
|
data_provider_service.reset()
|
|
386
390
|
|
|
@@ -415,6 +419,10 @@ class App:
|
|
|
415
419
|
None
|
|
416
420
|
"""
|
|
417
421
|
logger.info("Initializing data sources for backtest")
|
|
422
|
+
|
|
423
|
+
if data_sources is None or len(data_sources) == 0:
|
|
424
|
+
return
|
|
425
|
+
|
|
418
426
|
data_provider_service = self.container.data_provider_service()
|
|
419
427
|
data_provider_service.reset()
|
|
420
428
|
|
|
@@ -890,7 +898,16 @@ class App:
|
|
|
890
898
|
risk_free_rate=risk_free_rate,
|
|
891
899
|
)
|
|
892
900
|
|
|
893
|
-
|
|
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
|
+
|
|
894
911
|
self.cleanup_backtest_resources()
|
|
895
912
|
|
|
896
913
|
if save and directory:
|
|
@@ -900,18 +917,102 @@ class App:
|
|
|
900
917
|
|
|
901
918
|
return backtest
|
|
902
919
|
|
|
920
|
+
def run_vector_backtests(
|
|
921
|
+
self,
|
|
922
|
+
backtest_date_range: BacktestDateRange,
|
|
923
|
+
initial_amount,
|
|
924
|
+
strategies: List[TradingStrategy],
|
|
925
|
+
snapshot_interval: SnapshotInterval = SnapshotInterval.DAILY,
|
|
926
|
+
risk_free_rate: Optional[float] = None,
|
|
927
|
+
skip_data_sources_initialization: bool = False
|
|
928
|
+
):
|
|
929
|
+
"""
|
|
930
|
+
Run vectorized backtests for a set of strategies. The provided
|
|
931
|
+
set of strategies need to have their 'buy_signal_vectorized' and
|
|
932
|
+
'sell_signal_vectorized' methods implemented to support vectorized
|
|
933
|
+
backtesting.
|
|
934
|
+
|
|
935
|
+
Args:
|
|
936
|
+
backtest_date_range: The date range to run the backtest for
|
|
937
|
+
(instance of BacktestDateRange)
|
|
938
|
+
initial_amount: The initial amount to start the backtest with.
|
|
939
|
+
This will be the amount of trading currency that the backtest
|
|
940
|
+
portfolio will start with.
|
|
941
|
+
strategies (List[TradingStrategy]): List of strategy objects
|
|
942
|
+
that need to be backtested. Each strategy should implement
|
|
943
|
+
the 'buy_signal_vectorized' and 'sell_signal_vectorized'
|
|
944
|
+
methods to support vectorized backtesting.
|
|
945
|
+
snapshot_interval (SnapshotInterval): The snapshot
|
|
946
|
+
interval to use for the backtest. This is used to determine
|
|
947
|
+
how often the portfolio snapshot should be taken during the
|
|
948
|
+
backtest. The default is TRADE_CLOSE, which means that the
|
|
949
|
+
portfolio snapshot will be taken at the end of each trade.
|
|
950
|
+
risk_free_rate (Optional[float]): The risk-free rate to use for
|
|
951
|
+
the backtest. This is used to calculate the Sharpe ratio
|
|
952
|
+
and other performance metrics. If not provided, the default
|
|
953
|
+
risk-free rate will be tried to be fetched from the
|
|
954
|
+
US Treasury website.
|
|
955
|
+
skip_data_sources_initialization (bool): Whether to skip the
|
|
956
|
+
initialization of data sources. This is useful when the data
|
|
957
|
+
sources are already initialized, and you want to skip the
|
|
958
|
+
initialization step. This will speed up the backtesting
|
|
959
|
+
process, but make sure that the data sources are already
|
|
960
|
+
initialized before calling this method.
|
|
961
|
+
|
|
962
|
+
Returns:
|
|
963
|
+
List[Backtest]: List of Backtest instances for each strategy
|
|
964
|
+
that was backtested.
|
|
965
|
+
"""
|
|
966
|
+
backtests = []
|
|
967
|
+
data_sources = []
|
|
968
|
+
|
|
969
|
+
for strategy in strategies:
|
|
970
|
+
data_sources.extend(strategy.data_sources)
|
|
971
|
+
|
|
972
|
+
if not skip_data_sources_initialization:
|
|
973
|
+
self.initialize_data_sources_backtest(
|
|
974
|
+
data_sources, backtest_date_range
|
|
975
|
+
)
|
|
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
|
+
|
|
989
|
+
for strategy in tqdm(strategies):
|
|
990
|
+
backtests.append(
|
|
991
|
+
self.run_vector_backtest(
|
|
992
|
+
backtest_date_range=backtest_date_range,
|
|
993
|
+
initial_amount=initial_amount,
|
|
994
|
+
strategy=strategy,
|
|
995
|
+
snapshot_interval=snapshot_interval,
|
|
996
|
+
risk_free_rate=risk_free_rate,
|
|
997
|
+
skip_data_sources_initialization=True
|
|
998
|
+
)
|
|
999
|
+
)
|
|
1000
|
+
|
|
1001
|
+
return backtests
|
|
1002
|
+
|
|
903
1003
|
def run_vector_backtest(
|
|
904
1004
|
self,
|
|
905
1005
|
backtest_date_range: BacktestDateRange,
|
|
906
1006
|
initial_amount,
|
|
907
|
-
strategy,
|
|
1007
|
+
strategy: TradingStrategy,
|
|
908
1008
|
snapshot_interval: SnapshotInterval = SnapshotInterval.DAILY,
|
|
909
1009
|
metadata: Optional[Dict[str, str]] = None,
|
|
910
1010
|
risk_free_rate: Optional[float] = None,
|
|
1011
|
+
skip_data_sources_initialization: bool = False
|
|
911
1012
|
) -> Backtest:
|
|
912
1013
|
"""
|
|
913
|
-
Run
|
|
914
|
-
|
|
1014
|
+
Run vectorized backtests for a strategy. The provided
|
|
1015
|
+
strategy needs to have its 'buy_signal_vectorized' and
|
|
915
1016
|
'sell_signal_vectorized' methods implemented to support vectorized
|
|
916
1017
|
backtesting.
|
|
917
1018
|
|
|
@@ -937,6 +1038,12 @@ class App:
|
|
|
937
1038
|
backtest report. This can be used to store additional
|
|
938
1039
|
information about the backtest, such as the author, version,
|
|
939
1040
|
parameters or any other relevant information.
|
|
1041
|
+
skip_data_sources_initialization (bool): Whether to skip the
|
|
1042
|
+
initialization of data sources. This is useful when the data
|
|
1043
|
+
sources are already initialized, and you want to skip the
|
|
1044
|
+
initialization step. This will speed up the backtesting
|
|
1045
|
+
process, but make sure that the data sources are already
|
|
1046
|
+
initialized before calling this method.
|
|
940
1047
|
|
|
941
1048
|
Returns:
|
|
942
1049
|
Backtest: Instance of Backtest
|
|
@@ -947,9 +1054,11 @@ class App:
|
|
|
947
1054
|
snapshot_interval=snapshot_interval,
|
|
948
1055
|
initial_amount=initial_amount
|
|
949
1056
|
)
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
1057
|
+
|
|
1058
|
+
if not skip_data_sources_initialization:
|
|
1059
|
+
self.initialize_data_sources_backtest(
|
|
1060
|
+
strategy.data_sources, backtest_date_range
|
|
1061
|
+
)
|
|
953
1062
|
|
|
954
1063
|
if risk_free_rate is None:
|
|
955
1064
|
logger.info("No risk free rate provided, retrieving it...")
|
|
@@ -971,7 +1080,17 @@ class App:
|
|
|
971
1080
|
initial_amount=initial_amount,
|
|
972
1081
|
risk_free_rate=risk_free_rate
|
|
973
1082
|
)
|
|
974
|
-
|
|
1083
|
+
|
|
1084
|
+
# Add the metadata to the backtest
|
|
1085
|
+
if metadata is None:
|
|
1086
|
+
|
|
1087
|
+
if strategy.metadata is None:
|
|
1088
|
+
backtest.metadata = {}
|
|
1089
|
+
else:
|
|
1090
|
+
backtest.metadata = strategy.metadata
|
|
1091
|
+
else:
|
|
1092
|
+
backtest.metadata = metadata
|
|
1093
|
+
|
|
975
1094
|
return backtest
|
|
976
1095
|
|
|
977
1096
|
def run_backtests(
|
|
@@ -27,8 +27,12 @@ class TradingStrategy:
|
|
|
27
27
|
sources to use for the strategy. The data sources will be used
|
|
28
28
|
to indentify data providers that will be called to gather data
|
|
29
29
|
and pass to the strategy before its run.
|
|
30
|
+
metadata (optional): Dict[str, Any] - a dictionary
|
|
31
|
+
containing metadata about the strategy. This can be used to
|
|
32
|
+
store additional information about the strategy, such as its
|
|
33
|
+
author, version, description, params etc.
|
|
30
34
|
"""
|
|
31
|
-
time_unit:
|
|
35
|
+
time_unit: TimeUnit = None
|
|
32
36
|
interval: int = None
|
|
33
37
|
worker_id: str = None
|
|
34
38
|
strategy_id: str = None
|
|
@@ -36,6 +40,7 @@ class TradingStrategy:
|
|
|
36
40
|
data_sources: List[DataSource] = None
|
|
37
41
|
traces = None
|
|
38
42
|
context: Context = None
|
|
43
|
+
metadata: Dict[str, Any] = None
|
|
39
44
|
|
|
40
45
|
def __init__(
|
|
41
46
|
self,
|
|
@@ -43,6 +48,7 @@ class TradingStrategy:
|
|
|
43
48
|
time_unit=None,
|
|
44
49
|
interval=None,
|
|
45
50
|
data_sources=None,
|
|
51
|
+
metadata=None,
|
|
46
52
|
worker_id=None,
|
|
47
53
|
decorated=None
|
|
48
54
|
):
|
|
@@ -65,6 +71,8 @@ class TradingStrategy:
|
|
|
65
71
|
if data_sources is not None:
|
|
66
72
|
self.data_sources = data_sources
|
|
67
73
|
|
|
74
|
+
self.metadata = metadata
|
|
75
|
+
|
|
68
76
|
if decorated is not None:
|
|
69
77
|
self.decorated = decorated
|
|
70
78
|
|
|
@@ -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
|