investing-algorithm-framework 7.5.0__tar.gz → 7.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/PKG-INFO +250 -63
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/README.md +249 -62
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/__init__.py +8 -3
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/app.py +13 -14
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/context.py +70 -2
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/strategy.py +107 -110
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/dependency_container.py +2 -11
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/__init__.py +4 -4
- investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/backtesting/BacktestInitializer.py +7 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +1 -1
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +13 -17
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/data_source.py +14 -2
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +13 -1
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade.py +11 -1
- investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/positions/__init__.py +4 -0
- investing_algorithm_framework-7.7.0/investing_algorithm_framework/domain/positions/position_size.py +41 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/__init__.py +0 -4
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/__init__.py +1 -3
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +1 -1
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -2
- investing_algorithm_framework-7.7.0/investing_algorithm_framework/services/__init__.py +113 -0
- investing_algorithm_framework-7.7.0/investing_algorithm_framework/services/backtesting/backtest_service.py +569 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +16 -3
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/__init__.py +3 -1
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/drawdown.py +1 -1
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/exposure.py +2 -5
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/returns.py +34 -3
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_service.py +2 -32
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +2 -5
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +3 -3
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/pyproject.toml +1 -1
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/services/observable.py +0 -51
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/domain/services/observer.py +0 -19
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -7
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -2
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -322
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/unit_of_work/in_memory.py +0 -0
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/infrastructure/unit_of_work/sqlalchemy.py +0 -0
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/services/__init__.py +0 -39
- investing_algorithm_framework-7.5.0/investing_algorithm_framework/services/backtesting/backtest_service.py +0 -413
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/LICENSE +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/backtest_data_ranges.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/permutation.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/analysis/ranking.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/app_hook.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/eventloop.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/task.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/responses.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/cli.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/create_app.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/config.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/constants.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/event.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/strategy.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/download_data.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order/order_metadata.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/backtesting/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/repository_service.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
- {investing_algorithm_framework-7.5.0 → investing_algorithm_framework-7.7.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: investing-algorithm-framework
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.7.0
|
|
4
4
|
Summary: A framework for creating trading bots
|
|
5
5
|
Author: MDUYN
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -50,17 +50,6 @@ Description-Content-Type: text/markdown
|
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
The Investing Algorithm Framework is a Python-based framework built to streamline the entire lifecycle of quantitative trading strategies from signal generation and backtesting to live deployment.
|
|
53
|
-
It offers a complete quantitative workflow, featuring two dedicated backtesting engines:
|
|
54
|
-
|
|
55
|
-
* A vectorized backtest engine for fast signal research and prototyping
|
|
56
|
-
|
|
57
|
-
* An event-based backtest engine for realistic and accurate strategy evaluation
|
|
58
|
-
|
|
59
|
-
The framework supports live trading across multiple exchanges and offers flexible deployment options, including Azure Functions and AWS Lambda.
|
|
60
|
-
Designed for extensibility, it allows you to integrate custom strategies, data providers, and order executors, enabling support for any exchange or broker.
|
|
61
|
-
It natively supports multiple data formats, including OHLCV, ticker, and custom datasets with seamless compatibility for both Pandas and Polars DataFrames.
|
|
62
|
-
|
|
63
|
-
|
|
64
53
|
|
|
65
54
|
## Sponsors
|
|
66
55
|
|
|
@@ -79,6 +68,7 @@ It natively supports multiple data formats, including OHLCV, ticker, and custom
|
|
|
79
68
|
- [x] Event-Driven Backtest Engine: Accurate and realistic backtesting with event-driven architecture.
|
|
80
69
|
- [x] Vectorized Backtest Engine: Fast signal research and prototyping with vectorized operations.
|
|
81
70
|
- [x] Permutation testing: Run permutation tests to evaluate the strategy statistical significance.
|
|
71
|
+
- [x] Metric tracking and backtest reports evaluation/comparison: Track and compare key performance metrics like CAGR, Sharpe ratio, max drawdown, and more (See example usage for a complete list of metrics the framework collects).
|
|
82
72
|
- [x] Backtest Reporting: Generate detailed reports to analyse and compare backtests.
|
|
83
73
|
- [x] Live Trading: Execute trades in real-time with support for multiple exchanges via ccxt.
|
|
84
74
|
- [x] Portfolio Management: Manage portfolios, trades, and positions with persistence via SQLite.
|
|
@@ -88,6 +78,13 @@ It natively supports multiple data formats, including OHLCV, ticker, and custom
|
|
|
88
78
|
- [x] Web API: Interact with your bot via REST API.
|
|
89
79
|
- [x] PyIndicators Integration: Perform technical analysis directly on your dataframes.
|
|
90
80
|
- [x] Extensibility: Add custom strategies, data providers, order executors so you can connect your trading bot to your favorite exchange or broker.
|
|
81
|
+
- [x] Modular Design: Build your bot using modular components for easy customization and maintenance.
|
|
82
|
+
- [x] Multiple exchanges and brokers: **Detailed guides and API references to help you get started and make the most of the framework.
|
|
83
|
+
and offers flexible deployment options, including Azure Functions and AWS Lambda.
|
|
84
|
+
Designed for extensibility, it allows you to integrate custom strategies, data providers, and order executors, enabling support for any exchange or broker.
|
|
85
|
+
It natively supports multiple data formats, including OHLCV, ticker, and custom datasets with seamless compatibility for both Pandas and Polars DataFrames.
|
|
86
|
+
|
|
87
|
+
|
|
91
88
|
|
|
92
89
|
## 🚀 Quickstart
|
|
93
90
|
|
|
@@ -106,10 +103,10 @@ Run the following command to set up your project:
|
|
|
106
103
|
investing-algorithm-framewor init
|
|
107
104
|
```
|
|
108
105
|
|
|
109
|
-
For a
|
|
106
|
+
For a aws lambda compatible project, run:
|
|
110
107
|
|
|
111
108
|
```bash
|
|
112
|
-
investing-algorithm-framework init --
|
|
109
|
+
investing-algorithm-framework init --type aws_lambda
|
|
113
110
|
```
|
|
114
111
|
|
|
115
112
|
This will create:
|
|
@@ -133,74 +130,264 @@ the 20, 50 and 100 period exponential moving averages (EMA) and the
|
|
|
133
130
|
> You can install it using pip: pip install pyindicators.
|
|
134
131
|
|
|
135
132
|
```python
|
|
136
|
-
import
|
|
137
|
-
from
|
|
133
|
+
from typing import Dict, Any
|
|
134
|
+
from datetime import datetime, timezone
|
|
138
135
|
|
|
139
|
-
|
|
136
|
+
import pandas as pd
|
|
137
|
+
from pyindicators import ema, rsi, crossover, crossunder
|
|
140
138
|
|
|
141
|
-
from investing_algorithm_framework import
|
|
142
|
-
|
|
139
|
+
from investing_algorithm_framework import TradingStrategy, DataSource, \
|
|
140
|
+
TimeUnit, DataType, PositionSize, create_app, RESOURCE_DIRECTORY, \
|
|
141
|
+
BacktestDateRange, BacktestReport
|
|
143
142
|
|
|
144
|
-
load_dotenv()
|
|
145
|
-
logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
|
|
146
|
-
logger = logging.getLogger(__name__)
|
|
147
143
|
|
|
148
|
-
|
|
149
|
-
# Registered bitvavo market, credentials are read from .env file by default
|
|
150
|
-
app.add_market(market="BITVAVO", trading_symbol="EUR", initial_balance=100)
|
|
151
|
-
|
|
152
|
-
class MyStrategy(TradingStrategy):
|
|
153
|
-
interval = 2
|
|
144
|
+
class RSIEMACrossoverStrategy(TradingStrategy):
|
|
154
145
|
time_unit = TimeUnit.HOUR
|
|
155
|
-
|
|
156
|
-
|
|
146
|
+
interval = 2
|
|
147
|
+
symbols = ["BTC"]
|
|
148
|
+
position_sizes = [
|
|
149
|
+
PositionSize(
|
|
150
|
+
symbol="BTC", percentage_of_portfolio=20.0
|
|
151
|
+
),
|
|
152
|
+
PositionSize(
|
|
153
|
+
symbol="ETH", percentage_of_portfolio=20.0
|
|
154
|
+
)
|
|
157
155
|
]
|
|
158
|
-
symbols = ["BTC/EUR"]
|
|
159
156
|
|
|
160
|
-
def
|
|
157
|
+
def __init__(
|
|
158
|
+
self,
|
|
159
|
+
time_unit: TimeUnit,
|
|
160
|
+
interval: int,
|
|
161
|
+
market: str,
|
|
162
|
+
rsi_time_frame: str,
|
|
163
|
+
rsi_period: int,
|
|
164
|
+
rsi_overbought_threshold,
|
|
165
|
+
rsi_oversold_threshold,
|
|
166
|
+
ema_time_frame,
|
|
167
|
+
ema_short_period,
|
|
168
|
+
ema_long_period,
|
|
169
|
+
ema_cross_lookback_window: int = 10
|
|
170
|
+
):
|
|
171
|
+
self.rsi_time_frame = rsi_time_frame
|
|
172
|
+
self.rsi_period = rsi_period
|
|
173
|
+
self.rsi_result_column = f"rsi_{self.rsi_period}"
|
|
174
|
+
self.rsi_overbought_threshold = rsi_overbought_threshold
|
|
175
|
+
self.rsi_oversold_threshold = rsi_oversold_threshold
|
|
176
|
+
self.ema_time_frame = ema_time_frame
|
|
177
|
+
self.ema_short_result_column = f"ema_{ema_short_period}"
|
|
178
|
+
self.ema_long_result_column = f"ema_{ema_long_period}"
|
|
179
|
+
self.ema_crossunder_result_column = "ema_crossunder"
|
|
180
|
+
self.ema_crossover_result_column = "ema_crossover"
|
|
181
|
+
self.ema_short_period = ema_short_period
|
|
182
|
+
self.ema_long_period = ema_long_period
|
|
183
|
+
self.ema_cross_lookback_window = ema_cross_lookback_window
|
|
184
|
+
data_sources = []
|
|
185
|
+
|
|
186
|
+
for symbol in self.symbols:
|
|
187
|
+
full_symbol = f"{symbol}/EUR"
|
|
188
|
+
data_sources.append(
|
|
189
|
+
DataSource(
|
|
190
|
+
identifier=f"{symbol}_rsi_data",
|
|
191
|
+
data_type=DataType.OHLCV,
|
|
192
|
+
time_frame=self.rsi_time_frame,
|
|
193
|
+
market=market,
|
|
194
|
+
symbol=full_symbol,
|
|
195
|
+
pandas=True,
|
|
196
|
+
window_size=800
|
|
197
|
+
)
|
|
198
|
+
)
|
|
199
|
+
data_sources.append(
|
|
200
|
+
DataSource(
|
|
201
|
+
identifier=f"{symbol}_ema_data",
|
|
202
|
+
data_type=DataType.OHLCV,
|
|
203
|
+
time_frame=self.ema_time_frame,
|
|
204
|
+
market=market,
|
|
205
|
+
symbol=full_symbol,
|
|
206
|
+
pandas=True,
|
|
207
|
+
window_size=800
|
|
208
|
+
)
|
|
209
|
+
)
|
|
161
210
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
211
|
+
super().__init__(
|
|
212
|
+
data_sources=data_sources, time_unit=time_unit, interval=interval
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
self.buy_signal_dates = {}
|
|
216
|
+
self.sell_signal_dates = {}
|
|
217
|
+
|
|
218
|
+
for symbol in self.symbols:
|
|
219
|
+
self.buy_signal_dates[symbol] = []
|
|
220
|
+
self.sell_signal_dates[symbol] = []
|
|
221
|
+
|
|
222
|
+
def _prepare_indicators(
|
|
223
|
+
self,
|
|
224
|
+
rsi_data,
|
|
225
|
+
ema_data
|
|
226
|
+
):
|
|
227
|
+
"""
|
|
228
|
+
Helper function to prepare the indicators
|
|
229
|
+
for the strategy. The indicators are calculated
|
|
230
|
+
using the pyindicators library: https://github.com/coding-kitties/PyIndicators
|
|
231
|
+
"""
|
|
232
|
+
ema_data = ema(
|
|
233
|
+
ema_data,
|
|
234
|
+
period=self.ema_short_period,
|
|
235
|
+
source_column="Close",
|
|
236
|
+
result_column=self.ema_short_result_column
|
|
237
|
+
)
|
|
238
|
+
ema_data = ema(
|
|
239
|
+
ema_data,
|
|
240
|
+
period=self.ema_long_period,
|
|
241
|
+
source_column="Close",
|
|
242
|
+
result_column=self.ema_long_result_column
|
|
243
|
+
)
|
|
244
|
+
# Detect crossover (short EMA crosses above long EMA)
|
|
245
|
+
ema_data = crossover(
|
|
246
|
+
ema_data,
|
|
247
|
+
first_column=self.ema_short_result_column,
|
|
248
|
+
second_column=self.ema_long_result_column,
|
|
249
|
+
result_column=self.ema_crossover_result_column
|
|
250
|
+
)
|
|
251
|
+
# Detect crossunder (short EMA crosses below long EMA)
|
|
252
|
+
ema_data = crossunder(
|
|
253
|
+
ema_data,
|
|
254
|
+
first_column=self.ema_short_result_column,
|
|
255
|
+
second_column=self.ema_long_result_column,
|
|
256
|
+
result_column=self.ema_crossunder_result_column
|
|
257
|
+
)
|
|
258
|
+
rsi_data = rsi(
|
|
259
|
+
rsi_data,
|
|
260
|
+
period=self.rsi_period,
|
|
261
|
+
source_column="Close",
|
|
262
|
+
result_column=self.rsi_result_column
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
return ema_data, rsi_data
|
|
266
|
+
|
|
267
|
+
def generate_buy_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
|
|
268
|
+
"""
|
|
269
|
+
Generate buy signals based on the moving average crossover.
|
|
270
|
+
|
|
271
|
+
data (Dict[str, Any]): Dictionary containing all the data for
|
|
272
|
+
the strategy data sources.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Dict[str, pd.Series]: A dictionary where keys are symbols and values
|
|
276
|
+
are pandas Series indicating buy signals (True/False).
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
signals = {}
|
|
280
|
+
|
|
281
|
+
for symbol in self.symbols:
|
|
282
|
+
ema_data_identifier = f"{symbol}_ema_data"
|
|
283
|
+
rsi_data_identifier = f"{symbol}_rsi_data"
|
|
284
|
+
ema_data, rsi_data = self._prepare_indicators(
|
|
285
|
+
data[ema_data_identifier].copy(),
|
|
286
|
+
data[rsi_data_identifier].copy()
|
|
287
|
+
)
|
|
165
288
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
data = crossover(data, first_column="ema_50", second_column="ema_100", result_column="crossover_50_20")
|
|
172
|
-
data = rsi(data, source_column="Close", period=14, result_column="rsi_14")
|
|
289
|
+
# crossover confirmed
|
|
290
|
+
ema_crossover_lookback = ema_data[
|
|
291
|
+
self.ema_crossover_result_column].rolling(
|
|
292
|
+
window=self.ema_cross_lookback_window
|
|
293
|
+
).max().astype(bool)
|
|
173
294
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
295
|
+
# use only RSI column
|
|
296
|
+
rsi_oversold = rsi_data[self.rsi_result_column] \
|
|
297
|
+
< self.rsi_oversold_threshold
|
|
298
|
+
|
|
299
|
+
buy_signal = rsi_oversold & ema_crossover_lookback
|
|
300
|
+
buy_signals = buy_signal.fillna(False).astype(bool)
|
|
301
|
+
signals[symbol] = buy_signals
|
|
302
|
+
|
|
303
|
+
# Get all dates where there is a sell signal
|
|
304
|
+
buy_signal_dates = buy_signals[buy_signals].index.tolist()
|
|
305
|
+
|
|
306
|
+
if buy_signal_dates:
|
|
307
|
+
self.buy_signal_dates[symbol] += buy_signal_dates
|
|
308
|
+
|
|
309
|
+
return signals
|
|
310
|
+
|
|
311
|
+
def generate_sell_signals(self, data: Dict[str, Any]) -> Dict[str, pd.Series]:
|
|
312
|
+
"""
|
|
313
|
+
Generate sell signals based on the moving average crossover.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
data (Dict[str, Any]): Dictionary containing all the data for
|
|
317
|
+
the strategy data sources.
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
Dict[str, pd.Series]: A dictionary where keys are symbols and values
|
|
321
|
+
are pandas Series indicating sell signals (True/False).
|
|
322
|
+
"""
|
|
179
323
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
324
|
+
signals = {}
|
|
325
|
+
for symbol in self.symbols:
|
|
326
|
+
ema_data_identifier = f"{symbol}_ema_data"
|
|
327
|
+
rsi_data_identifier = f"{symbol}_rsi_data"
|
|
328
|
+
ema_data, rsi_data = self._prepare_indicators(
|
|
329
|
+
data[ema_data_identifier].copy(),
|
|
330
|
+
data[rsi_data_identifier].copy()
|
|
183
331
|
)
|
|
184
|
-
return
|
|
185
332
|
|
|
186
|
-
|
|
187
|
-
|
|
333
|
+
# Confirmed by crossover between short-term EMA and long-term EMA
|
|
334
|
+
# within a given lookback window
|
|
335
|
+
ema_crossunder_lookback = ema_data[
|
|
336
|
+
self.ema_crossunder_result_column].rolling(
|
|
337
|
+
window=self.ema_cross_lookback_window
|
|
338
|
+
).max().astype(bool)
|
|
188
339
|
|
|
189
|
-
|
|
190
|
-
|
|
340
|
+
# use only RSI column
|
|
341
|
+
rsi_overbought = rsi_data[self.rsi_result_column] \
|
|
342
|
+
>= self.rsi_overbought_threshold
|
|
343
|
+
|
|
344
|
+
# Combine both conditions
|
|
345
|
+
sell_signal = rsi_overbought & ema_crossunder_lookback
|
|
346
|
+
sell_signal = sell_signal.fillna(False).astype(bool)
|
|
347
|
+
signals[symbol] = sell_signal
|
|
348
|
+
|
|
349
|
+
# Get all dates where there is a sell signal
|
|
350
|
+
sell_signal_dates = sell_signal[sell_signal].index.tolist()
|
|
351
|
+
|
|
352
|
+
if sell_signal_dates:
|
|
353
|
+
self.sell_signal_dates[symbol] += sell_signal_dates
|
|
354
|
+
|
|
355
|
+
return signals
|
|
191
356
|
|
|
192
|
-
date_range = BacktestDateRange(
|
|
193
|
-
start_date="2023-08-24 00:00:00", end_date="2023-12-02 00:00:00"
|
|
194
|
-
)
|
|
195
|
-
app.add_strategy(MyStrategy)
|
|
196
357
|
|
|
197
358
|
if __name__ == "__main__":
|
|
198
|
-
|
|
359
|
+
app = create_app()
|
|
360
|
+
app.add_strategy(
|
|
361
|
+
RSIEMACrossoverStrategy(
|
|
362
|
+
time_unit=TimeUnit.HOUR,
|
|
363
|
+
interval=2,
|
|
364
|
+
market="bitvavo",
|
|
365
|
+
rsi_time_frame="2h",
|
|
366
|
+
rsi_period=14,
|
|
367
|
+
rsi_overbought_threshold=70,
|
|
368
|
+
rsi_oversold_threshold=30,
|
|
369
|
+
ema_time_frame="2h",
|
|
370
|
+
ema_short_period=12,
|
|
371
|
+
ema_long_period=26,
|
|
372
|
+
ema_cross_lookback_window=10
|
|
373
|
+
)
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Market credentials for coinbase for both the portfolio connection and data sources will
|
|
377
|
+
# be read from .env file, when not registering a market credential object in the app.
|
|
378
|
+
app.add_market(
|
|
379
|
+
market="bitvavo",
|
|
380
|
+
trading_symbol="EUR",
|
|
381
|
+
)
|
|
382
|
+
backtest_range = BacktestDateRange(
|
|
383
|
+
start_date=datetime(2023, 1, 1, tzinfo=timezone.utc),
|
|
384
|
+
end_date=datetime(2024, 6, 1, tzinfo=timezone.utc)
|
|
385
|
+
)
|
|
199
386
|
backtest = app.run_backtest(
|
|
200
|
-
backtest_date_range=
|
|
387
|
+
backtest_date_range=backtest_range, initial_amount=1000
|
|
201
388
|
)
|
|
202
|
-
|
|
203
|
-
|
|
389
|
+
report = BacktestReport(backtest)
|
|
390
|
+
report.show(backtest_date_range=backtest_range, browser=True)
|
|
204
391
|
```
|
|
205
392
|
|
|
206
393
|
> You can find more examples [here](./examples) folder.
|