investing-algorithm-framework 8.3.0__tar.gz → 8.4.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.4.0}/PKG-INFO +31 -9
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/README.md +29 -7
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/app.py +23 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/context.py +62 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +4 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +31 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/strategy.py +26 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +1 -1
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +27 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/database/__init__.py +2 -1
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +33 -7
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +5 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +32 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/pyproject.toml +2 -2
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/LICENSE +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/dependency_container.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/blotter.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/fx.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.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.4.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.4.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
- {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.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.4.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,28 @@ 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%20(main)&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%20(main)&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%20(main)&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
|
|
59
|
+
</a>
|
|
60
|
+
<br>
|
|
61
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
62
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=linux%20(dev)&style=flat-square&logo=linux&logoColor=white" alt="linux dev" style="height: 20px;">
|
|
63
|
+
</a>
|
|
64
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
65
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=macos%20(dev)&style=flat-square&logo=apple&logoColor=white" alt="macos dev" style="height: 20px;">
|
|
66
|
+
</a>
|
|
67
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
68
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=windows%20(dev)&style=flat-square&logo=windows&logoColor=white" alt="windows dev" style="height: 20px;">
|
|
53
69
|
</a>
|
|
54
70
|
<a href="https://pypi.org/project/investing-algorithm-framework/">
|
|
55
71
|
<img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
|
|
@@ -102,7 +118,7 @@ Description-Content-Type: text/markdown
|
|
|
102
118
|
|
|
103
119
|
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
120
|
|
|
105
|
-
This framework is built around the full loop: **create strategies → backtest
|
|
121
|
+
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
122
|
|
|
107
123
|
<details open>
|
|
108
124
|
<summary>
|
|
@@ -110,6 +126,10 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
110
126
|
</summary> <br>
|
|
111
127
|
|
|
112
128
|
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
129
|
+
- ⚡ **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
|
|
130
|
+
- 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
131
|
+
- 🔀 **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
|
|
132
|
+
- 🚀 **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
133
|
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
114
134
|
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
115
135
|
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
@@ -118,7 +138,8 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
118
138
|
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
119
139
|
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
120
140
|
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
121
|
-
-
|
|
141
|
+
- � **[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()`
|
|
142
|
+
- �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
122
143
|
|
|
123
144
|
</details>
|
|
124
145
|
|
|
@@ -306,13 +327,14 @@ report.save("my_report.html")
|
|
|
306
327
|
|---|---|
|
|
307
328
|
| **[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
329
|
| **[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/
|
|
330
|
+
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
|
|
310
331
|
| **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
|
|
311
332
|
| **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
|
|
312
333
|
| **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
|
|
313
334
|
| **[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
335
|
| **[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
336
|
| **[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 |
|
|
337
|
+
| **[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
338
|
| **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
|
|
317
339
|
| **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
|
|
318
340
|
|
|
@@ -347,7 +369,7 @@ python -m unittest discover -s tests
|
|
|
347
369
|
|
|
348
370
|
- [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
|
|
349
371
|
- Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
|
|
350
|
-
- PRs go against the `
|
|
372
|
+
- PRs go against the `dev` branch
|
|
351
373
|
|
|
352
374
|
## Risk Disclaimer
|
|
353
375
|
|
|
@@ -3,12 +3,28 @@
|
|
|
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%20(main)&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%20(main)&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%20(main)&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
|
|
18
|
+
</a>
|
|
19
|
+
<br>
|
|
20
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
21
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=linux%20(dev)&style=flat-square&logo=linux&logoColor=white" alt="linux dev" style="height: 20px;">
|
|
22
|
+
</a>
|
|
23
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
24
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=macos%20(dev)&style=flat-square&logo=apple&logoColor=white" alt="macos dev" style="height: 20px;">
|
|
25
|
+
</a>
|
|
26
|
+
<a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
|
|
27
|
+
<img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=windows%20(dev)&style=flat-square&logo=windows&logoColor=white" alt="windows dev" style="height: 20px;">
|
|
12
28
|
</a>
|
|
13
29
|
<a href="https://pypi.org/project/investing-algorithm-framework/">
|
|
14
30
|
<img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
|
|
@@ -61,7 +77,7 @@
|
|
|
61
77
|
|
|
62
78
|
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
79
|
|
|
64
|
-
This framework is built around the full loop: **create strategies → backtest
|
|
80
|
+
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
81
|
|
|
66
82
|
<details open>
|
|
67
83
|
<summary>
|
|
@@ -69,6 +85,10 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
69
85
|
</summary> <br>
|
|
70
86
|
|
|
71
87
|
- 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
|
|
88
|
+
- ⚡ **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
|
|
89
|
+
- 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
|
|
90
|
+
- 🔀 **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
|
|
91
|
+
- 🚀 **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
92
|
- ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
|
|
73
93
|
- 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
|
|
74
94
|
- 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
|
|
@@ -77,7 +97,8 @@ This framework is built around the full loop: **create strategies → backtest t
|
|
|
77
97
|
- 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
|
|
78
98
|
- 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
|
|
79
99
|
- 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
|
|
80
|
-
-
|
|
100
|
+
- � **[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()`
|
|
101
|
+
- �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
|
|
81
102
|
|
|
82
103
|
</details>
|
|
83
104
|
|
|
@@ -265,13 +286,14 @@ report.save("my_report.html")
|
|
|
265
286
|
|---|---|
|
|
266
287
|
| **[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
288
|
| **[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/
|
|
289
|
+
| **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
|
|
269
290
|
| **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
|
|
270
291
|
| **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
|
|
271
292
|
| **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
|
|
272
293
|
| **[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
294
|
| **[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
295
|
| **[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 |
|
|
296
|
+
| **[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
297
|
| **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
|
|
276
298
|
| **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
|
|
277
299
|
|
|
@@ -306,7 +328,7 @@ python -m unittest discover -s tests
|
|
|
306
328
|
|
|
307
329
|
- [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
|
|
308
330
|
- Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
|
|
309
|
-
- PRs go against the `
|
|
331
|
+
- PRs go against the `dev` branch
|
|
310
332
|
|
|
311
333
|
## Risk Disclaimer
|
|
312
334
|
|
|
@@ -368,6 +368,29 @@ class App:
|
|
|
368
368
|
logger.info(
|
|
369
369
|
f"Removing existing database at {database_path}"
|
|
370
370
|
)
|
|
371
|
+
|
|
372
|
+
# Dispose the existing engine to release file locks
|
|
373
|
+
# (required on Windows where locks are mandatory)
|
|
374
|
+
from investing_algorithm_framework.infrastructure.database \
|
|
375
|
+
import Session
|
|
376
|
+
from sqlalchemy.orm import close_all_sessions
|
|
377
|
+
close_all_sessions()
|
|
378
|
+
bind = Session.kw.get("bind")
|
|
379
|
+
|
|
380
|
+
if bind is not None:
|
|
381
|
+
|
|
382
|
+
try:
|
|
383
|
+
conn = bind.connect()
|
|
384
|
+
conn.invalidate()
|
|
385
|
+
conn.close()
|
|
386
|
+
except Exception:
|
|
387
|
+
pass
|
|
388
|
+
|
|
389
|
+
bind.dispose()
|
|
390
|
+
|
|
391
|
+
import gc
|
|
392
|
+
gc.collect()
|
|
393
|
+
|
|
371
394
|
os.remove(database_path)
|
|
372
395
|
|
|
373
396
|
# Create the sqlalchemy database uri
|
|
@@ -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 = {}
|
|
@@ -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")
|
|
@@ -112,6 +112,8 @@ class EventBacktestService:
|
|
|
112
112
|
backtest_date_range=backtest_date_range,
|
|
113
113
|
number_of_runs=event_loop_service.total_number_of_runs,
|
|
114
114
|
risk_free_rate=risk_free_rate,
|
|
115
|
+
recorded_values=event_loop_service.context
|
|
116
|
+
.get_recorded_values(),
|
|
115
117
|
)
|
|
116
118
|
|
|
117
119
|
def generate_schedule(
|
|
@@ -175,6 +177,7 @@ class EventBacktestService:
|
|
|
175
177
|
backtest_date_range: BacktestDateRange,
|
|
176
178
|
number_of_runs: int,
|
|
177
179
|
risk_free_rate: float,
|
|
180
|
+
recorded_values: dict = None,
|
|
178
181
|
) -> BacktestRun:
|
|
179
182
|
"""
|
|
180
183
|
Create a BacktestRun from the current state after event loop execution.
|
|
@@ -184,6 +187,7 @@ class EventBacktestService:
|
|
|
184
187
|
backtest_date_range: The date range of the backtest.
|
|
185
188
|
number_of_runs: Total number of strategy executions.
|
|
186
189
|
risk_free_rate: Risk-free rate for metrics calculation.
|
|
190
|
+
recorded_values: Optional dict of recorded values from context.
|
|
187
191
|
|
|
188
192
|
Returns:
|
|
189
193
|
BacktestRun: The completed backtest run with metrics.
|
|
@@ -215,6 +219,7 @@ class EventBacktestService:
|
|
|
215
219
|
positions=self._position_repository.get_all(
|
|
216
220
|
{"portfolio": portfolio.id}
|
|
217
221
|
),
|
|
222
|
+
recorded_values=recorded_values or {},
|
|
218
223
|
)
|
|
219
224
|
|
|
220
225
|
# Calculate and add metrics
|
|
@@ -75,6 +75,9 @@ class VectorBacktestService:
|
|
|
75
75
|
scale_in_signals = strategy.generate_scale_in_signals(data)
|
|
76
76
|
scale_out_signals = strategy.generate_scale_out_signals(data)
|
|
77
77
|
|
|
78
|
+
# Generate optional recorded values
|
|
79
|
+
raw_recorded = strategy.generate_recorded_values(data)
|
|
80
|
+
|
|
78
81
|
if scale_in_signals is None:
|
|
79
82
|
scale_in_signals = buy_signals
|
|
80
83
|
|
|
@@ -798,6 +801,7 @@ class VectorBacktestService:
|
|
|
798
801
|
symbols=list(buy_signals.keys()),
|
|
799
802
|
signals=raw_signals,
|
|
800
803
|
signal_events=signal_events,
|
|
804
|
+
recorded_values=self._convert_recorded_values(raw_recorded),
|
|
801
805
|
)
|
|
802
806
|
|
|
803
807
|
# Create backtest metrics
|
|
@@ -806,6 +810,34 @@ class VectorBacktestService:
|
|
|
806
810
|
)
|
|
807
811
|
return run
|
|
808
812
|
|
|
813
|
+
@staticmethod
|
|
814
|
+
def _convert_recorded_values(raw_recorded):
|
|
815
|
+
"""
|
|
816
|
+
Convert recorded values from pandas Series to list-of-tuples format.
|
|
817
|
+
|
|
818
|
+
Args:
|
|
819
|
+
raw_recorded: Dict[str, pd.Series] or None from
|
|
820
|
+
strategy.generate_recorded_values().
|
|
821
|
+
|
|
822
|
+
Returns:
|
|
823
|
+
Dict[str, List[Tuple[datetime, Any]]]: Converted values.
|
|
824
|
+
"""
|
|
825
|
+
if raw_recorded is None:
|
|
826
|
+
return {}
|
|
827
|
+
|
|
828
|
+
recorded_values = {}
|
|
829
|
+
for key, series in raw_recorded.items():
|
|
830
|
+
entries = []
|
|
831
|
+
for ts, val in series.items():
|
|
832
|
+
dt = ts
|
|
833
|
+
if isinstance(dt, pd.Timestamp):
|
|
834
|
+
dt = dt.to_pydatetime()
|
|
835
|
+
if hasattr(dt, 'tzinfo') and dt.tzinfo is None:
|
|
836
|
+
dt = dt.replace(tzinfo=timezone.utc)
|
|
837
|
+
entries.append((dt, val))
|
|
838
|
+
recorded_values[key] = entries
|
|
839
|
+
return recorded_values
|
|
840
|
+
|
|
809
841
|
@staticmethod
|
|
810
842
|
def get_most_granular_ohlcv_data_source(data_sources):
|
|
811
843
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "investing-algorithm-framework"
|
|
3
|
-
version = "v8.
|
|
3
|
+
version = "v8.4.0"
|
|
4
4
|
description = "A framework for creating trading bots"
|
|
5
5
|
authors = ["MDUYN"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -12,7 +12,7 @@ python = ">=3.10,<4.0"
|
|
|
12
12
|
wrapt = ">=1.16.0"
|
|
13
13
|
Flask = ">=3.1.0"
|
|
14
14
|
Flask-Migrate = ">=2.6.0"
|
|
15
|
-
Flask-Cors = ">=3.0.9,<
|
|
15
|
+
Flask-Cors = ">=3.0.9,<7.0.0"
|
|
16
16
|
SQLAlchemy = ">=2.0.18"
|
|
17
17
|
marshmallow = ">=3.5.0"
|
|
18
18
|
ccxt = ">=4.2.48"
|
|
File without changes
|