investing-algorithm-framework 7.4.0__tar.gz → 7.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/PKG-INFO +1 -1
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/__init__.py +3 -2
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app.py +27 -16
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +2 -0
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/__init__.py +3 -2
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/__init__.py +3 -1
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest.py +33 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +5 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +3 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +22 -1
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/backtesting/combine_backtests.py +211 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +45 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/pyproject.toml +1 -1
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/LICENSE +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/README.md +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/strategy.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observable.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/observer.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-7.4.0 → investing_algorithm_framework-7.5.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
|
@@ -8,7 +8,7 @@ from .app import App, Algorithm, \
|
|
|
8
8
|
get_monthly_returns_heatmap_chart, create_weights, \
|
|
9
9
|
get_yearly_returns_bar_chart, get_entry_and_exit_signals, \
|
|
10
10
|
get_ohlcv_data_completeness_chart
|
|
11
|
-
from .domain import ApiException, \
|
|
11
|
+
from .domain import ApiException, combine_backtests, \
|
|
12
12
|
OrderType, OperationalException, OrderStatus, OrderSide, \
|
|
13
13
|
TimeUnit, TimeInterval, Order, Portfolio, Backtest, \
|
|
14
14
|
Position, TimeFrame, INDEX_DATETIME, MarketCredential, \
|
|
@@ -163,5 +163,6 @@ __all__ = [
|
|
|
163
163
|
"get_entry_and_exit_signals",
|
|
164
164
|
"get_growth",
|
|
165
165
|
"get_growth_percentage",
|
|
166
|
-
"BacktestEvaluationFocus"
|
|
166
|
+
"BacktestEvaluationFocus",
|
|
167
|
+
"combine_backtests",
|
|
167
168
|
]
|
|
@@ -1325,13 +1325,19 @@ class App:
|
|
|
1325
1325
|
|
|
1326
1326
|
for data_source in data_sources:
|
|
1327
1327
|
if DataType.OHLCV.equals(data_source.data_type):
|
|
1328
|
+
data_provider = data_provider_service.get(data_source)
|
|
1328
1329
|
data = data_provider_service.get_data(
|
|
1329
1330
|
data_source=data_source,
|
|
1330
|
-
start_date=
|
|
1331
|
+
start_date=data_provider._start_date_data_source,
|
|
1331
1332
|
end_date=backtest_date_range.end_date
|
|
1332
1333
|
)
|
|
1333
1334
|
original_data_combinations.append((data_source, data))
|
|
1334
|
-
original_datasets_ordered_by_symbol[data_source.symbol] =
|
|
1335
|
+
original_datasets_ordered_by_symbol[data_source.symbol] = \
|
|
1336
|
+
data_provider_service.get_data(
|
|
1337
|
+
data_source=data_source,
|
|
1338
|
+
start_date=data_provider._start_date_data_source,
|
|
1339
|
+
end_date=backtest_date_range.end_date
|
|
1340
|
+
)
|
|
1335
1341
|
|
|
1336
1342
|
for _ in tqdm(
|
|
1337
1343
|
range(number_of_permutations),
|
|
@@ -1356,19 +1362,21 @@ class App:
|
|
|
1356
1362
|
self._data_providers = []
|
|
1357
1363
|
|
|
1358
1364
|
for combi in permutated_datasets:
|
|
1359
|
-
|
|
1365
|
+
data_source = combi[0]
|
|
1366
|
+
data_provider = PandasOHLCVDataProvider(
|
|
1367
|
+
dataframe=combi[1],
|
|
1368
|
+
symbol=data_source.symbol,
|
|
1369
|
+
market=data_source.market,
|
|
1370
|
+
window_size=data_source.window_size,
|
|
1371
|
+
time_frame=data_source.time_frame,
|
|
1372
|
+
data_provider_identifier=data_source
|
|
1373
|
+
.data_provider_identifier,
|
|
1374
|
+
pandas=data_source.pandas,
|
|
1375
|
+
)
|
|
1360
1376
|
# Add pandas ohlcv data provider to the data provider service
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
symbol=combi[0].symbol,
|
|
1365
|
-
market=combi[0].market,
|
|
1366
|
-
window_size=combi[0].window_size,
|
|
1367
|
-
time_frame=combi[0].time_frame,
|
|
1368
|
-
data_provider_identifier=dp_identifier,
|
|
1369
|
-
pandas=combi[0].pandas,
|
|
1370
|
-
),
|
|
1371
|
-
priority=1
|
|
1377
|
+
data_provider_service.register_data_provider(
|
|
1378
|
+
data_source=data_source,
|
|
1379
|
+
data_provider=data_provider
|
|
1372
1380
|
)
|
|
1373
1381
|
|
|
1374
1382
|
# Run the backtest with the permuted strategy
|
|
@@ -1378,7 +1386,7 @@ class App:
|
|
|
1378
1386
|
strategy=strategy,
|
|
1379
1387
|
snapshot_interval=SnapshotInterval.DAILY,
|
|
1380
1388
|
risk_free_rate=risk_free_rate,
|
|
1381
|
-
|
|
1389
|
+
skip_data_sources_initialization=True
|
|
1382
1390
|
)
|
|
1383
1391
|
|
|
1384
1392
|
# Add the results of the permuted backtest to the main backtest
|
|
@@ -1391,7 +1399,10 @@ class App:
|
|
|
1391
1399
|
real_metrics=backtest_metrics,
|
|
1392
1400
|
permutated_metrics=permuted_metrics,
|
|
1393
1401
|
ohlcv_permutated_datasets=permuted_datasets_ordered_by_symbol,
|
|
1394
|
-
ohlcv_original_datasets=original_datasets_ordered_by_symbol
|
|
1402
|
+
ohlcv_original_datasets=original_datasets_ordered_by_symbol,
|
|
1403
|
+
backtest_start_date=backtest_date_range.start_date,
|
|
1404
|
+
backtest_end_date=backtest_date_range.end_date,
|
|
1405
|
+
backtest_date_range_name=backtest_date_range.name
|
|
1395
1406
|
)
|
|
1396
1407
|
return permutation_test_metrics
|
|
1397
1408
|
|
|
@@ -4,6 +4,7 @@ from .monthly_returns_heatmap import get_monthly_returns_heatmap_chart
|
|
|
4
4
|
from .yearly_returns_barchart import get_yearly_returns_bar_chart
|
|
5
5
|
from .ohlcv_data_completeness import get_ohlcv_data_completeness_chart
|
|
6
6
|
from .entry_exist_signals import get_entry_and_exit_signals
|
|
7
|
+
from .line_chart import create_line_scatter
|
|
7
8
|
|
|
8
9
|
__all__ = [
|
|
9
10
|
"get_equity_curve_with_drawdown_chart",
|
|
@@ -12,4 +13,5 @@ __all__ = [
|
|
|
12
13
|
"get_yearly_returns_bar_chart",
|
|
13
14
|
"get_ohlcv_data_completeness_chart",
|
|
14
15
|
"get_entry_and_exit_signals",
|
|
16
|
+
"create_line_scatter",
|
|
15
17
|
]
|
|
@@ -34,7 +34,7 @@ from .utils import random_string, append_dict_as_row_to_csv, \
|
|
|
34
34
|
csv_to_list, StoppableThread, load_csv_into_dict, tqdm, \
|
|
35
35
|
is_timezone_aware, sync_timezones, get_timezone
|
|
36
36
|
from .backtesting import BacktestRun, BacktestSummaryMetrics, \
|
|
37
|
-
BacktestDateRange, Backtest, BacktestMetrics, \
|
|
37
|
+
BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
|
|
38
38
|
BacktestPermutationTest, BacktestEvaluationFocus
|
|
39
39
|
|
|
40
40
|
__all__ = [
|
|
@@ -140,5 +140,6 @@ __all__ = [
|
|
|
140
140
|
"is_jupyter_notebook",
|
|
141
141
|
"tqdm",
|
|
142
142
|
"DEFAULT_DATETIME_FORMAT",
|
|
143
|
-
"BacktestEvaluationFocus"
|
|
143
|
+
"BacktestEvaluationFocus",
|
|
144
|
+
'combine_backtests'
|
|
144
145
|
]
|
|
@@ -5,6 +5,7 @@ from .backtest_run import BacktestRun
|
|
|
5
5
|
from .backtest import Backtest
|
|
6
6
|
from .backtest_permutation_test import BacktestPermutationTest
|
|
7
7
|
from .backtest_evaluation_focuss import BacktestEvaluationFocus
|
|
8
|
+
from .combine_backtests import combine_backtests
|
|
8
9
|
|
|
9
10
|
__all__ = [
|
|
10
11
|
"Backtest",
|
|
@@ -13,5 +14,6 @@ __all__ = [
|
|
|
13
14
|
"BacktestMetrics",
|
|
14
15
|
"BacktestRun",
|
|
15
16
|
"BacktestPermutationTest",
|
|
16
|
-
"BacktestEvaluationFocus"
|
|
17
|
+
"BacktestEvaluationFocus",
|
|
18
|
+
"combine_backtests"
|
|
17
19
|
]
|
|
@@ -91,6 +91,27 @@ class Backtest:
|
|
|
91
91
|
return run
|
|
92
92
|
return None
|
|
93
93
|
|
|
94
|
+
def get_backtest_permutation_test(
|
|
95
|
+
self, date_range: BacktestDateRange
|
|
96
|
+
) -> Union[BacktestPermutationTest, None]:
|
|
97
|
+
"""
|
|
98
|
+
Retrieve a specific BacktestPermutationTest based on
|
|
99
|
+
the provided date range.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
date_range (BacktestDateRange): The date range to search for.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Union[BacktestPermutationTest, None]: The
|
|
106
|
+
matching BacktestPermutationTest if found,
|
|
107
|
+
otherwise None.
|
|
108
|
+
"""
|
|
109
|
+
for perm_test in self.backtest_permutation_tests:
|
|
110
|
+
if (perm_test.backtest_start_date == date_range.start_date and
|
|
111
|
+
perm_test.backtest_end_date == date_range.end_date):
|
|
112
|
+
return perm_test
|
|
113
|
+
return None
|
|
114
|
+
|
|
94
115
|
def get_all_backtest_metrics(self) -> List[BacktestMetrics]:
|
|
95
116
|
"""
|
|
96
117
|
Retrieve all BacktestMetrics from the backtest runs.
|
|
@@ -382,3 +403,15 @@ class Backtest:
|
|
|
382
403
|
)
|
|
383
404
|
for run in self.backtest_runs
|
|
384
405
|
]
|
|
406
|
+
|
|
407
|
+
def add_permutation_test(
|
|
408
|
+
self, permutation_test: BacktestPermutationTest
|
|
409
|
+
) -> None:
|
|
410
|
+
"""
|
|
411
|
+
Add a permutation test to the backtest.
|
|
412
|
+
|
|
413
|
+
Args:
|
|
414
|
+
permutation_test (BacktestPermutationTest): The permutation test
|
|
415
|
+
to add.
|
|
416
|
+
"""
|
|
417
|
+
self.backtest_permutation_tests.append(permutation_test)
|
|
@@ -165,6 +165,11 @@ class BacktestMetrics:
|
|
|
165
165
|
best_year: Tuple[float, date] = None
|
|
166
166
|
worst_month: Tuple[float, datetime] = None
|
|
167
167
|
worst_year: Tuple[float, date] = None
|
|
168
|
+
total_number_of_days: int = None
|
|
169
|
+
|
|
170
|
+
def __post_init__(self):
|
|
171
|
+
self.total_number_of_days = (self.backtest_end_date -
|
|
172
|
+
self.backtest_start_date).days
|
|
168
173
|
|
|
169
174
|
def to_dict(self) -> dict:
|
|
170
175
|
"""
|
|
@@ -42,6 +42,9 @@ class BacktestPermutationTest:
|
|
|
42
42
|
field(default_factory=dict)
|
|
43
43
|
ohlcv_original_datasets: Dict[str, pd.DataFrame] = \
|
|
44
44
|
field(default_factory=dict)
|
|
45
|
+
backtest_start_date: pd.Timestamp = None
|
|
46
|
+
backtest_end_date: pd.Timestamp = None
|
|
47
|
+
backtest_date_range_name: str = None
|
|
45
48
|
|
|
46
49
|
def compute_p_values(
|
|
47
50
|
self, metrics: List[str] = None, one_sided: bool = True
|
|
@@ -20,9 +20,18 @@ class BacktestSummaryMetrics:
|
|
|
20
20
|
total_net_gain (float): Total net gain from the backtest.
|
|
21
21
|
total_net_gain_percentage (float): Total net gain percentage
|
|
22
22
|
from the backtest.
|
|
23
|
+
average_total_net_gain (float): Average total net gain across
|
|
24
|
+
multiple backtests.
|
|
25
|
+
average_total_net_gain_percentage (float): Average total net gain
|
|
26
|
+
percentage across multiple backtests.
|
|
23
27
|
gross_loss (float): Total gross loss from all trades.
|
|
28
|
+
average_gross_loss (float): Average gross loss across
|
|
29
|
+
multiple backtests.
|
|
24
30
|
growth (float): Total growth from the backtest.
|
|
25
31
|
growth_percentage (float): Total growth percentage from the backtest.
|
|
32
|
+
average_growth (float): Average growth across multiple backtests.
|
|
33
|
+
average_growth_percentage (float): Average growth percentage across
|
|
34
|
+
multiple backtests.
|
|
26
35
|
trades_average_return (float): Average return per trade.
|
|
27
36
|
cagr (float): Compound annual growth rate of the backtest.
|
|
28
37
|
sharpe_ratio (float): Sharpe ratio, risk-adjusted return.
|
|
@@ -41,9 +50,14 @@ class BacktestSummaryMetrics:
|
|
|
41
50
|
"""
|
|
42
51
|
total_net_gain: float = None
|
|
43
52
|
total_net_gain_percentage: float = None
|
|
53
|
+
average_total_net_gain: float = None
|
|
54
|
+
average_total_net_gain_percentage: float = None
|
|
44
55
|
gross_loss: float = None
|
|
56
|
+
average_gross_loss: float = None
|
|
45
57
|
growth: float = None
|
|
46
58
|
growth_percentage: float = None
|
|
59
|
+
average_growth: float = None
|
|
60
|
+
average_growth_percentage: float = None
|
|
47
61
|
trades_average_return: float = None
|
|
48
62
|
cagr: float = None
|
|
49
63
|
sharpe_ratio: float = None
|
|
@@ -67,9 +81,15 @@ class BacktestSummaryMetrics:
|
|
|
67
81
|
return {
|
|
68
82
|
"total_net_gain": self.total_net_gain,
|
|
69
83
|
"total_net_gain_percentage": self.total_net_gain_percentage,
|
|
84
|
+
"average_total_net_gain": self.average_total_net_gain,
|
|
85
|
+
"average_total_net_gain_percentage":
|
|
86
|
+
self.average_total_net_gain_percentage,
|
|
70
87
|
"gross_loss": self.gross_loss,
|
|
88
|
+
"average_gross_loss": self.average_gross_loss,
|
|
71
89
|
"growth": self.growth,
|
|
72
90
|
"growth_percentage": self.growth_percentage,
|
|
91
|
+
"average_growth": self.average_growth,
|
|
92
|
+
"average_growth_percentage": self.average_growth_percentage,
|
|
73
93
|
"trades_average_return": self.trades_average_return,
|
|
74
94
|
"cagr": self.cagr,
|
|
75
95
|
"sharpe_ratio": self.sharpe_ratio,
|
|
@@ -120,7 +140,8 @@ class BacktestSummaryMetrics:
|
|
|
120
140
|
self.cumulative_exposure = other.cumulative_exposure
|
|
121
141
|
else:
|
|
122
142
|
self.cumulative_exposure = safe_mean(
|
|
123
|
-
self.cumulative_exposure,
|
|
143
|
+
self.cumulative_exposure,
|
|
144
|
+
other.cumulative_exposure
|
|
124
145
|
)
|
|
125
146
|
|
|
126
147
|
if self.exposure_ratio is None:
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from investing_algorithm_framework.domain.backtesting import Backtest, \
|
|
4
|
+
BacktestDateRange
|
|
5
|
+
from investing_algorithm_framework.domain.backtesting import \
|
|
6
|
+
BacktestSummaryMetrics
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def safe_weighted_mean(values, weights):
|
|
10
|
+
"""
|
|
11
|
+
Calculate the weighted mean of a list of values,
|
|
12
|
+
ignoring None values and weights <= 0.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
values (List[float | None]): List of values to average.
|
|
16
|
+
weights (List[float | None]): Corresponding weights for the values.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
float | None: The weighted mean, or None if no valid values.
|
|
20
|
+
"""
|
|
21
|
+
vals = [(v, w) for v, w in zip(values, weights) if
|
|
22
|
+
v is not None and w is not None and w > 0]
|
|
23
|
+
if not vals:
|
|
24
|
+
return None
|
|
25
|
+
total_weight = sum(w for _, w in vals)
|
|
26
|
+
return sum(
|
|
27
|
+
v * w for v, w in vals
|
|
28
|
+
) / total_weight if total_weight > 0 else None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def combine_backtests(
|
|
32
|
+
backtests: List[Backtest],
|
|
33
|
+
backtest_date_range: BacktestDateRange = None
|
|
34
|
+
) -> Backtest:
|
|
35
|
+
"""
|
|
36
|
+
Combine multiple backtests into a single backtest by aggregating
|
|
37
|
+
their results.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
backtests (List[Backtest]): List of Backtest instances to combine.
|
|
41
|
+
backtest_date_range (BacktestDateRange, optional): The date range
|
|
42
|
+
for the combined backtest.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Backtest: A new Backtest instance representing the combined results.
|
|
46
|
+
"""
|
|
47
|
+
backtest_metrics = []
|
|
48
|
+
backtest_runs = []
|
|
49
|
+
|
|
50
|
+
for backtest in backtests:
|
|
51
|
+
backtest_metric = None
|
|
52
|
+
backtest_run = None
|
|
53
|
+
|
|
54
|
+
if backtest_date_range is not None:
|
|
55
|
+
backtest_metric = \
|
|
56
|
+
backtest.get_backtest_metrics(backtest_date_range)
|
|
57
|
+
backtest_run = \
|
|
58
|
+
backtest.get_backtest_run(backtest_date_range)
|
|
59
|
+
else:
|
|
60
|
+
backtest_run = backtest.backtest_runs[0] \
|
|
61
|
+
if len(backtest.backtest_runs) > 0 else None
|
|
62
|
+
|
|
63
|
+
if backtest_run is not None:
|
|
64
|
+
backtest_metric = backtest_run.backtest_metrics
|
|
65
|
+
|
|
66
|
+
if backtest_metric is not None:
|
|
67
|
+
backtest_metrics.append(backtest_metric)
|
|
68
|
+
backtest_runs.append(backtest_run)
|
|
69
|
+
|
|
70
|
+
total_net_gain = sum(
|
|
71
|
+
b.total_net_gain for b in backtest_metrics
|
|
72
|
+
if b.total_net_gain is not None
|
|
73
|
+
)
|
|
74
|
+
average_total_net_gain = safe_weighted_mean(
|
|
75
|
+
[b.total_net_gain for b in backtest_metrics],
|
|
76
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
77
|
+
)
|
|
78
|
+
average_total_net_gain_percentage = safe_weighted_mean(
|
|
79
|
+
[b.total_net_gain_percentage for b in backtest_metrics],
|
|
80
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
81
|
+
)
|
|
82
|
+
total_net_gain_percentage = sum(
|
|
83
|
+
b.total_net_gain_percentage for b in backtest_metrics
|
|
84
|
+
if b.total_net_gain_percentage is not None
|
|
85
|
+
)
|
|
86
|
+
gross_loss = sum(
|
|
87
|
+
b.gross_loss for b in backtest_metrics
|
|
88
|
+
if b.gross_loss is not None
|
|
89
|
+
)
|
|
90
|
+
average_gross_loss = safe_weighted_mean(
|
|
91
|
+
[b.gross_loss for b in backtest_metrics],
|
|
92
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
93
|
+
)
|
|
94
|
+
growth = sum(
|
|
95
|
+
b.growth for b in backtest_metrics
|
|
96
|
+
if b.growth is not None
|
|
97
|
+
)
|
|
98
|
+
growth_percentage = sum(
|
|
99
|
+
b.growth_percentage for b in backtest_metrics
|
|
100
|
+
if b.growth_percentage is not None
|
|
101
|
+
)
|
|
102
|
+
average_growth = safe_weighted_mean(
|
|
103
|
+
[b.growth for b in backtest_metrics],
|
|
104
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
105
|
+
)
|
|
106
|
+
average_growth_percentage = safe_weighted_mean(
|
|
107
|
+
[b.growth_percentage for b in backtest_metrics],
|
|
108
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
109
|
+
)
|
|
110
|
+
trades_average_return = safe_weighted_mean(
|
|
111
|
+
[b.trades_average_return for b in backtest_metrics],
|
|
112
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
113
|
+
)
|
|
114
|
+
cagr = safe_weighted_mean(
|
|
115
|
+
[b.cagr for b in backtest_metrics],
|
|
116
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
117
|
+
)
|
|
118
|
+
sharp_ratio = safe_weighted_mean(
|
|
119
|
+
[b.sharpe_ratio for b in backtest_metrics],
|
|
120
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
121
|
+
)
|
|
122
|
+
sortino_ratio = safe_weighted_mean(
|
|
123
|
+
[b.sortino_ratio for b in backtest_metrics],
|
|
124
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
125
|
+
)
|
|
126
|
+
calmar_ratio = safe_weighted_mean(
|
|
127
|
+
[b.calmar_ratio for b in backtest_metrics],
|
|
128
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
129
|
+
)
|
|
130
|
+
profit_factor = safe_weighted_mean(
|
|
131
|
+
[b.profit_factor for b in backtest_metrics],
|
|
132
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
133
|
+
)
|
|
134
|
+
annual_volatility = safe_weighted_mean(
|
|
135
|
+
[b.annual_volatility for b in backtest_metrics],
|
|
136
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
137
|
+
)
|
|
138
|
+
max_drawdown = max(
|
|
139
|
+
(b.max_drawdown for b in backtest_metrics
|
|
140
|
+
if b.max_drawdown is not None), default=None
|
|
141
|
+
)
|
|
142
|
+
max_drawdown_duration = max(
|
|
143
|
+
(b.max_drawdown_duration for b in backtest_metrics
|
|
144
|
+
if b.max_drawdown_duration is not None), default=None
|
|
145
|
+
)
|
|
146
|
+
trades_per_year = safe_weighted_mean(
|
|
147
|
+
[b.trades_per_year for b in backtest_metrics],
|
|
148
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
149
|
+
)
|
|
150
|
+
win_rate = safe_weighted_mean(
|
|
151
|
+
[b.win_rate for b in backtest_metrics],
|
|
152
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
153
|
+
)
|
|
154
|
+
win_loss_ratio = safe_weighted_mean(
|
|
155
|
+
[b.win_loss_ratio for b in backtest_metrics],
|
|
156
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
157
|
+
)
|
|
158
|
+
number_of_trades = sum(
|
|
159
|
+
b.number_of_trades for b in backtest_metrics
|
|
160
|
+
if b.number_of_trades is not None
|
|
161
|
+
)
|
|
162
|
+
cumulative_exposure = safe_weighted_mean(
|
|
163
|
+
[b.cumulative_exposure for b in backtest_metrics],
|
|
164
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
165
|
+
)
|
|
166
|
+
exposure_ratio = safe_weighted_mean(
|
|
167
|
+
[b.exposure_ratio for b in backtest_metrics],
|
|
168
|
+
[b.total_number_of_days for b in backtest_metrics]
|
|
169
|
+
)
|
|
170
|
+
summary = BacktestSummaryMetrics(
|
|
171
|
+
total_net_gain=total_net_gain,
|
|
172
|
+
total_net_gain_percentage=total_net_gain_percentage,
|
|
173
|
+
average_total_net_gain=average_total_net_gain,
|
|
174
|
+
average_total_net_gain_percentage=average_total_net_gain_percentage,
|
|
175
|
+
gross_loss=gross_loss,
|
|
176
|
+
average_gross_loss=average_gross_loss,
|
|
177
|
+
growth=growth,
|
|
178
|
+
growth_percentage=growth_percentage,
|
|
179
|
+
average_growth=average_growth,
|
|
180
|
+
average_growth_percentage=average_growth_percentage,
|
|
181
|
+
trades_average_return=trades_average_return,
|
|
182
|
+
cagr=cagr,
|
|
183
|
+
sharpe_ratio=sharp_ratio,
|
|
184
|
+
sortino_ratio=sortino_ratio,
|
|
185
|
+
calmar_ratio=calmar_ratio,
|
|
186
|
+
profit_factor=profit_factor,
|
|
187
|
+
annual_volatility=annual_volatility,
|
|
188
|
+
max_drawdown=max_drawdown,
|
|
189
|
+
max_drawdown_duration=max_drawdown_duration,
|
|
190
|
+
trades_per_year=trades_per_year,
|
|
191
|
+
win_rate=win_rate,
|
|
192
|
+
win_loss_ratio=win_loss_ratio,
|
|
193
|
+
number_of_trades=number_of_trades,
|
|
194
|
+
cumulative_exposure=cumulative_exposure,
|
|
195
|
+
exposure_ratio=exposure_ratio
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
metadata = None
|
|
199
|
+
|
|
200
|
+
# Get first non-empty metadata
|
|
201
|
+
for backtest in backtests:
|
|
202
|
+
if backtest.metadata:
|
|
203
|
+
metadata = backtest.metadata
|
|
204
|
+
break
|
|
205
|
+
|
|
206
|
+
backtest = Backtest(
|
|
207
|
+
backtest_summary=summary,
|
|
208
|
+
metadata=metadata,
|
|
209
|
+
backtest_runs=backtest_runs
|
|
210
|
+
)
|
|
211
|
+
return backtest
|
|
@@ -322,6 +322,20 @@ class DataProviderService:
|
|
|
322
322
|
self.configuration_service = configuration_service
|
|
323
323
|
self.market_credential_service = market_credential_service
|
|
324
324
|
|
|
325
|
+
def get(self, data_source: DataSource) -> Optional[DataProvider]:
|
|
326
|
+
"""
|
|
327
|
+
Get a registered data provider by its data source.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
data_source (DataSource): The data source to get the
|
|
331
|
+
data provider for.
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
Optional[DataProvider]: The registered data provider for
|
|
335
|
+
the data source, or None if not found.
|
|
336
|
+
"""
|
|
337
|
+
return self.data_provider_index.get(data_source)
|
|
338
|
+
|
|
325
339
|
def get_data(
|
|
326
340
|
self,
|
|
327
341
|
data_source: DataSource,
|
|
@@ -578,6 +592,28 @@ class DataProviderService:
|
|
|
578
592
|
f"No data provider found for the given parameters: {params}"
|
|
579
593
|
)
|
|
580
594
|
|
|
595
|
+
def register_data_provider(
|
|
596
|
+
self, data_source: DataSource, data_provider: DataProvider
|
|
597
|
+
) -> DataProvider:
|
|
598
|
+
"""
|
|
599
|
+
Function to directly register a data provider for a given data source.
|
|
600
|
+
|
|
601
|
+
This method will not check if the data provider supports the
|
|
602
|
+
data source. It will directly register the data provider in the index.
|
|
603
|
+
|
|
604
|
+
Args:
|
|
605
|
+
data_source (DataSource): The data source to register the
|
|
606
|
+
data provider for.
|
|
607
|
+
data_provider (DataProvider): The data provider to register.
|
|
608
|
+
|
|
609
|
+
Returns:
|
|
610
|
+
DataProvider: The registered data provider.
|
|
611
|
+
"""
|
|
612
|
+
data_provider = data_provider.copy(data_source)
|
|
613
|
+
self.data_provider_index.data_providers_lookup[data_source] = \
|
|
614
|
+
data_provider
|
|
615
|
+
return data_provider
|
|
616
|
+
|
|
581
617
|
def add_data_provider(
|
|
582
618
|
self, data_provider: DataProvider, priority: int = 3
|
|
583
619
|
):
|
|
@@ -742,6 +778,15 @@ class DataProviderService:
|
|
|
742
778
|
|
|
743
779
|
return data_files
|
|
744
780
|
|
|
781
|
+
def get_all_registered_data_providers(self) -> List[DataProvider]:
|
|
782
|
+
"""
|
|
783
|
+
Function to get all registered data providers.
|
|
784
|
+
|
|
785
|
+
Returns:
|
|
786
|
+
List[DataProvider]: A list of all registered data providers.
|
|
787
|
+
"""
|
|
788
|
+
return self.data_provider_index.get_all()
|
|
789
|
+
|
|
745
790
|
def reset(self):
|
|
746
791
|
"""
|
|
747
792
|
Function to reset all the data providers and the data provider
|
|
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
|