investing-algorithm-framework 8.7.2__tar.gz → 8.7.3__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.7.2 → investing_algorithm_framework-8.7.3}/PKG-INFO +17 -17
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/README.md +16 -16
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/deploy_to_azure_function.py +107 -46
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/initialize_app.py +123 -14
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/.gitignore.template +11 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/app.py.template +1 -1
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/app_azure_function.py.template +35 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/app_web.py.template +1 -1
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +52 -0
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/azure_function_host.json.template +21 -0
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/data_providers.py.template +40 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/run_backtest.py.template +1 -1
- investing_algorithm_framework-8.7.3/investing_algorithm_framework/cli/templates/strategy.py.template +105 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest.py +11 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/generate.py +23 -11
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/pyproject.toml +1 -1
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -48
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -14
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -65
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -15
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -17
- investing_algorithm_framework-8.7.2/investing_algorithm_framework/cli/templates/strategy.py.template +0 -124
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/LICENSE +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/analysis/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/analysis/markdown.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/analysis/ranking.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/app.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/context.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/templates/dashboard.css +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/strategy.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/mcp_server.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/bundle.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/consistency.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/blotter.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/datetime_parsing.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/fx.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/custom_factor.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/factor.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/factors/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/factors/builtin.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/filter.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/pipeline/pipeline.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/backtesting/checkpoint_manifest.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/notebook/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/notebook/magic.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/data_providers/data.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/consistency.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/trades.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/pipeline/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/pipeline/pipeline_engine.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/pipeline/vector_pipeline_engine.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
- {investing_algorithm_framework-8.7.2 → investing_algorithm_framework-8.7.3}/investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: investing-algorithm-framework
|
|
3
|
-
Version: 8.7.
|
|
3
|
+
Version: 8.7.3
|
|
4
4
|
Summary: A framework for creating trading bots
|
|
5
5
|
Author: MDUYN
|
|
6
6
|
Requires-Python: >=3.10,<4.0
|
|
@@ -114,23 +114,23 @@ This framework is built around the full loop: **create strategies → vector bac
|
|
|
114
114
|
Features
|
|
115
115
|
</summary> <br>
|
|
116
116
|
|
|
117
|
-
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
117
|
+
- 📊 **[30+ Metrics](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/metrics)** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
118
118
|
- 🧮 **[Cross-Sectional Pipelines](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/pipelines)** — Rank, filter and score entire universes of symbols every iteration with a tidy factor table
|
|
119
|
-
- ⚡ **Vector Backtesting for Signal Analysis** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
|
|
120
|
-
- 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
121
|
-
- 🔀 **Permutation Testing / Monte Carlo Simulations** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
|
|
122
|
-
- 🚀 **Deployment** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
|
|
123
|
-
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
124
|
-
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
125
|
-
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
126
|
-
- 🗓️ **Monthly Heatmaps & Yearly Returns** — Calendar heatmap per strategy with return/growth toggles
|
|
127
|
-
- 🎯 **Return Scenario Projections** — Good, average, bad & very bad year projections from backtest data
|
|
128
|
-
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
129
|
-
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
130
|
-
- 📦 **Custom `.iafbt` Backtest Bundle Format** — An explicit, versioned, compressed, language-portable container (zstd + msgpack with magic-byte header) plus a separate parquet index for fast filtering without loading. ~21× smaller and ~27× fewer files than standard filebased directory layouts, with parallel I/O for fast load/save of large amounts of backtests.
|
|
131
|
-
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
132
|
-
-
|
|
133
|
-
-
|
|
119
|
+
- ⚡ **[Vector Backtesting for Signal Analysis](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
|
|
120
|
+
- 🏃 **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/event-backtesting)** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
121
|
+
- 🔀 **[Permutation Testing / Monte Carlo Simulations](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
|
|
122
|
+
- 🚀 **[Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
|
|
123
|
+
- ⚔️ **[Multi-Strategy Comparison](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Rank, filter & compare strategies in a single interactive report
|
|
124
|
+
- 🪟 **[Multi-Window Robustness](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Test across different time periods with window coverage analysis
|
|
125
|
+
- 📈 **[Equity & Drawdown Charts](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
126
|
+
- 🗓️ **[Monthly Heatmaps & Yearly Returns](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Calendar heatmap per strategy with return/growth toggles
|
|
127
|
+
- 🎯 **[Return Scenario Projections](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Good, average, bad & very bad year projections from backtest data
|
|
128
|
+
- 📉 **[Benchmark Comparison](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
129
|
+
- 📄 **[One-Click HTML Report](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Self-contained file, no server, dark & light theme, shareable
|
|
130
|
+
- 📦 **[Custom `.iafbt` Backtest Bundle Format](https://coding-kitties.github.io/investing-algorithm-framework/Data/backtest_data)** — An explicit, versioned, compressed, language-portable container (zstd + msgpack with magic-byte header) plus a separate parquet index for fast filtering without loading. ~21× smaller and ~27× fewer files than standard filebased directory layouts, with parallel I/O for fast load/save of large amounts of backtests.
|
|
131
|
+
- 🌐 **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
132
|
+
- 📝 **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** — Track any indicator or metric during backtests with `context.record()`
|
|
133
|
+
- 🚀 **[Build → Backtest → Deploy](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
134
134
|
|
|
135
135
|
</details>
|
|
136
136
|
|
|
@@ -70,23 +70,23 @@ This framework is built around the full loop: **create strategies → vector bac
|
|
|
70
70
|
Features
|
|
71
71
|
</summary> <br>
|
|
72
72
|
|
|
73
|
-
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
73
|
+
- 📊 **[30+ Metrics](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/metrics)** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
74
74
|
- 🧮 **[Cross-Sectional Pipelines](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/pipelines)** — Rank, filter and score entire universes of symbols every iteration with a tidy factor table
|
|
75
|
-
- ⚡ **Vector Backtesting for Signal Analysis** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
|
|
76
|
-
- 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
77
|
-
- 🔀 **Permutation Testing / Monte Carlo Simulations** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
|
|
78
|
-
- 🚀 **Deployment** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
|
|
79
|
-
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
80
|
-
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
81
|
-
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
82
|
-
- 🗓️ **Monthly Heatmaps & Yearly Returns** — Calendar heatmap per strategy with return/growth toggles
|
|
83
|
-
- 🎯 **Return Scenario Projections** — Good, average, bad & very bad year projections from backtest data
|
|
84
|
-
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
85
|
-
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
86
|
-
- 📦 **Custom `.iafbt` Backtest Bundle Format** — An explicit, versioned, compressed, language-portable container (zstd + msgpack with magic-byte header) plus a separate parquet index for fast filtering without loading. ~21× smaller and ~27× fewer files than standard filebased directory layouts, with parallel I/O for fast load/save of large amounts of backtests.
|
|
87
|
-
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
88
|
-
-
|
|
89
|
-
-
|
|
75
|
+
- ⚡ **[Vector Backtesting for Signal Analysis](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
|
|
76
|
+
- 🏃 **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/event-backtesting)** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
77
|
+
- 🔀 **[Permutation Testing / Monte Carlo Simulations](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
|
|
78
|
+
- 🚀 **[Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
|
|
79
|
+
- ⚔️ **[Multi-Strategy Comparison](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Rank, filter & compare strategies in a single interactive report
|
|
80
|
+
- 🪟 **[Multi-Window Robustness](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Test across different time periods with window coverage analysis
|
|
81
|
+
- 📈 **[Equity & Drawdown Charts](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
82
|
+
- 🗓️ **[Monthly Heatmaps & Yearly Returns](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Calendar heatmap per strategy with return/growth toggles
|
|
83
|
+
- 🎯 **[Return Scenario Projections](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Good, average, bad & very bad year projections from backtest data
|
|
84
|
+
- 📉 **[Benchmark Comparison](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
85
|
+
- 📄 **[One-Click HTML Report](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** — Self-contained file, no server, dark & light theme, shareable
|
|
86
|
+
- 📦 **[Custom `.iafbt` Backtest Bundle Format](https://coding-kitties.github.io/investing-algorithm-framework/Data/backtest_data)** — An explicit, versioned, compressed, language-portable container (zstd + msgpack with magic-byte header) plus a separate parquet index for fast filtering without loading. ~21× smaller and ~27× fewer files than standard filebased directory layouts, with parallel I/O for fast load/save of large amounts of backtests.
|
|
87
|
+
- 🌐 **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
88
|
+
- 📝 **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** — Track any indicator or metric during backtests with `context.record()`
|
|
89
|
+
- 🚀 **[Build → Backtest → Deploy](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
90
90
|
|
|
91
91
|
</details>
|
|
92
92
|
|
|
@@ -30,6 +30,51 @@ def generate_unique_resource_name(base_name):
|
|
|
30
30
|
return f"{base_name}{unique_suffix}".lower()
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
async def _wait_until_function_app_ready(
|
|
34
|
+
function_app_name,
|
|
35
|
+
resource_group_name,
|
|
36
|
+
timeout_seconds=300,
|
|
37
|
+
poll_interval_seconds=10,
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Poll `az functionapp show --query state` until the Function App
|
|
41
|
+
reports 'Running', or raise once `timeout_seconds` is exceeded.
|
|
42
|
+
|
|
43
|
+
This replaces the old hard-coded `time.sleep(60)` which both blocked
|
|
44
|
+
the event loop and frequently published before the host was ready
|
|
45
|
+
(causing silent SCM 503s).
|
|
46
|
+
"""
|
|
47
|
+
deadline = time.monotonic() + timeout_seconds
|
|
48
|
+
last_state = None
|
|
49
|
+
|
|
50
|
+
while time.monotonic() < deadline:
|
|
51
|
+
process = await asyncio.create_subprocess_exec(
|
|
52
|
+
"az", "functionapp", "show",
|
|
53
|
+
"--name", function_app_name,
|
|
54
|
+
"--resource-group", resource_group_name,
|
|
55
|
+
"--query", "state",
|
|
56
|
+
"-o", "tsv",
|
|
57
|
+
stdout=asyncio.subprocess.PIPE,
|
|
58
|
+
stderr=asyncio.subprocess.PIPE,
|
|
59
|
+
)
|
|
60
|
+
stdout, _ = await process.communicate()
|
|
61
|
+
state = stdout.decode().strip()
|
|
62
|
+
|
|
63
|
+
if state and state != last_state:
|
|
64
|
+
print(f"Function App state: {state}")
|
|
65
|
+
last_state = state
|
|
66
|
+
|
|
67
|
+
if state == "Running":
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
await asyncio.sleep(poll_interval_seconds)
|
|
71
|
+
|
|
72
|
+
raise TimeoutError(
|
|
73
|
+
f"Function App '{function_app_name}' did not reach 'Running' "
|
|
74
|
+
f"state within {timeout_seconds}s (last seen: {last_state!r})."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
33
78
|
def ensure_azure_functools():
|
|
34
79
|
"""
|
|
35
80
|
Function to ensure that the Azure Functions Core Tools are installed.
|
|
@@ -128,77 +173,93 @@ async def publish_function_app(
|
|
|
128
173
|
"""
|
|
129
174
|
print(f"Publishing Function App {function_app_name}")
|
|
130
175
|
|
|
131
|
-
# Wait for
|
|
132
|
-
|
|
176
|
+
# Wait for the Function App to report a 'Running' state instead of
|
|
177
|
+
# blindly sleeping. The first deployment can take a while because the
|
|
178
|
+
# Linux Consumption host is provisioned lazily.
|
|
179
|
+
await _wait_until_function_app_ready(
|
|
180
|
+
function_app_name=function_app_name,
|
|
181
|
+
resource_group_name=resource_group_name,
|
|
182
|
+
timeout_seconds=300,
|
|
183
|
+
)
|
|
133
184
|
|
|
134
185
|
try:
|
|
135
|
-
# Step 1:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
# Wait for the subprocess to finish
|
|
141
|
-
_, stderr = await process.communicate()
|
|
142
|
-
|
|
143
|
-
# Check the return code
|
|
144
|
-
if process.returncode != 0:
|
|
145
|
-
|
|
146
|
-
if stderr is not None:
|
|
147
|
-
raise Exception(
|
|
148
|
-
f"Error publishing Function App: {stderr.decode().strip()}"
|
|
149
|
-
)
|
|
150
|
-
else:
|
|
151
|
-
raise Exception("Error publishing Function App")
|
|
152
|
-
|
|
153
|
-
print(f"Function App {function_app_name} published successfully.")
|
|
154
|
-
|
|
155
|
-
# Step 2: Add app settings
|
|
186
|
+
# Step 1: Push app settings BEFORE publishing so the worker has
|
|
187
|
+
# the storage credentials available on first cold start.
|
|
188
|
+
print("Setting AZURE_STORAGE_* app settings...")
|
|
156
189
|
add_settings_process = await asyncio.create_subprocess_exec(
|
|
157
190
|
"az", "functionapp", "config", "appsettings", "set",
|
|
158
191
|
"--name", function_app_name,
|
|
192
|
+
"--resource-group", resource_group_name,
|
|
159
193
|
"--settings",
|
|
160
194
|
f"AZURE_STORAGE_CONNECTION_STRING={storage_connection_string}",
|
|
161
195
|
f"AZURE_STORAGE_CONTAINER_NAME={storage_container_name}",
|
|
162
|
-
"
|
|
196
|
+
"SCM_DO_BUILD_DURING_DEPLOYMENT=true",
|
|
197
|
+
"ENABLE_ORYX_BUILD=true",
|
|
198
|
+
stdout=asyncio.subprocess.PIPE,
|
|
199
|
+
stderr=asyncio.subprocess.PIPE,
|
|
163
200
|
)
|
|
164
201
|
_, stderr1 = await add_settings_process.communicate()
|
|
165
202
|
|
|
166
203
|
if add_settings_process.returncode != 0:
|
|
204
|
+
raise Exception(
|
|
205
|
+
"Error adding app settings: " +
|
|
206
|
+
(stderr1.decode().strip() if stderr1 else "")
|
|
207
|
+
)
|
|
208
|
+
print("App settings configured successfully.")
|
|
167
209
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
else:
|
|
173
|
-
raise Exception("Error adding App settings")
|
|
174
|
-
|
|
210
|
+
# Step 2: Publish the Azure Function App. `--build remote --python`
|
|
211
|
+
# is *required* on Linux Consumption: native wheels (pandas, numpy,
|
|
212
|
+
# msgpack, polars, ...) must be built on the function host's libc/
|
|
213
|
+
# arch, otherwise the host crashes silently on import at cold start.
|
|
175
214
|
print(
|
|
176
|
-
"
|
|
215
|
+
"Running 'func azure functionapp publish' "
|
|
216
|
+
f"(remote build) for {function_app_name}..."
|
|
217
|
+
)
|
|
218
|
+
publish_process = await asyncio.create_subprocess_exec(
|
|
219
|
+
"func", "azure", "functionapp", "publish", function_app_name,
|
|
220
|
+
"--build", "remote",
|
|
221
|
+
"--python",
|
|
177
222
|
)
|
|
223
|
+
await publish_process.communicate()
|
|
224
|
+
|
|
225
|
+
if publish_process.returncode != 0:
|
|
226
|
+
raise Exception(
|
|
227
|
+
"Error publishing Function App. Re-run with the Azure "
|
|
228
|
+
"CLI directly to see full output:\n "
|
|
229
|
+
f"func azure functionapp publish {function_app_name} "
|
|
230
|
+
"--build remote --python"
|
|
231
|
+
)
|
|
232
|
+
print(f"Function App {function_app_name} published successfully.")
|
|
178
233
|
|
|
179
|
-
# Step 3: Update the
|
|
234
|
+
# Step 3: Update the CORS settings.
|
|
180
235
|
cors_process = await asyncio.create_subprocess_exec(
|
|
181
236
|
"az", "functionapp", "cors", "add",
|
|
182
237
|
"--name", function_app_name,
|
|
183
238
|
"--allowed-origins", "*",
|
|
184
|
-
"--resource-group", resource_group_name
|
|
239
|
+
"--resource-group", resource_group_name,
|
|
240
|
+
stdout=asyncio.subprocess.PIPE,
|
|
241
|
+
stderr=asyncio.subprocess.PIPE,
|
|
185
242
|
)
|
|
186
|
-
|
|
187
|
-
_, stderr1 = await add_settings_process.communicate()
|
|
243
|
+
_, cors_stderr = await cors_process.communicate()
|
|
188
244
|
|
|
189
245
|
if cors_process.returncode != 0:
|
|
246
|
+
# CORS already configured is not fatal.
|
|
247
|
+
print(
|
|
248
|
+
"Warning: could not add CORS rule: " +
|
|
249
|
+
(cors_stderr.decode().strip() if cors_stderr else "")
|
|
250
|
+
)
|
|
251
|
+
else:
|
|
252
|
+
print("CORS rule '*' added.")
|
|
190
253
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
print("All app settings have been added successfully.")
|
|
199
|
-
print("Function App creation completed successfully.")
|
|
254
|
+
print("Function App deployment completed successfully.")
|
|
255
|
+
print(
|
|
256
|
+
"\nTo stream live logs run:\n "
|
|
257
|
+
f"az webapp log tail --name {function_app_name} "
|
|
258
|
+
f"--resource-group {resource_group_name}"
|
|
259
|
+
)
|
|
200
260
|
except Exception as e:
|
|
201
261
|
print(f"Error publishing Function App: {e}")
|
|
262
|
+
raise
|
|
202
263
|
|
|
203
264
|
|
|
204
265
|
async def create_function_app(
|
|
@@ -268,7 +329,7 @@ async def create_function_app(
|
|
|
268
329
|
"--runtime",
|
|
269
330
|
"python",
|
|
270
331
|
"--runtime-version",
|
|
271
|
-
"3.
|
|
332
|
+
"3.11",
|
|
272
333
|
"--functions-version",
|
|
273
334
|
"4",
|
|
274
335
|
"--name",
|
|
@@ -1,7 +1,37 @@
|
|
|
1
|
+
import json
|
|
1
2
|
import os
|
|
2
3
|
from enum import Enum
|
|
3
4
|
|
|
4
5
|
|
|
6
|
+
# Notebook stubs created in `notebooks/` by `init`. Each entry is
|
|
7
|
+
# (filename, first-markdown-cell-title) and mirrors the recommended
|
|
8
|
+
# research workflow documented in
|
|
9
|
+
# docusaurus/docs/Getting Started/application-setup.md.
|
|
10
|
+
RECOMMENDED_NOTEBOOKS = [
|
|
11
|
+
("01_data_exploration.ipynb",
|
|
12
|
+
"# 01 — Data Exploration\n\nDownload OHLCV, inspect coverage, "
|
|
13
|
+
"detect and fill gaps."),
|
|
14
|
+
("02_backtest_baseline.ipynb",
|
|
15
|
+
"# 02 — Baseline Backtest\n\nSingle vector backtest of the strategy "
|
|
16
|
+
"with default parameters and HTML report."),
|
|
17
|
+
("03_in_sample_param_grid_search.ipynb",
|
|
18
|
+
"# 03 — In-Sample Parameter Grid Search\n\nGrid search across "
|
|
19
|
+
"thousands of parameter combinations on the in-sample window."),
|
|
20
|
+
("04_out_of_sample_param_grid_search.ipynb",
|
|
21
|
+
"# 04 — Out-of-Sample Parameter Grid Search\n\nRe-run top in-sample "
|
|
22
|
+
"candidates on the held-out out-of-sample window."),
|
|
23
|
+
("05_overfitting_analysis.ipynb",
|
|
24
|
+
"# 05 — Overfitting Analysis\n\nCompare in-sample vs out-of-sample "
|
|
25
|
+
"performance, walk-forward / permutation checks."),
|
|
26
|
+
("06_event_backtests.ipynb",
|
|
27
|
+
"# 06 — Event-Driven Backtests\n\nValidate the final picks with the "
|
|
28
|
+
"event-driven engine (fees, slippage, fills)."),
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
# Empty cache/output directories created in the project root.
|
|
32
|
+
RECOMMENDED_DIRS = ["data", "backtest_results", "reports", "resources"]
|
|
33
|
+
|
|
34
|
+
|
|
5
35
|
class AppType(Enum):
|
|
6
36
|
DEFAULT = "DEFAULT"
|
|
7
37
|
DEFAULT_WEB = "DEFAULT_WEB"
|
|
@@ -100,6 +130,71 @@ def create_file_from_template(template_path, output_path, replace=False):
|
|
|
100
130
|
file.write(template)
|
|
101
131
|
|
|
102
132
|
|
|
133
|
+
def _create_empty_notebook(file_path, title_markdown, replace=False):
|
|
134
|
+
"""
|
|
135
|
+
Create a minimal Jupyter notebook (nbformat 4) with a single
|
|
136
|
+
markdown title cell.
|
|
137
|
+
"""
|
|
138
|
+
if os.path.exists(file_path):
|
|
139
|
+
if replace:
|
|
140
|
+
os.remove(file_path)
|
|
141
|
+
else:
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
notebook = {
|
|
145
|
+
"cells": [
|
|
146
|
+
{
|
|
147
|
+
"cell_type": "markdown",
|
|
148
|
+
"metadata": {},
|
|
149
|
+
"source": title_markdown,
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"metadata": {
|
|
153
|
+
"kernelspec": {
|
|
154
|
+
"display_name": "Python 3",
|
|
155
|
+
"language": "python",
|
|
156
|
+
"name": "python3",
|
|
157
|
+
},
|
|
158
|
+
"language_info": {"name": "python"},
|
|
159
|
+
},
|
|
160
|
+
"nbformat": 4,
|
|
161
|
+
"nbformat_minor": 5,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
with open(file_path, "w") as file:
|
|
165
|
+
json.dump(notebook, file, indent=1)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _scaffold_recommended_layout(path, replace=False):
|
|
169
|
+
"""
|
|
170
|
+
Create the directories and notebook stubs that are part of the
|
|
171
|
+
recommended project layout but not directly tied to a specific
|
|
172
|
+
deployment target (default, web, AWS Lambda, Azure Function).
|
|
173
|
+
|
|
174
|
+
Creates:
|
|
175
|
+
notebooks/ with 6 stub research notebooks
|
|
176
|
+
data/ cache for downloaded market data
|
|
177
|
+
backtest_results/ saved backtest bundles
|
|
178
|
+
reports/ generated HTML/CSV reports
|
|
179
|
+
resources/ misc assets (databases, configs)
|
|
180
|
+
"""
|
|
181
|
+
notebooks_path = os.path.join(path, "notebooks")
|
|
182
|
+
create_directory(notebooks_path)
|
|
183
|
+
|
|
184
|
+
for filename, title_markdown in RECOMMENDED_NOTEBOOKS:
|
|
185
|
+
_create_empty_notebook(
|
|
186
|
+
os.path.join(notebooks_path, filename),
|
|
187
|
+
title_markdown,
|
|
188
|
+
replace=replace,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
for directory_name in RECOMMENDED_DIRS:
|
|
192
|
+
directory_path = os.path.join(path, directory_name)
|
|
193
|
+
create_directory(directory_path)
|
|
194
|
+
# .gitkeep so the empty directory is committed
|
|
195
|
+
create_file(os.path.join(directory_path, ".gitkeep"))
|
|
196
|
+
|
|
197
|
+
|
|
103
198
|
def command(path=None, app_type="default", replace=False):
|
|
104
199
|
"""
|
|
105
200
|
Function to create an azure function app skeleton.
|
|
@@ -207,19 +302,22 @@ def create_default_app(path=None, replace=False):
|
|
|
207
302
|
os.path.join(path, "run_backtest.py"),
|
|
208
303
|
replace=replace
|
|
209
304
|
)
|
|
210
|
-
# Create the
|
|
305
|
+
# Create the strategies package
|
|
211
306
|
create_directory(os.path.join(path, "strategies"))
|
|
212
307
|
strategies_path = os.path.join(path, "strategies")
|
|
213
308
|
create_file(os.path.join(strategies_path, "__init__.py"))
|
|
214
309
|
create_file_from_template(
|
|
215
310
|
strategy_template_path,
|
|
216
|
-
os.path.join(strategies_path, "
|
|
311
|
+
os.path.join(strategies_path, "my_strategy.py")
|
|
217
312
|
)
|
|
313
|
+
# data_providers.py lives at the project root so app.py, notebooks
|
|
314
|
+
# and strategies can all import it as `from data_providers import ...`
|
|
218
315
|
create_file_from_template(
|
|
219
316
|
data_providers_template_path,
|
|
220
|
-
os.path.join(
|
|
317
|
+
os.path.join(path, "data_providers.py"),
|
|
221
318
|
replace=replace
|
|
222
319
|
)
|
|
320
|
+
_scaffold_recommended_layout(path, replace=replace)
|
|
223
321
|
gitignore_template_path = os.path.join(
|
|
224
322
|
os.path.dirname(current_script_path),
|
|
225
323
|
"templates",
|
|
@@ -311,19 +409,22 @@ def create_default_web_app(path=None, replace=False):
|
|
|
311
409
|
os.path.join(path, "run_backtest.py"),
|
|
312
410
|
replace=replace
|
|
313
411
|
)
|
|
314
|
-
# Create the
|
|
412
|
+
# Create the strategies package
|
|
315
413
|
create_directory(os.path.join(path, "strategies"))
|
|
316
414
|
strategies_path = os.path.join(path, "strategies")
|
|
317
415
|
create_file(os.path.join(strategies_path, "__init__.py"))
|
|
318
416
|
create_file_from_template(
|
|
319
417
|
strategy_template_path,
|
|
320
|
-
os.path.join(strategies_path, "
|
|
418
|
+
os.path.join(strategies_path, "my_strategy.py")
|
|
321
419
|
)
|
|
420
|
+
# data_providers.py lives at the project root so app.py, notebooks
|
|
421
|
+
# and strategies can all import it as `from data_providers import ...`
|
|
322
422
|
create_file_from_template(
|
|
323
423
|
data_providers_template_path,
|
|
324
|
-
os.path.join(
|
|
424
|
+
os.path.join(path, "data_providers.py"),
|
|
325
425
|
replace=replace
|
|
326
426
|
)
|
|
427
|
+
_scaffold_recommended_layout(path, replace=replace)
|
|
327
428
|
gitignore_template_path = os.path.join(
|
|
328
429
|
os.path.dirname(current_script_path),
|
|
329
430
|
"templates",
|
|
@@ -417,19 +518,22 @@ def create_aws_lambda_app(path=None, replace=False):
|
|
|
417
518
|
os.path.join(path, "run_backtest.py"),
|
|
418
519
|
replace=replace
|
|
419
520
|
)
|
|
420
|
-
# Create the
|
|
521
|
+
# Create the strategies package
|
|
421
522
|
create_directory(os.path.join(path, "strategies"))
|
|
422
523
|
strategies_path = os.path.join(path, "strategies")
|
|
423
524
|
create_file(os.path.join(strategies_path, "__init__.py"))
|
|
424
525
|
create_file_from_template(
|
|
425
526
|
strategy_template_path,
|
|
426
|
-
os.path.join(strategies_path, "
|
|
527
|
+
os.path.join(strategies_path, "my_strategy.py")
|
|
427
528
|
)
|
|
529
|
+
# data_providers.py lives at the project root so app.py, notebooks
|
|
530
|
+
# and strategies can all import it as `from data_providers import ...`
|
|
428
531
|
create_file_from_template(
|
|
429
532
|
data_providers_template_path,
|
|
430
|
-
os.path.join(
|
|
533
|
+
os.path.join(path, "data_providers.py"),
|
|
431
534
|
replace=replace
|
|
432
535
|
)
|
|
536
|
+
_scaffold_recommended_layout(path, replace=replace)
|
|
433
537
|
gitignore_template_path = os.path.join(
|
|
434
538
|
os.path.dirname(current_script_path),
|
|
435
539
|
"templates",
|
|
@@ -504,10 +608,12 @@ def create_azure_function_app(path=None, replace=False):
|
|
|
504
608
|
"templates",
|
|
505
609
|
"run_backtest.py.template"
|
|
506
610
|
)
|
|
507
|
-
#
|
|
611
|
+
# The Azure Functions Python v2 programming model requires the
|
|
612
|
+
# entry point to be named exactly `function_app.py` at the project
|
|
613
|
+
# root. Anything else and the host won't discover any triggers.
|
|
508
614
|
create_file_from_template(
|
|
509
615
|
azure_function_template_path,
|
|
510
|
-
os.path.join(path, "
|
|
616
|
+
os.path.join(path, "function_app.py"),
|
|
511
617
|
replace=replace
|
|
512
618
|
)
|
|
513
619
|
# Create the host.json file
|
|
@@ -568,19 +674,22 @@ def create_azure_function_app(path=None, replace=False):
|
|
|
568
674
|
os.path.join(path, "run_backtest.py"),
|
|
569
675
|
replace=replace
|
|
570
676
|
)
|
|
571
|
-
# Create the
|
|
677
|
+
# Create the strategies package
|
|
572
678
|
create_directory(os.path.join(path, "strategies"))
|
|
573
679
|
strategies_path = os.path.join(path, "strategies")
|
|
574
680
|
create_file(os.path.join(strategies_path, "__init__.py"))
|
|
575
681
|
create_file_from_template(
|
|
576
682
|
strategy_template_path,
|
|
577
|
-
os.path.join(strategies_path, "
|
|
683
|
+
os.path.join(strategies_path, "my_strategy.py")
|
|
578
684
|
)
|
|
685
|
+
# data_providers.py lives at the project root so app.py, notebooks
|
|
686
|
+
# and strategies can all import it as `from data_providers import ...`
|
|
579
687
|
create_file_from_template(
|
|
580
688
|
data_providers_template_path,
|
|
581
|
-
os.path.join(
|
|
689
|
+
os.path.join(path, "data_providers.py"),
|
|
582
690
|
replace=replace
|
|
583
691
|
)
|
|
692
|
+
_scaffold_recommended_layout(path, replace=replace)
|
|
584
693
|
gitignore_template_path = os.path.join(
|
|
585
694
|
os.path.dirname(current_script_path),
|
|
586
695
|
"templates",
|
|
@@ -176,3 +176,14 @@ cython_debug/
|
|
|
176
176
|
|
|
177
177
|
# Framework related files
|
|
178
178
|
# The following files are related to the investing_algorithm_framework framework.
|
|
179
|
+
|
|
180
|
+
# Local caches and generated outputs (the directories themselves are kept
|
|
181
|
+
# via .gitkeep, but their contents should not be committed).
|
|
182
|
+
data/*
|
|
183
|
+
!data/.gitkeep
|
|
184
|
+
backtest_results/*
|
|
185
|
+
!backtest_results/.gitkeep
|
|
186
|
+
reports/*
|
|
187
|
+
!reports/.gitkeep
|
|
188
|
+
resources/*
|
|
189
|
+
!resources/.gitkeep
|
|
@@ -3,7 +3,7 @@ from dotenv import load_dotenv
|
|
|
3
3
|
|
|
4
4
|
from investing_algorithm_framework import create_app, \
|
|
5
5
|
DEFAULT_LOGGING_CONFIG, Algorithm, PortfolioConfiguration
|
|
6
|
-
from strategies.
|
|
6
|
+
from strategies.my_strategy import MyTradingStrategy
|
|
7
7
|
|
|
8
8
|
load_dotenv()
|
|
9
9
|
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import logging.config
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
from investing_algorithm_framework import (
|
|
7
|
+
create_app,
|
|
8
|
+
AWSS3StorageStateHandler,
|
|
9
|
+
AWS_S3_STATE_BUCKET_NAME,
|
|
10
|
+
AWS_LAMBDA_LOGGING_CONFIG,
|
|
11
|
+
RESOURCE_DIRECTORY,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from strategies.my_strategy import MyTradingStrategy
|
|
15
|
+
|
|
16
|
+
load_dotenv()
|
|
17
|
+
logging.config.dictConfig(AWS_LAMBDA_LOGGING_CONFIG)
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
# Lambda's filesystem is read-only except for /tmp; route the framework's
|
|
21
|
+
# writable resources there.
|
|
22
|
+
app = create_app(
|
|
23
|
+
config={RESOURCE_DIRECTORY: os.path.join("/tmp", "resources")}
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# The S3 bucket is provisioned and exported as an env var by the
|
|
27
|
+
# `deploy_aws_lambda` CLI command.
|
|
28
|
+
app.add_state_handler(
|
|
29
|
+
AWSS3StorageStateHandler(bucket_name=os.getenv(AWS_S3_STATE_BUCKET_NAME))
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
app.add_market(market="bitvavo", trading_symbol="EUR", initial_balance=1000)
|
|
33
|
+
app.add_strategy(MyTradingStrategy)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def lambda_handler(event, context):
|
|
37
|
+
"""
|
|
38
|
+
AWS Lambda handler that runs a single iteration of the trading bot.
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
app.run(number_of_iterations=1)
|
|
42
|
+
return {
|
|
43
|
+
"statusCode": 200,
|
|
44
|
+
"body": "Trading strategy executed successfully.",
|
|
45
|
+
}
|
|
46
|
+
except Exception as exc: # noqa: BLE001
|
|
47
|
+
logger.exception(exc)
|
|
48
|
+
return {"statusCode": 500, "body": str(exc)}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import logging.config
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
from investing_algorithm_framework import (
|
|
7
|
+
create_app,
|
|
8
|
+
DEFAULT_LOGGING_CONFIG,
|
|
9
|
+
AzureBlobStorageStateHandler,
|
|
10
|
+
RESOURCE_DIRECTORY,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
from strategies.my_strategy import MyTradingStrategy
|
|
14
|
+
|
|
15
|
+
load_dotenv()
|
|
16
|
+
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|
|
17
|
+
|
|
18
|
+
# Azure Function workers can only write to /tmp at runtime; point the
|
|
19
|
+
# framework's resource directory there so SQLite/state files land in a
|
|
20
|
+
# writable location.
|
|
21
|
+
app = create_app(
|
|
22
|
+
config={RESOURCE_DIRECTORY: os.path.join("/tmp", "resources")}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Persist portfolio/state in Azure Blob Storage so the function is
|
|
26
|
+
# stateless across cold starts. Connection string + container name are
|
|
27
|
+
# read from app settings (configured by `deploy_to_azure_function`).
|
|
28
|
+
app.add_state_handler(AzureBlobStorageStateHandler())
|
|
29
|
+
|
|
30
|
+
app.add_market(
|
|
31
|
+
market="bitvavo",
|
|
32
|
+
trading_symbol="EUR",
|
|
33
|
+
initial_balance=1000,
|
|
34
|
+
)
|
|
35
|
+
app.add_strategy(MyTradingStrategy)
|
|
@@ -3,7 +3,7 @@ from dotenv import load_dotenv
|
|
|
3
3
|
|
|
4
4
|
from investing_algorithm_framework import create_app, \
|
|
5
5
|
DEFAULT_LOGGING_CONFIG, Algorithm
|
|
6
|
-
from strategies.
|
|
6
|
+
from strategies.my_strategy import MyTradingStrategy
|
|
7
7
|
|
|
8
8
|
load_dotenv()
|
|
9
9
|
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|