investing-algorithm-framework 8.3.0__tar.gz → 8.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-8.3.0 → investing_algorithm_framework-8.5.0}/PKG-INFO +21 -9
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/README.md +19 -7
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/__init__.py +9 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/app.py +26 -2
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/context.py +62 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/backtest_report.py +7 -3
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +6 -3
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +4 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +31 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/strategy.py +26 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +1 -1
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +27 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/database/__init__.py +2 -1
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +33 -7
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +127 -35
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +5 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +32 -0
- investing_algorithm_framework-8.5.0/investing_algorithm_framework/notebook/__init__.py +3 -0
- investing_algorithm_framework-8.5.0/investing_algorithm_framework/notebook/magic.py +401 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/pyproject.toml +2 -2
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/LICENSE +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/blotter.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/fx.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/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.
|
|
3
|
+
Version: 8.5.0
|
|
4
4
|
Summary: A framework for creating trading bots
|
|
5
5
|
Author: MDUYN
|
|
6
6
|
Requires-Python: >=3.10,<4.0
|
|
@@ -13,7 +13,7 @@ Provides-Extra: alpha-vantage
|
|
|
13
13
|
Provides-Extra: polygon
|
|
14
14
|
Provides-Extra: yahoo
|
|
15
15
|
Requires-Dist: Flask (>=3.1.0)
|
|
16
|
-
Requires-Dist: Flask-Cors (>=3.0.9,<
|
|
16
|
+
Requires-Dist: Flask-Cors (>=3.0.9,<7.0.0)
|
|
17
17
|
Requires-Dist: Flask-Migrate (>=2.6.0)
|
|
18
18
|
Requires-Dist: SQLAlchemy (>=2.0.18)
|
|
19
19
|
Requires-Dist: alpha_vantage (>=3.0.0,<4.0.0) ; extra == "alpha-vantage" or extra == "all"
|
|
@@ -44,12 +44,18 @@ Description-Content-Type: text/markdown
|
|
|
44
44
|
</h1>
|
|
45
45
|
|
|
46
46
|
<p align="center">
|
|
47
|
-
<i align="center">Create trading strategies. Compare them side by side. Pick the best one
|
|
47
|
+
<i align="center">Create trading strategies. Compare them side by side. Pick the best one and Deploy 🚀</i>
|
|
48
48
|
</p>
|
|
49
49
|
|
|
50
50
|
<h4 align="center">
|
|
51
|
-
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml">
|
|
52
|
-
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=
|
|
51
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
52
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=linux&style=flat-square&logo=linux&logoColor=white" alt="linux main" style="height: 20px;">
|
|
53
|
+
</a>
|
|
54
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
55
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=macos&style=flat-square&logo=apple&logoColor=white" alt="macos main" style="height: 20px;">
|
|
56
|
+
</a>
|
|
57
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
58
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=windows&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
|
|
53
59
|
</a>
|
|
54
60
|
<a href="https://pypi.org/project/investing-algorithm-framework/">
|
|
55
61
|
<img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
|
|
@@ -102,7 +108,7 @@ Description-Content-Type: text/markdown
|
|
|
102
108
|
|
|
103
109
|
Most quant frameworks stop at "here's your backtest result." You get a number, maybe a chart, and then you're on your own figuring out which strategy is actually better.
|
|
104
110
|
|
|
105
|
-
This framework is built around the full loop: **create strategies → backtest
|
|
111
|
+
This framework is built around the full loop: **create strategies → vector backtest for signals analysis → compare them in a single report → event backtest the most promising strategies → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
|
|
106
112
|
|
|
107
113
|
<details open>
|
|
108
114
|
<summary>
|
|
@@ -110,6 +116,10 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
110
116
|
</summary> <br>
|
|
111
117
|
|
|
112
118
|
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
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
|
|
113
123
|
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
114
124
|
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
115
125
|
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
@@ -118,7 +128,8 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
118
128
|
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
119
129
|
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
120
130
|
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
121
|
-
-
|
|
131
|
+
- � **[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()`
|
|
132
|
+
- �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
122
133
|
|
|
123
134
|
</details>
|
|
124
135
|
|
|
@@ -306,13 +317,14 @@ report.save("my_report.html")
|
|
|
306
317
|
|---|---|
|
|
307
318
|
| **[Backtest Report Dashboard](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** | Self-contained HTML report with ranking tables, equity curves, metric charts, heatmaps, and strategy comparison |
|
|
308
319
|
| **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtesting)** | Realistic, order-by-order simulation |
|
|
309
|
-
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/
|
|
320
|
+
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
|
|
310
321
|
| **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
|
|
311
322
|
| **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
|
|
312
323
|
| **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
|
|
313
324
|
| **[Cloud Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** | Deploy to AWS Lambda, Azure Functions, or run as a web service |
|
|
314
325
|
| **[Market Data Providers](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Built-in providers for CCXT, Yahoo Finance, Alpha Vantage, and Polygon — or build your own |
|
|
315
326
|
| **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** | Fetch CSV, JSON, or Parquet from any URL with caching, date parsing, and pre/post-processing |
|
|
327
|
+
| **[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()` |
|
|
316
328
|
| **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
|
|
317
329
|
| **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
|
|
318
330
|
|
|
@@ -347,7 +359,7 @@ python -m unittest discover -s tests
|
|
|
347
359
|
|
|
348
360
|
- [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
|
|
349
361
|
- Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
|
|
350
|
-
- PRs go against the `
|
|
362
|
+
- PRs go against the `dev` branch
|
|
351
363
|
|
|
352
364
|
## Risk Disclaimer
|
|
353
365
|
|
|
@@ -3,12 +3,18 @@
|
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<i align="center">Create trading strategies. Compare them side by side. Pick the best one
|
|
6
|
+
<i align="center">Create trading strategies. Compare them side by side. Pick the best one and Deploy 🚀</i>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<h4 align="center">
|
|
10
|
-
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml">
|
|
11
|
-
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=
|
|
10
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
11
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=linux&style=flat-square&logo=linux&logoColor=white" alt="linux main" style="height: 20px;">
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
14
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=macos&style=flat-square&logo=apple&logoColor=white" alt="macos main" style="height: 20px;">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
|
|
17
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=windows&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
|
|
12
18
|
</a>
|
|
13
19
|
<a href="https://pypi.org/project/investing-algorithm-framework/">
|
|
14
20
|
<img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
|
|
@@ -61,7 +67,7 @@
|
|
|
61
67
|
|
|
62
68
|
Most quant frameworks stop at "here's your backtest result." You get a number, maybe a chart, and then you're on your own figuring out which strategy is actually better.
|
|
63
69
|
|
|
64
|
-
This framework is built around the full loop: **create strategies → backtest
|
|
70
|
+
This framework is built around the full loop: **create strategies → vector backtest for signals analysis → compare them in a single report → event backtest the most promising strategies → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
|
|
65
71
|
|
|
66
72
|
<details open>
|
|
67
73
|
<summary>
|
|
@@ -69,6 +75,10 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
69
75
|
</summary> <br>
|
|
70
76
|
|
|
71
77
|
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
78
|
+
- ⚡ **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
|
|
79
|
+
- 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
80
|
+
- 🔀 **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
|
|
81
|
+
- 🚀 **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
|
|
72
82
|
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
73
83
|
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
74
84
|
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
@@ -77,7 +87,8 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
77
87
|
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
78
88
|
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
79
89
|
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
80
|
-
-
|
|
90
|
+
- � **[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()`
|
|
91
|
+
- �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
81
92
|
|
|
82
93
|
</details>
|
|
83
94
|
|
|
@@ -265,13 +276,14 @@ report.save("my_report.html")
|
|
|
265
276
|
|---|---|
|
|
266
277
|
| **[Backtest Report Dashboard](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** | Self-contained HTML report with ranking tables, equity curves, metric charts, heatmaps, and strategy comparison |
|
|
267
278
|
| **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtesting)** | Realistic, order-by-order simulation |
|
|
268
|
-
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/
|
|
279
|
+
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
|
|
269
280
|
| **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
|
|
270
281
|
| **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
|
|
271
282
|
| **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
|
|
272
283
|
| **[Cloud Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** | Deploy to AWS Lambda, Azure Functions, or run as a web service |
|
|
273
284
|
| **[Market Data Providers](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Built-in providers for CCXT, Yahoo Finance, Alpha Vantage, and Polygon — or build your own |
|
|
274
285
|
| **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** | Fetch CSV, JSON, or Parquet from any URL with caching, date parsing, and pre/post-processing |
|
|
286
|
+
| **[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()` |
|
|
275
287
|
| **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
|
|
276
288
|
| **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
|
|
277
289
|
|
|
@@ -306,7 +318,7 @@ python -m unittest discover -s tests
|
|
|
306
318
|
|
|
307
319
|
- [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
|
|
308
320
|
- Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
|
|
309
|
-
- PRs go against the `
|
|
321
|
+
- PRs go against the `dev` branch
|
|
310
322
|
|
|
311
323
|
## Risk Disclaimer
|
|
312
324
|
|
|
@@ -254,4 +254,13 @@ __all__ = [
|
|
|
254
254
|
"VolumeBasedFill",
|
|
255
255
|
"FXRateProvider",
|
|
256
256
|
"StaticFXRateProvider",
|
|
257
|
+
"load_ipython_extension",
|
|
257
258
|
]
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def load_ipython_extension(ipython):
|
|
262
|
+
"""Allow ``%load_ext investing_algorithm_framework`` to register
|
|
263
|
+
the ``%backtest`` / ``%%backtest`` magic commands."""
|
|
264
|
+
from investing_algorithm_framework.notebook import load_ipython_extension \
|
|
265
|
+
as _load
|
|
266
|
+
_load(ipython)
|
|
@@ -279,10 +279,11 @@ class App:
|
|
|
279
279
|
|
|
280
280
|
if SQLALCHEMY_DATABASE_URI not in config \
|
|
281
281
|
or config[SQLALCHEMY_DATABASE_URI] is None:
|
|
282
|
-
|
|
282
|
+
db_path = os.path.join(
|
|
283
283
|
configuration_service.config[DATABASE_DIRECTORY_PATH],
|
|
284
284
|
configuration_service.config[DATABASE_NAME]
|
|
285
285
|
)
|
|
286
|
+
path = "sqlite:///" + db_path.replace("\\", "/")
|
|
286
287
|
configuration_service.add_value(SQLALCHEMY_DATABASE_URI, path)
|
|
287
288
|
|
|
288
289
|
def initialize_backtest_config(
|
|
@@ -368,10 +369,33 @@ class App:
|
|
|
368
369
|
logger.info(
|
|
369
370
|
f"Removing existing database at {database_path}"
|
|
370
371
|
)
|
|
372
|
+
|
|
373
|
+
# Dispose the existing engine to release file locks
|
|
374
|
+
# (required on Windows where locks are mandatory)
|
|
375
|
+
from investing_algorithm_framework.infrastructure.database \
|
|
376
|
+
import Session
|
|
377
|
+
from sqlalchemy.orm import close_all_sessions
|
|
378
|
+
close_all_sessions()
|
|
379
|
+
bind = Session.kw.get("bind")
|
|
380
|
+
|
|
381
|
+
if bind is not None:
|
|
382
|
+
|
|
383
|
+
try:
|
|
384
|
+
conn = bind.connect()
|
|
385
|
+
conn.invalidate()
|
|
386
|
+
conn.close()
|
|
387
|
+
except Exception:
|
|
388
|
+
pass
|
|
389
|
+
|
|
390
|
+
bind.dispose()
|
|
391
|
+
|
|
392
|
+
import gc
|
|
393
|
+
gc.collect()
|
|
394
|
+
|
|
371
395
|
os.remove(database_path)
|
|
372
396
|
|
|
373
397
|
# Create the sqlalchemy database uri
|
|
374
|
-
path =
|
|
398
|
+
path = "sqlite:///" + database_path.replace("\\", "/")
|
|
375
399
|
self.set_config(SQLALCHEMY_DATABASE_URI, path)
|
|
376
400
|
|
|
377
401
|
# Setup sql if needed
|
|
@@ -53,6 +53,7 @@ class Context:
|
|
|
53
53
|
self._blotter = None
|
|
54
54
|
self._fx_rate_provider = None
|
|
55
55
|
self._base_currency = None
|
|
56
|
+
self._recorded_values = {} # key -> list of (datetime, value)
|
|
56
57
|
|
|
57
58
|
def _validate_target_symbol(self, target_symbol, market=None):
|
|
58
59
|
"""
|
|
@@ -2334,3 +2335,64 @@ class Context:
|
|
|
2334
2335
|
list[Transaction]: Recorded transactions.
|
|
2335
2336
|
"""
|
|
2336
2337
|
return self._blotter.get_transactions()
|
|
2338
|
+
|
|
2339
|
+
def record(self, **kwargs):
|
|
2340
|
+
"""
|
|
2341
|
+
Record arbitrary key-value pairs at the current backtest timestamp.
|
|
2342
|
+
|
|
2343
|
+
This method allows you to store any custom indicator, metric, or
|
|
2344
|
+
variable during a backtest. Each key creates a time series of
|
|
2345
|
+
values that can be retrieved after the backtest completes via
|
|
2346
|
+
``BacktestRun.recorded_values``.
|
|
2347
|
+
|
|
2348
|
+
The values are stored as a list of ``(datetime, value)`` tuples
|
|
2349
|
+
per key, allowing you to track any indicator over time.
|
|
2350
|
+
|
|
2351
|
+
This method only records during backtesting. In live mode it is
|
|
2352
|
+
a no-op.
|
|
2353
|
+
|
|
2354
|
+
Args:
|
|
2355
|
+
**kwargs: Arbitrary key-value pairs to record. Keys are
|
|
2356
|
+
strings, values can be any type (float, int, str,
|
|
2357
|
+
dict, list, etc.).
|
|
2358
|
+
|
|
2359
|
+
Example::
|
|
2360
|
+
|
|
2361
|
+
def on_run(self, context, data):
|
|
2362
|
+
context.record(
|
|
2363
|
+
rsi=compute_rsi(data),
|
|
2364
|
+
sma_20=compute_sma(data, 20),
|
|
2365
|
+
signal_strength=0.85,
|
|
2366
|
+
)
|
|
2367
|
+
"""
|
|
2368
|
+
is_backtest = self.configuration_service.config.get(
|
|
2369
|
+
BACKTESTING_FLAG, False
|
|
2370
|
+
)
|
|
2371
|
+
|
|
2372
|
+
if not is_backtest:
|
|
2373
|
+
return
|
|
2374
|
+
|
|
2375
|
+
current_datetime = self.configuration_service.config.get(
|
|
2376
|
+
INDEX_DATETIME
|
|
2377
|
+
)
|
|
2378
|
+
|
|
2379
|
+
for key, value in kwargs.items():
|
|
2380
|
+
if key not in self._recorded_values:
|
|
2381
|
+
self._recorded_values[key] = []
|
|
2382
|
+
self._recorded_values[key].append((current_datetime, value))
|
|
2383
|
+
|
|
2384
|
+
def get_recorded_values(self):
|
|
2385
|
+
"""
|
|
2386
|
+
Get all recorded values from the context.
|
|
2387
|
+
|
|
2388
|
+
Returns:
|
|
2389
|
+
dict: A dictionary mapping keys to lists of
|
|
2390
|
+
``(datetime, value)`` tuples.
|
|
2391
|
+
"""
|
|
2392
|
+
return self._recorded_values
|
|
2393
|
+
|
|
2394
|
+
def clear_recorded_values(self):
|
|
2395
|
+
"""
|
|
2396
|
+
Clear all recorded values from the context.
|
|
2397
|
+
"""
|
|
2398
|
+
self._recorded_values = {}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import csv
|
|
3
3
|
import base64
|
|
4
|
+
import tempfile
|
|
4
5
|
import webbrowser
|
|
5
6
|
import logging
|
|
6
7
|
from dataclasses import dataclass, field
|
|
8
|
+
from pathlib import Path
|
|
7
9
|
from typing import List, Union
|
|
8
10
|
from datetime import datetime, timedelta
|
|
9
11
|
|
|
@@ -185,12 +187,14 @@ class BacktestReport:
|
|
|
185
187
|
if not self.html_report:
|
|
186
188
|
self.html_report = self._build_html()
|
|
187
189
|
|
|
188
|
-
path = "
|
|
190
|
+
path = os.path.join(tempfile.gettempdir(), "backtest_report.html")
|
|
189
191
|
with open(path, "w", encoding="utf-8") as f:
|
|
190
192
|
f.write(self.html_report)
|
|
191
193
|
|
|
194
|
+
file_uri = Path(path).as_uri()
|
|
195
|
+
|
|
192
196
|
if browser:
|
|
193
|
-
webbrowser.open(
|
|
197
|
+
webbrowser.open(file_uri)
|
|
194
198
|
return
|
|
195
199
|
|
|
196
200
|
try:
|
|
@@ -203,7 +207,7 @@ class BacktestReport:
|
|
|
203
207
|
except (NameError, ImportError):
|
|
204
208
|
pass
|
|
205
209
|
|
|
206
|
-
webbrowser.open(
|
|
210
|
+
webbrowser.open(file_uri)
|
|
207
211
|
|
|
208
212
|
def save(self, path):
|
|
209
213
|
if not self.html_report:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
import tempfile
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
import webbrowser
|
|
5
6
|
from dataclasses import dataclass
|
|
@@ -117,12 +118,14 @@ class BacktestReport:
|
|
|
117
118
|
self._create_html_report(backtest_date_range)
|
|
118
119
|
|
|
119
120
|
# Save the html report to a tmp location
|
|
120
|
-
path = "
|
|
121
|
+
path = os.path.join(tempfile.gettempdir(), "backtest_report.html")
|
|
121
122
|
with open(path, "w") as html_file:
|
|
122
123
|
html_file.write(self.html_report)
|
|
123
124
|
|
|
125
|
+
file_uri = Path(path).as_uri()
|
|
126
|
+
|
|
124
127
|
if browser:
|
|
125
|
-
webbrowser.open(
|
|
128
|
+
webbrowser.open(file_uri)
|
|
126
129
|
|
|
127
130
|
def in_jupyter_notebook():
|
|
128
131
|
try:
|
|
@@ -134,7 +137,7 @@ class BacktestReport:
|
|
|
134
137
|
if in_jupyter_notebook():
|
|
135
138
|
display(HTML(self.html_report))
|
|
136
139
|
else:
|
|
137
|
-
webbrowser.open(
|
|
140
|
+
webbrowser.open(file_uri)
|
|
138
141
|
|
|
139
142
|
def _create_html_report(self, backtest_date_range: BacktestDateRange):
|
|
140
143
|
"""
|
|
@@ -262,6 +262,10 @@ body { font-family:'Inter',-apple-system,sans-serif; background:var(--bg); color
|
|
|
262
262
|
.fin-hero-sub { font-size:0.88rem; color:var(--text-secondary); line-height:1.7; max-width:560px; margin:0 auto; }
|
|
263
263
|
.finterion-cta { display:inline-block; margin-top:1.25rem; padding:0.65rem 1.75rem; background:var(--accent); color:#000; font-weight:600; font-size:0.82rem; border-radius:8px; text-decoration:none; transition:opacity 0.15s; }
|
|
264
264
|
.finterion-cta:hover { opacity:0.85; }
|
|
265
|
+
.finterion-connect-btn { display:inline-block; margin-top:0.5rem; padding:0.55rem 1.5rem; background:transparent; color:var(--accent); font-weight:600; font-size:0.82rem; border-radius:8px; border:2px solid var(--accent); cursor:pointer; transition:all 0.15s; font-family:'Inter',sans-serif; }
|
|
266
|
+
.finterion-connect-btn:hover { background:var(--accent); color:#000; }
|
|
267
|
+
.fin-user-info { display:inline-flex; align-items:center; gap:0.5rem; margin-top:1rem; padding:0.5rem 1rem; background:var(--surface2); border:1px solid var(--border); border-radius:8px; font-size:0.8rem; color:var(--text-secondary); }
|
|
268
|
+
.fin-user-dot { width:8px; height:8px; border-radius:50%; background:#22c55e; flex-shrink:0; }
|
|
265
269
|
|
|
266
270
|
/* feature cards */
|
|
267
271
|
.fin-features { display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:1rem; margin-bottom:0.5rem; }
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
<style>
|
|
8
8
|
{{ css }}
|
|
9
9
|
</style>
|
|
10
|
+
<script src="https://finterion.com/sdk/finterion-auth.js"></script>
|
|
10
11
|
</head>
|
|
11
12
|
<body>
|
|
12
13
|
|
|
@@ -479,6 +480,13 @@
|
|
|
479
480
|
</p>
|
|
480
481
|
<a class="finterion-cta" href="https://finterion.com" target="_blank"
|
|
481
482
|
rel="noopener noreferrer">Get Started →</a>
|
|
483
|
+
<div style="margin-top:1.25rem">
|
|
484
|
+
<button id="connect-btn" class="finterion-connect-btn">Connect to Finterion</button>
|
|
485
|
+
</div>
|
|
486
|
+
<div id="finterion-user-info" class="fin-user-info" style="display:none">
|
|
487
|
+
<span class="fin-user-dot"></span>
|
|
488
|
+
Connected as <strong id="finterion-username"></strong>
|
|
489
|
+
</div>
|
|
482
490
|
</div>
|
|
483
491
|
|
|
484
492
|
{# Features #}
|
|
@@ -559,6 +567,29 @@ const RUN_LABELS = {{ run_labels | tojson }};
|
|
|
559
567
|
const BENCHMARKS = {{ benchmarks | tojson }};
|
|
560
568
|
// ===== STATIC JS =====
|
|
561
569
|
{{ js }}
|
|
570
|
+
|
|
571
|
+
// ===== FINTERION AUTH =====
|
|
572
|
+
(function() {
|
|
573
|
+
if (typeof FinterionAuth === 'undefined') return;
|
|
574
|
+
var auth = new FinterionAuth();
|
|
575
|
+
var btn = document.getElementById('connect-btn');
|
|
576
|
+
if (!btn) return;
|
|
577
|
+
btn.addEventListener('click', function() {
|
|
578
|
+
auth.login()
|
|
579
|
+
.then(function(user) {
|
|
580
|
+
var info = document.getElementById('finterion-user-info');
|
|
581
|
+
var name = document.getElementById('finterion-username');
|
|
582
|
+
if (info && name) {
|
|
583
|
+
name.textContent = user.username;
|
|
584
|
+
info.style.display = 'inline-flex';
|
|
585
|
+
}
|
|
586
|
+
btn.style.display = 'none';
|
|
587
|
+
})
|
|
588
|
+
.catch(function(err) {
|
|
589
|
+
console.log('Auth flow cancelled');
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
})();
|
|
562
593
|
</script>
|
|
563
594
|
|
|
564
595
|
<button class="compare-btn" id="compare-btn"
|
|
@@ -850,6 +850,32 @@ class TradingStrategy:
|
|
|
850
850
|
"""
|
|
851
851
|
return None
|
|
852
852
|
|
|
853
|
+
def generate_recorded_values(
|
|
854
|
+
self, data: Dict[str, Any]
|
|
855
|
+
) -> Union[Dict[str, pd.Series], None]:
|
|
856
|
+
"""
|
|
857
|
+
Optional method to generate recorded values for vectorized
|
|
858
|
+
backtesting. Override this to record arbitrary indicators,
|
|
859
|
+
metrics, or variables as time series during a vectorized
|
|
860
|
+
backtest.
|
|
861
|
+
|
|
862
|
+
Each key in the returned dict becomes a recorded variable
|
|
863
|
+
with the Series index as timestamps and the Series values
|
|
864
|
+
as the recorded data.
|
|
865
|
+
|
|
866
|
+
This is the vectorized equivalent of calling
|
|
867
|
+
``context.record()`` in event-driven backtests.
|
|
868
|
+
|
|
869
|
+
Args:
|
|
870
|
+
data (Dict[str, Any]): The market data for the strategy.
|
|
871
|
+
|
|
872
|
+
Returns:
|
|
873
|
+
Dict[str, Series] | None: A dictionary where keys are
|
|
874
|
+
variable names and values are pandas Series with the
|
|
875
|
+
recorded values. Return None to not record anything.
|
|
876
|
+
"""
|
|
877
|
+
return None
|
|
878
|
+
|
|
853
879
|
def on_trade_closed(self, context: Context, trade: Trade):
|
|
854
880
|
pass
|
|
855
881
|
|
|
@@ -50,7 +50,7 @@ def validate_and_create_checkpoints(
|
|
|
50
50
|
verbose_file_handle = None
|
|
51
51
|
|
|
52
52
|
if verbose_output_file is not None:
|
|
53
|
-
verbose_file_handle = open(verbose_output_file, 'w')
|
|
53
|
+
verbose_file_handle = open(verbose_output_file, 'w', encoding='utf-8')
|
|
54
54
|
|
|
55
55
|
def echo(msg):
|
|
56
56
|
verbose_file_handle.write(msg + "\n")
|
|
@@ -112,6 +112,7 @@ class BacktestRun:
|
|
|
112
112
|
metadata: Dict[str, str] = field(default_factory=dict)
|
|
113
113
|
signals: Dict[str, Dict[str, Any]] = field(default_factory=dict)
|
|
114
114
|
signal_events: List[Dict[str, Any]] = field(default_factory=list)
|
|
115
|
+
recorded_values: Dict[str, List] = field(default_factory=dict)
|
|
115
116
|
|
|
116
117
|
def to_dict(self) -> dict:
|
|
117
118
|
"""
|
|
@@ -167,6 +168,16 @@ class BacktestRun:
|
|
|
167
168
|
"date": ensure_iso(evt["date"])
|
|
168
169
|
} for evt in self.signal_events
|
|
169
170
|
],
|
|
171
|
+
"recorded_values": {
|
|
172
|
+
key: [
|
|
173
|
+
{
|
|
174
|
+
"datetime": ensure_iso(entry[0]),
|
|
175
|
+
"value": entry[1]
|
|
176
|
+
}
|
|
177
|
+
for entry in entries
|
|
178
|
+
]
|
|
179
|
+
for key, entries in self.recorded_values.items()
|
|
180
|
+
},
|
|
170
181
|
}
|
|
171
182
|
|
|
172
183
|
@staticmethod
|
|
@@ -330,10 +341,26 @@ class BacktestRun:
|
|
|
330
341
|
pass
|
|
331
342
|
signal_events.append(parsed)
|
|
332
343
|
|
|
344
|
+
# Parse recorded_values
|
|
345
|
+
raw_recorded = data.pop("recorded_values", {})
|
|
346
|
+
recorded_values = {}
|
|
347
|
+
for key, entries in raw_recorded.items():
|
|
348
|
+
parsed_entries = []
|
|
349
|
+
for entry in entries:
|
|
350
|
+
dt = entry.get("datetime")
|
|
351
|
+
if isinstance(dt, str):
|
|
352
|
+
try:
|
|
353
|
+
dt = datetime.fromisoformat(dt)
|
|
354
|
+
except (ValueError, TypeError):
|
|
355
|
+
pass
|
|
356
|
+
parsed_entries.append((dt, entry.get("value")))
|
|
357
|
+
recorded_values[key] = parsed_entries
|
|
358
|
+
|
|
333
359
|
return BacktestRun(
|
|
334
360
|
backtest_metrics=backtest_metrics,
|
|
335
361
|
signals=signals,
|
|
336
362
|
signal_events=signal_events,
|
|
363
|
+
recorded_values=recorded_values,
|
|
337
364
|
**data
|
|
338
365
|
)
|
|
339
366
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from .sql_alchemy import Session, setup_sqlalchemy, SQLBaseModel, \
|
|
2
|
-
create_all_tables, clear_db, SqliteDecimal
|
|
2
|
+
create_all_tables, clear_db, teardown_sqlalchemy, SqliteDecimal
|
|
3
3
|
|
|
4
4
|
__all__ = [
|
|
5
5
|
"Session",
|
|
@@ -7,5 +7,6 @@ __all__ = [
|
|
|
7
7
|
"SQLBaseModel",
|
|
8
8
|
"create_all_tables",
|
|
9
9
|
"clear_db",
|
|
10
|
+
"teardown_sqlalchemy",
|
|
10
11
|
"SqliteDecimal"
|
|
11
12
|
]
|
|
@@ -3,7 +3,7 @@ from decimal import Decimal
|
|
|
3
3
|
|
|
4
4
|
from sqlalchemy import create_engine, StaticPool, String
|
|
5
5
|
from sqlalchemy import inspect
|
|
6
|
-
from sqlalchemy.orm import DeclarativeBase, sessionmaker
|
|
6
|
+
from sqlalchemy.orm import DeclarativeBase, sessionmaker, close_all_sessions
|
|
7
7
|
from sqlalchemy import TypeDecorator
|
|
8
8
|
|
|
9
9
|
from investing_algorithm_framework.domain import SQLALCHEMY_DATABASE_URI, \
|
|
@@ -83,6 +83,34 @@ def create_all_tables():
|
|
|
83
83
|
SQLBaseModel.metadata.create_all(bind=Session().bind)
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
def teardown_sqlalchemy():
|
|
87
|
+
"""
|
|
88
|
+
Dispose the engine and close all sessions to release file locks.
|
|
89
|
+
This is essential on Windows where file locks are mandatory and
|
|
90
|
+
prevent deletion of SQLite database files while connections are open.
|
|
91
|
+
"""
|
|
92
|
+
close_all_sessions()
|
|
93
|
+
bind = Session.kw.get("bind")
|
|
94
|
+
|
|
95
|
+
if bind is not None:
|
|
96
|
+
|
|
97
|
+
# StaticPool._close_connection() is a no-op, so
|
|
98
|
+
# engine.dispose() alone won't close the underlying DBAPI
|
|
99
|
+
# connection. Use invalidate() which bypasses the pool's
|
|
100
|
+
# _close_connection and calls dialect.do_close() directly,
|
|
101
|
+
# ensuring the sqlite3 file lock is released on Windows.
|
|
102
|
+
try:
|
|
103
|
+
conn = bind.connect()
|
|
104
|
+
conn.invalidate()
|
|
105
|
+
conn.close()
|
|
106
|
+
except Exception:
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
bind.dispose()
|
|
110
|
+
|
|
111
|
+
Session.configure(bind=None)
|
|
112
|
+
|
|
113
|
+
|
|
86
114
|
from sqlalchemy import event
|
|
87
115
|
from sqlalchemy.orm import mapper
|
|
88
116
|
from datetime import timezone
|
|
@@ -98,6 +126,7 @@ def clear_db(db_uri):
|
|
|
98
126
|
Returns:
|
|
99
127
|
None
|
|
100
128
|
"""
|
|
129
|
+
engine = None
|
|
101
130
|
# Drop all tables before deleting file
|
|
102
131
|
try:
|
|
103
132
|
engine = create_engine(db_uri)
|
|
@@ -107,12 +136,9 @@ def clear_db(db_uri):
|
|
|
107
136
|
SQLBaseModel.metadata.drop_all(bind=engine)
|
|
108
137
|
except Exception as e:
|
|
109
138
|
logger.error(f"Error dropping tables: {e}")
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
# clear_mappers()
|
|
114
|
-
# except Exception:
|
|
115
|
-
# pass # ignore if not needed
|
|
139
|
+
finally:
|
|
140
|
+
if engine is not None:
|
|
141
|
+
engine.dispose()
|
|
116
142
|
|
|
117
143
|
|
|
118
144
|
@event.listens_for(mapper, "load")
|