investing-algorithm-framework 8.5.0__tar.gz → 8.6.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-8.5.0 → investing_algorithm_framework-8.6.0}/PKG-INFO +1 -1
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/__init__.py +7 -1
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +26 -78
- investing_algorithm_framework-8.6.0/investing_algorithm_framework/domain/backtesting/consistency.py +137 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +87 -25
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/__init__.py +7 -2
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/__init__.py +7 -1
- investing_algorithm_framework-8.6.0/investing_algorithm_framework/services/metrics/consistency.py +13 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/pyproject.toml +1 -1
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/LICENSE +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/README.md +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/app.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/strategy.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/blotter.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/fx.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/notebook/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/notebook/magic.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
- {investing_algorithm_framework-8.5.0 → investing_algorithm_framework-8.6.0}/investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +0 -0
|
@@ -67,7 +67,9 @@ from .services import get_annual_volatility, get_sortino_ratio, \
|
|
|
67
67
|
get_current_average_trade_loss, get_negative_trades, \
|
|
68
68
|
get_positive_trades, get_number_of_trades, get_current_win_rate, \
|
|
69
69
|
get_current_win_loss_ratio, create_backtest_metrics_for_backtest, \
|
|
70
|
-
recalculate_backtests, TradeTakeProfitService, TradeStopLossService
|
|
70
|
+
recalculate_backtests, TradeTakeProfitService, TradeStopLossService, \
|
|
71
|
+
get_cv_consistency, get_normalized_stability, \
|
|
72
|
+
get_consistency_score, get_stability_score
|
|
71
73
|
|
|
72
74
|
|
|
73
75
|
__all__ = [
|
|
@@ -255,6 +257,10 @@ __all__ = [
|
|
|
255
257
|
"FXRateProvider",
|
|
256
258
|
"StaticFXRateProvider",
|
|
257
259
|
"load_ipython_extension",
|
|
260
|
+
"get_cv_consistency",
|
|
261
|
+
"get_normalized_stability",
|
|
262
|
+
"get_consistency_score",
|
|
263
|
+
"get_stability_score",
|
|
258
264
|
]
|
|
259
265
|
|
|
260
266
|
|
|
@@ -2,6 +2,10 @@ import logging
|
|
|
2
2
|
import math
|
|
3
3
|
from typing import List
|
|
4
4
|
|
|
5
|
+
from .consistency import (
|
|
6
|
+
get_cv_consistency, get_normalized_stability,
|
|
7
|
+
get_consistency_score, get_stability_score,
|
|
8
|
+
)
|
|
5
9
|
from .backtest_metrics import BacktestMetrics
|
|
6
10
|
from .backtest_summary_metrics import BacktestSummaryMetrics
|
|
7
11
|
|
|
@@ -441,45 +445,14 @@ def generate_backtest_summary_metrics(
|
|
|
441
445
|
) if consecutive_losses else None
|
|
442
446
|
|
|
443
447
|
# === CONSISTENCY METRICS ===
|
|
444
|
-
# Two complementary approaches to measure cross-window stability.
|
|
445
|
-
#
|
|
446
|
-
# 1) CV-based consistency: 1 - CV (CV = std / |mean|), capped [0, 1].
|
|
447
|
-
# Standard statistical measure; scale-invariant.
|
|
448
|
-
# Drawback: undefined when mean ≈ 0.
|
|
449
|
-
#
|
|
450
|
-
# 2) Normalized-std stability: 1 - std/max_std, capped [0, 1].
|
|
451
|
-
# Uses a domain-specific max_std for normalization.
|
|
452
|
-
# More intuitive for bounded metrics (win rate 0-100,
|
|
453
|
-
# Sharpe typically -2 to +4).
|
|
454
|
-
|
|
455
448
|
return_consistency = None
|
|
456
449
|
win_rate_consistency = None
|
|
457
450
|
sharpe_consistency = None
|
|
458
|
-
|
|
451
|
+
consistency_score_val = None
|
|
459
452
|
return_stability = None
|
|
460
453
|
win_rate_stability = None
|
|
461
454
|
sharpe_stability = None
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
def _cv_consistency(values):
|
|
465
|
-
"""1 - CV capped to [0, 1], or None if insufficient data."""
|
|
466
|
-
if len(values) < 2:
|
|
467
|
-
return None
|
|
468
|
-
mean = sum(values) / len(values)
|
|
469
|
-
if abs(mean) < 1e-9:
|
|
470
|
-
return 0.0 # mean ≈ 0 → unstable
|
|
471
|
-
var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
|
|
472
|
-
cv = math.sqrt(var) / abs(mean)
|
|
473
|
-
return max(0.0, min(1.0, 1.0 - cv))
|
|
474
|
-
|
|
475
|
-
def _norm_stability(values, max_std):
|
|
476
|
-
"""1 - std/max_std capped to [0, 1], or None if insufficient."""
|
|
477
|
-
if len(values) < 2:
|
|
478
|
-
return None
|
|
479
|
-
mean = sum(values) / len(values)
|
|
480
|
-
var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
|
|
481
|
-
std = math.sqrt(var)
|
|
482
|
-
return max(0.0, min(1.0, 1.0 - std / max_std))
|
|
455
|
+
stability_score_val = None
|
|
483
456
|
|
|
484
457
|
if len(valid_metrics) >= 2:
|
|
485
458
|
# --- Per-window returns ---
|
|
@@ -487,9 +460,10 @@ def generate_backtest_summary_metrics(
|
|
|
487
460
|
b.total_net_gain_percentage for b in valid_metrics
|
|
488
461
|
if b.total_net_gain_percentage is not None
|
|
489
462
|
]
|
|
490
|
-
return_consistency =
|
|
491
|
-
|
|
492
|
-
|
|
463
|
+
return_consistency = get_cv_consistency(per_window_returns)
|
|
464
|
+
return_stability = get_normalized_stability(
|
|
465
|
+
per_window_returns, 100.0
|
|
466
|
+
)
|
|
493
467
|
|
|
494
468
|
# --- Per-window win rates ---
|
|
495
469
|
per_window_win_rates = [
|
|
@@ -498,10 +472,10 @@ def generate_backtest_summary_metrics(
|
|
|
498
472
|
and b.number_of_trades_closed is not None
|
|
499
473
|
and b.number_of_trades_closed > 0
|
|
500
474
|
]
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
475
|
+
win_rate_consistency = get_cv_consistency(per_window_win_rates)
|
|
476
|
+
win_rate_stability = get_normalized_stability(
|
|
477
|
+
per_window_win_rates, 50.0
|
|
478
|
+
)
|
|
505
479
|
|
|
506
480
|
# --- Per-window Sharpe ratios ---
|
|
507
481
|
per_window_sharpe = [
|
|
@@ -510,45 +484,19 @@ def generate_backtest_summary_metrics(
|
|
|
510
484
|
and not math.isnan(b.sharpe_ratio)
|
|
511
485
|
and not math.isinf(b.sharpe_ratio)
|
|
512
486
|
]
|
|
513
|
-
sharpe_consistency =
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
487
|
+
sharpe_consistency = get_cv_consistency(per_window_sharpe)
|
|
488
|
+
sharpe_stability = get_normalized_stability(
|
|
489
|
+
per_window_sharpe, 2.0
|
|
490
|
+
)
|
|
517
491
|
|
|
518
492
|
# --- Composite scores ---
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
def _composite(ret_c, wr_c, sh_c):
|
|
523
|
-
components = []
|
|
524
|
-
weights_c = []
|
|
525
|
-
if ret_c is not None:
|
|
526
|
-
components.append(ret_c)
|
|
527
|
-
weights_c.append(0.35)
|
|
528
|
-
if wr_c is not None:
|
|
529
|
-
components.append(wr_c)
|
|
530
|
-
weights_c.append(0.25)
|
|
531
|
-
if sh_c is not None:
|
|
532
|
-
components.append(sh_c)
|
|
533
|
-
weights_c.append(0.20)
|
|
534
|
-
if number_of_windows and number_of_windows > 0:
|
|
535
|
-
pw_ratio = (
|
|
536
|
-
number_of_profitable_windows / number_of_windows
|
|
537
|
-
)
|
|
538
|
-
components.append(pw_ratio)
|
|
539
|
-
weights_c.append(0.20)
|
|
540
|
-
if not components:
|
|
541
|
-
return None
|
|
542
|
-
total_w = sum(weights_c)
|
|
543
|
-
return sum(
|
|
544
|
-
c * w for c, w in zip(components, weights_c)
|
|
545
|
-
) / total_w
|
|
546
|
-
|
|
547
|
-
consistency_score = _composite(
|
|
548
|
-
return_consistency, win_rate_consistency, sharpe_consistency
|
|
493
|
+
consistency_score_val = get_consistency_score(
|
|
494
|
+
return_consistency, win_rate_consistency, sharpe_consistency,
|
|
495
|
+
number_of_profitable_windows, number_of_windows,
|
|
549
496
|
)
|
|
550
|
-
|
|
551
|
-
return_stability, win_rate_stability, sharpe_stability
|
|
497
|
+
stability_score_val = get_stability_score(
|
|
498
|
+
return_stability, win_rate_stability, sharpe_stability,
|
|
499
|
+
number_of_profitable_windows, number_of_windows,
|
|
552
500
|
)
|
|
553
501
|
|
|
554
502
|
return BacktestSummaryMetrics(
|
|
@@ -602,9 +550,9 @@ def generate_backtest_summary_metrics(
|
|
|
602
550
|
return_consistency=return_consistency,
|
|
603
551
|
win_rate_consistency=win_rate_consistency,
|
|
604
552
|
sharpe_consistency=sharpe_consistency,
|
|
605
|
-
consistency_score=
|
|
553
|
+
consistency_score=consistency_score_val,
|
|
606
554
|
return_stability=return_stability,
|
|
607
555
|
win_rate_stability=win_rate_stability,
|
|
608
556
|
sharpe_stability=sharpe_stability,
|
|
609
|
-
stability_score=
|
|
557
|
+
stability_score=stability_score_val,
|
|
610
558
|
)
|
investing_algorithm_framework-8.6.0/investing_algorithm_framework/domain/backtesting/consistency.py
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import math
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_cv_consistency(values):
|
|
5
|
+
"""
|
|
6
|
+
CV-based consistency: 1 - CV (CV = std / |mean|), capped [0, 1].
|
|
7
|
+
|
|
8
|
+
Standard statistical measure; scale-invariant.
|
|
9
|
+
Returns None if fewer than 2 values.
|
|
10
|
+
Returns 0.0 when mean ≈ 0 (unstable).
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
values: list of numeric values (e.g. per-window returns)
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
float in [0, 1] or None
|
|
17
|
+
"""
|
|
18
|
+
if len(values) < 2:
|
|
19
|
+
return None
|
|
20
|
+
mean = sum(values) / len(values)
|
|
21
|
+
if abs(mean) < 1e-9:
|
|
22
|
+
return 0.0
|
|
23
|
+
var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
|
|
24
|
+
cv = math.sqrt(var) / abs(mean)
|
|
25
|
+
return max(0.0, min(1.0, 1.0 - cv))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_normalized_stability(values, max_std):
|
|
29
|
+
"""
|
|
30
|
+
Normalized-std stability: 1 - std/max_std, capped [0, 1].
|
|
31
|
+
|
|
32
|
+
Uses a domain-specific max_std for normalization.
|
|
33
|
+
More intuitive for bounded metrics (win rate 0-100,
|
|
34
|
+
Sharpe typically -2 to +4).
|
|
35
|
+
Returns None if fewer than 2 values.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
values: list of numeric values (e.g. per-window win rates)
|
|
39
|
+
max_std: domain-specific maximum standard deviation for
|
|
40
|
+
normalization
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
float in [0, 1] or None
|
|
44
|
+
"""
|
|
45
|
+
if len(values) < 2:
|
|
46
|
+
return None
|
|
47
|
+
mean = sum(values) / len(values)
|
|
48
|
+
var = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
|
|
49
|
+
std = math.sqrt(var)
|
|
50
|
+
return max(0.0, min(1.0, 1.0 - std / max_std))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_consistency_score(
|
|
54
|
+
return_consistency,
|
|
55
|
+
win_rate_consistency,
|
|
56
|
+
sharpe_consistency,
|
|
57
|
+
number_of_profitable_windows=None,
|
|
58
|
+
number_of_windows=None,
|
|
59
|
+
):
|
|
60
|
+
"""
|
|
61
|
+
Composite consistency score using weighted components:
|
|
62
|
+
35% returns, 25% win rate, 20% Sharpe, 20% profitable window ratio.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
return_consistency: CV consistency of per-window returns
|
|
66
|
+
win_rate_consistency: CV consistency of per-window win rates
|
|
67
|
+
sharpe_consistency: CV consistency of per-window Sharpe ratios
|
|
68
|
+
number_of_profitable_windows: count of profitable windows
|
|
69
|
+
number_of_windows: total number of windows
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
float in [0, 1] or None
|
|
73
|
+
"""
|
|
74
|
+
return _composite(
|
|
75
|
+
return_consistency,
|
|
76
|
+
win_rate_consistency,
|
|
77
|
+
sharpe_consistency,
|
|
78
|
+
number_of_profitable_windows,
|
|
79
|
+
number_of_windows,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def get_stability_score(
|
|
84
|
+
return_stability,
|
|
85
|
+
win_rate_stability,
|
|
86
|
+
sharpe_stability,
|
|
87
|
+
number_of_profitable_windows=None,
|
|
88
|
+
number_of_windows=None,
|
|
89
|
+
):
|
|
90
|
+
"""
|
|
91
|
+
Composite stability score using weighted components:
|
|
92
|
+
35% returns, 25% win rate, 20% Sharpe, 20% profitable window ratio.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
return_stability: normalized stability of per-window returns
|
|
96
|
+
win_rate_stability: normalized stability of per-window win rates
|
|
97
|
+
sharpe_stability: normalized stability of per-window Sharpe ratios
|
|
98
|
+
number_of_profitable_windows: count of profitable windows
|
|
99
|
+
number_of_windows: total number of windows
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
float in [0, 1] or None
|
|
103
|
+
"""
|
|
104
|
+
return _composite(
|
|
105
|
+
return_stability,
|
|
106
|
+
win_rate_stability,
|
|
107
|
+
sharpe_stability,
|
|
108
|
+
number_of_profitable_windows,
|
|
109
|
+
number_of_windows,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _composite(
|
|
114
|
+
ret_c, wr_c, sh_c,
|
|
115
|
+
number_of_profitable_windows=None,
|
|
116
|
+
number_of_windows=None,
|
|
117
|
+
):
|
|
118
|
+
components = []
|
|
119
|
+
weights_c = []
|
|
120
|
+
if ret_c is not None:
|
|
121
|
+
components.append(ret_c)
|
|
122
|
+
weights_c.append(0.35)
|
|
123
|
+
if wr_c is not None:
|
|
124
|
+
components.append(wr_c)
|
|
125
|
+
weights_c.append(0.25)
|
|
126
|
+
if sh_c is not None:
|
|
127
|
+
components.append(sh_c)
|
|
128
|
+
weights_c.append(0.20)
|
|
129
|
+
if number_of_windows and number_of_windows > 0 \
|
|
130
|
+
and number_of_profitable_windows is not None:
|
|
131
|
+
pw_ratio = number_of_profitable_windows / number_of_windows
|
|
132
|
+
components.append(pw_ratio)
|
|
133
|
+
weights_c.append(0.20)
|
|
134
|
+
if not components:
|
|
135
|
+
return None
|
|
136
|
+
total_w = sum(weights_c)
|
|
137
|
+
return sum(c * w for c, w in zip(components, weights_c)) / total_w
|
|
@@ -31,20 +31,42 @@ from .vector_backtest_service import VectorBacktestService
|
|
|
31
31
|
|
|
32
32
|
logger = logging.getLogger(__name__)
|
|
33
33
|
|
|
34
|
-
# Module-level
|
|
34
|
+
# Module-level globals used by worker processes. Set via _init_worker
|
|
35
35
|
# which is called once per worker by ProcessPoolExecutor's initializer.
|
|
36
36
|
_worker_data_provider_service = None
|
|
37
|
+
_worker_progress_counter = None
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
def _init_worker(data_provider_service):
|
|
40
|
+
def _init_worker(data_provider_service, progress_counter=None):
|
|
40
41
|
"""Initializer for ProcessPoolExecutor workers.
|
|
41
42
|
|
|
42
|
-
Stores the data_provider_service
|
|
43
|
-
worker
|
|
44
|
-
|
|
43
|
+
Stores the data_provider_service and a shared progress counter in
|
|
44
|
+
module-level globals so each worker inherits them once at startup
|
|
45
|
+
rather than pickling them per task. This dramatically reduces
|
|
46
|
+
overhead on Windows/WSL (spawn start method).
|
|
47
|
+
|
|
48
|
+
Also pins BLAS / OpenMP / Polars thread pools to a single thread per
|
|
49
|
+
worker. Without this each worker tries to use all CPU cores for
|
|
50
|
+
numpy / pandas / polars operations, causing N² thread oversubscription
|
|
51
|
+
and severe slowdowns on Windows/WSL. These env vars must be set
|
|
52
|
+
before numpy / polars are imported, which is why ``spawn`` is used
|
|
53
|
+
as the start method (with ``fork`` they would have no effect because
|
|
54
|
+
those libraries are already loaded in the parent).
|
|
45
55
|
"""
|
|
46
|
-
|
|
56
|
+
# Pin math library thread pools to 1 thread per worker.
|
|
57
|
+
for var in (
|
|
58
|
+
"OMP_NUM_THREADS",
|
|
59
|
+
"OPENBLAS_NUM_THREADS",
|
|
60
|
+
"MKL_NUM_THREADS",
|
|
61
|
+
"NUMEXPR_NUM_THREADS",
|
|
62
|
+
"VECLIB_MAXIMUM_THREADS",
|
|
63
|
+
"POLARS_MAX_THREADS",
|
|
64
|
+
):
|
|
65
|
+
os.environ.setdefault(var, "1")
|
|
66
|
+
|
|
67
|
+
global _worker_data_provider_service, _worker_progress_counter
|
|
47
68
|
_worker_data_provider_service = data_provider_service
|
|
69
|
+
_worker_progress_counter = progress_counter
|
|
48
70
|
|
|
49
71
|
|
|
50
72
|
def _print_progress(message: str, show_progress: bool = False):
|
|
@@ -921,9 +943,13 @@ class BacktestService:
|
|
|
921
943
|
|
|
922
944
|
if use_parallel:
|
|
923
945
|
# Parallel processing of backtests (batches per worker)
|
|
924
|
-
# Determine number of workers
|
|
946
|
+
# Determine number of workers. Cap at 8 by default to
|
|
947
|
+
# avoid BLAS / IPC contention on Windows/WSL where
|
|
948
|
+
# cpu_count() workers is usually slower than fewer.
|
|
925
949
|
if n_workers == -1:
|
|
926
|
-
n_workers =
|
|
950
|
+
n_workers = min(
|
|
951
|
+
max(multiprocessing.cpu_count() - 1, 1), 8
|
|
952
|
+
)
|
|
927
953
|
|
|
928
954
|
# Calculate optimal batch size per worker
|
|
929
955
|
# Each worker processes a batch of strategies
|
|
@@ -948,11 +974,27 @@ class BacktestService:
|
|
|
948
974
|
show_progress
|
|
949
975
|
)
|
|
950
976
|
|
|
951
|
-
#
|
|
952
|
-
#
|
|
953
|
-
#
|
|
954
|
-
|
|
955
|
-
|
|
977
|
+
# Use a single ``spawn`` context for everything.
|
|
978
|
+
# On WSL/Linux the default is ``fork`` which copies
|
|
979
|
+
# the entire parent process into each worker,
|
|
980
|
+
# bloating workers and preventing the BLAS thread
|
|
981
|
+
# env vars set in ``_init_worker`` from taking
|
|
982
|
+
# effect (numpy/polars are already loaded). With
|
|
983
|
+
# ``spawn`` workers start with a clean interpreter
|
|
984
|
+
# and those env vars are honoured.
|
|
985
|
+
mp_ctx = multiprocessing.get_context("spawn")
|
|
986
|
+
|
|
987
|
+
# Shared counter for strategy-level progress across
|
|
988
|
+
# all workers. Use ``mp_ctx.Value`` (shared memory +
|
|
989
|
+
# semaphore) instead of ``Manager().Value`` which
|
|
990
|
+
# is a proxy that performs an IPC round-trip for
|
|
991
|
+
# every read/write through a separate manager
|
|
992
|
+
# process. Manager proxies are catastrophically
|
|
993
|
+
# slow on Windows/WSL when many workers update the
|
|
994
|
+
# same counter, and they also cause the progress
|
|
995
|
+
# bar to appear frozen because the monitor thread's
|
|
996
|
+
# reads queue behind worker writes.
|
|
997
|
+
progress_counter = mp_ctx.Value('i', 0)
|
|
956
998
|
|
|
957
999
|
# Copy data provider once and pass via initializer
|
|
958
1000
|
# so each worker inherits it at startup instead of
|
|
@@ -974,11 +1016,15 @@ class BacktestService:
|
|
|
974
1016
|
None, # placeholder, worker reads global
|
|
975
1017
|
False,
|
|
976
1018
|
dynamic_position_sizing,
|
|
977
|
-
progress_counter
|
|
1019
|
+
None, # progress_counter inherited via init
|
|
978
1020
|
))
|
|
979
1021
|
|
|
980
1022
|
# Start a monitoring thread that updates a
|
|
981
|
-
# strategy-level progress bar in real time
|
|
1023
|
+
# strategy-level progress bar in real time. Use
|
|
1024
|
+
# mininterval=0 / miniters=1 so the bar refreshes
|
|
1025
|
+
# promptly on Windows/WSL where stdout is often
|
|
1026
|
+
# line-buffered and tqdm's default smoothing can
|
|
1027
|
+
# otherwise make the bar appear frozen.
|
|
982
1028
|
total_strategies = len(strategies_to_run)
|
|
983
1029
|
pbar = tqdm(
|
|
984
1030
|
total=total_strategies,
|
|
@@ -987,6 +1033,8 @@ class BacktestService:
|
|
|
987
1033
|
f"{start_date} to {end_date}",
|
|
988
1034
|
disable=not show_progress,
|
|
989
1035
|
unit="strategy",
|
|
1036
|
+
mininterval=0,
|
|
1037
|
+
miniters=1,
|
|
990
1038
|
)
|
|
991
1039
|
stop_event = threading.Event()
|
|
992
1040
|
|
|
@@ -994,21 +1042,26 @@ class BacktestService:
|
|
|
994
1042
|
while not stop_event.is_set():
|
|
995
1043
|
pbar.n = progress_counter.value
|
|
996
1044
|
pbar.refresh()
|
|
997
|
-
stop_event.wait(0.
|
|
1045
|
+
stop_event.wait(0.25)
|
|
998
1046
|
|
|
999
1047
|
monitor = threading.Thread(
|
|
1000
1048
|
target=_monitor_progress, daemon=True
|
|
1001
1049
|
)
|
|
1002
1050
|
monitor.start()
|
|
1003
1051
|
|
|
1004
|
-
# Execute batches in parallel
|
|
1005
|
-
#
|
|
1006
|
-
#
|
|
1007
|
-
#
|
|
1052
|
+
# Execute batches in parallel using the spawn pool
|
|
1053
|
+
# created above. The shared ``progress_counter``
|
|
1054
|
+
# (a ``mp_ctx.Value``) and ``shared_data_provider``
|
|
1055
|
+
# are passed through the initializer so they are
|
|
1056
|
+
# inherited once per worker rather than pickled per
|
|
1057
|
+
# task.
|
|
1008
1058
|
with ProcessPoolExecutor(
|
|
1009
1059
|
max_workers=n_workers,
|
|
1060
|
+
mp_context=mp_ctx,
|
|
1010
1061
|
initializer=_init_worker,
|
|
1011
|
-
initargs=(
|
|
1062
|
+
initargs=(
|
|
1063
|
+
shared_data_provider, progress_counter,
|
|
1064
|
+
),
|
|
1012
1065
|
) as ex:
|
|
1013
1066
|
# Submit all batch tasks
|
|
1014
1067
|
futures = [
|
|
@@ -1066,7 +1119,6 @@ class BacktestService:
|
|
|
1066
1119
|
pbar.n = progress_counter.value
|
|
1067
1120
|
pbar.refresh()
|
|
1068
1121
|
pbar.close()
|
|
1069
|
-
manager.shutdown()
|
|
1070
1122
|
|
|
1071
1123
|
# Save remaining batch and create checkpoint files when
|
|
1072
1124
|
# storage directory provided
|
|
@@ -1810,6 +1862,12 @@ class BacktestService:
|
|
|
1810
1862
|
if data_provider_service is None:
|
|
1811
1863
|
data_provider_service = _worker_data_provider_service
|
|
1812
1864
|
|
|
1865
|
+
# In parallel mode the progress counter is inherited via the
|
|
1866
|
+
# worker initializer (multiprocessing.Value, shared memory).
|
|
1867
|
+
# Fall back to the per-task argument for backward compatibility.
|
|
1868
|
+
if progress_counter is None:
|
|
1869
|
+
progress_counter = _worker_progress_counter
|
|
1870
|
+
|
|
1813
1871
|
vector_backtest_service = VectorBacktestService(
|
|
1814
1872
|
data_provider_service=data_provider_service
|
|
1815
1873
|
)
|
|
@@ -1852,9 +1910,12 @@ class BacktestService:
|
|
|
1852
1910
|
batch_results.append(backtest)
|
|
1853
1911
|
|
|
1854
1912
|
# Increment shared progress counter so the
|
|
1855
|
-
# main process can track per-strategy progress
|
|
1913
|
+
# main process can track per-strategy progress.
|
|
1914
|
+
# ``multiprocessing.Value`` lives in shared memory; the
|
|
1915
|
+
# lock makes ``+= 1`` atomic across workers.
|
|
1856
1916
|
if progress_counter is not None:
|
|
1857
|
-
progress_counter.
|
|
1917
|
+
with progress_counter.get_lock():
|
|
1918
|
+
progress_counter.value += 1
|
|
1858
1919
|
|
|
1859
1920
|
except Exception as e:
|
|
1860
1921
|
if continue_on_error:
|
|
@@ -1865,7 +1926,8 @@ class BacktestService:
|
|
|
1865
1926
|
# Still increment counter for failed strategies
|
|
1866
1927
|
# so progress total stays accurate
|
|
1867
1928
|
if progress_counter is not None:
|
|
1868
|
-
progress_counter.
|
|
1929
|
+
with progress_counter.get_lock():
|
|
1930
|
+
progress_counter.value += 1
|
|
1869
1931
|
continue
|
|
1870
1932
|
else:
|
|
1871
1933
|
raise
|
|
@@ -38,7 +38,8 @@ from .metrics import get_annual_volatility, get_mean_daily_return, \
|
|
|
38
38
|
get_current_win_rate, get_current_average_trade_return, \
|
|
39
39
|
get_current_average_trade_loss, get_current_average_trade_duration, \
|
|
40
40
|
get_current_average_trade_gain, create_backtest_metrics_for_backtest, \
|
|
41
|
-
recalculate_backtests
|
|
41
|
+
recalculate_backtests, get_cv_consistency, get_normalized_stability, \
|
|
42
|
+
get_consistency_score, get_stability_score
|
|
42
43
|
|
|
43
44
|
__all__ = [
|
|
44
45
|
"get_mean_daily_return",
|
|
@@ -134,5 +135,9 @@ __all__ = [
|
|
|
134
135
|
"recalculate_backtests",
|
|
135
136
|
"TradeStopLossService",
|
|
136
137
|
"TradeTakeProfitService",
|
|
137
|
-
"get_mean_yearly_return"
|
|
138
|
+
"get_mean_yearly_return",
|
|
139
|
+
"get_cv_consistency",
|
|
140
|
+
"get_normalized_stability",
|
|
141
|
+
"get_consistency_score",
|
|
142
|
+
"get_stability_score"
|
|
138
143
|
]
|
|
@@ -40,6 +40,8 @@ from .trades import get_negative_trades, get_positive_trades, \
|
|
|
40
40
|
get_average_trade_duration
|
|
41
41
|
from .mean_daily_return import get_mean_daily_return, get_mean_yearly_return
|
|
42
42
|
from .standard_deviation import get_daily_returns_std
|
|
43
|
+
from .consistency import get_cv_consistency, get_normalized_stability, \
|
|
44
|
+
get_consistency_score, get_stability_score
|
|
43
45
|
|
|
44
46
|
__all__ = [
|
|
45
47
|
"get_mean_daily_return",
|
|
@@ -115,5 +117,9 @@ __all__ = [
|
|
|
115
117
|
"get_number_of_open_trades",
|
|
116
118
|
"get_average_trade_duration",
|
|
117
119
|
"create_backtest_metrics_for_backtest",
|
|
118
|
-
"get_mean_yearly_return"
|
|
120
|
+
"get_mean_yearly_return",
|
|
121
|
+
"get_cv_consistency",
|
|
122
|
+
"get_normalized_stability",
|
|
123
|
+
"get_consistency_score",
|
|
124
|
+
"get_stability_score"
|
|
119
125
|
]
|
investing_algorithm_framework-8.6.0/investing_algorithm_framework/services/metrics/consistency.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from investing_algorithm_framework.domain.backtesting.consistency import (
|
|
2
|
+
get_cv_consistency,
|
|
3
|
+
get_normalized_stability,
|
|
4
|
+
get_consistency_score,
|
|
5
|
+
get_stability_score,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"get_cv_consistency",
|
|
10
|
+
"get_normalized_stability",
|
|
11
|
+
"get_consistency_score",
|
|
12
|
+
"get_stability_score",
|
|
13
|
+
]
|
|
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
|