investing-algorithm-framework 7.19.14__py3-none-any.whl
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.
Potentially problematic release.
This version of investing-algorithm-framework might be problematic. Click here for more details.
- investing_algorithm_framework/__init__.py +197 -0
- investing_algorithm_framework/app/__init__.py +47 -0
- investing_algorithm_framework/app/algorithm/__init__.py +7 -0
- investing_algorithm_framework/app/algorithm/algorithm.py +239 -0
- investing_algorithm_framework/app/algorithm/algorithm_factory.py +114 -0
- investing_algorithm_framework/app/analysis/__init__.py +15 -0
- investing_algorithm_framework/app/analysis/backtest_data_ranges.py +121 -0
- investing_algorithm_framework/app/analysis/backtest_utils.py +107 -0
- investing_algorithm_framework/app/analysis/permutation.py +116 -0
- investing_algorithm_framework/app/analysis/ranking.py +297 -0
- investing_algorithm_framework/app/app.py +2204 -0
- investing_algorithm_framework/app/app_hook.py +28 -0
- investing_algorithm_framework/app/context.py +1667 -0
- investing_algorithm_framework/app/eventloop.py +590 -0
- investing_algorithm_framework/app/reporting/__init__.py +27 -0
- investing_algorithm_framework/app/reporting/ascii.py +921 -0
- investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
- investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
- investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
- investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
- investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
- investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
- investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
- investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
- investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
- investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
- investing_algorithm_framework/app/reporting/generate.py +185 -0
- investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
- investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
- investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
- investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
- investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
- investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
- investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
- investing_algorithm_framework/app/stateless/__init__.py +35 -0
- investing_algorithm_framework/app/stateless/action_handlers/__init__.py +84 -0
- investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +8 -0
- investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +15 -0
- investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +40 -0
- investing_algorithm_framework/app/stateless/exception_handler.py +40 -0
- investing_algorithm_framework/app/strategy.py +675 -0
- investing_algorithm_framework/app/task.py +41 -0
- investing_algorithm_framework/app/web/__init__.py +5 -0
- investing_algorithm_framework/app/web/controllers/__init__.py +13 -0
- investing_algorithm_framework/app/web/controllers/orders.py +20 -0
- investing_algorithm_framework/app/web/controllers/portfolio.py +20 -0
- investing_algorithm_framework/app/web/controllers/positions.py +18 -0
- investing_algorithm_framework/app/web/create_app.py +20 -0
- investing_algorithm_framework/app/web/error_handler.py +59 -0
- investing_algorithm_framework/app/web/responses.py +20 -0
- investing_algorithm_framework/app/web/run_strategies.py +4 -0
- investing_algorithm_framework/app/web/schemas/__init__.py +12 -0
- investing_algorithm_framework/app/web/schemas/order.py +12 -0
- investing_algorithm_framework/app/web/schemas/portfolio.py +22 -0
- investing_algorithm_framework/app/web/schemas/position.py +15 -0
- investing_algorithm_framework/app/web/setup_cors.py +6 -0
- investing_algorithm_framework/cli/__init__.py +0 -0
- investing_algorithm_framework/cli/cli.py +207 -0
- investing_algorithm_framework/cli/deploy_to_aws_lambda.py +499 -0
- investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
- investing_algorithm_framework/cli/initialize_app.py +603 -0
- investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
- investing_algorithm_framework/cli/templates/app.py.template +18 -0
- investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
- investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
- investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
- investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
- investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
- investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
- investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
- investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
- investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
- investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
- investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
- investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
- investing_algorithm_framework/cli/templates/env.example.template +2 -0
- investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
- investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
- investing_algorithm_framework/cli/templates/readme.md.template +135 -0
- investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
- investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
- investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
- investing_algorithm_framework/create_app.py +54 -0
- investing_algorithm_framework/dependency_container.py +155 -0
- investing_algorithm_framework/domain/__init__.py +148 -0
- investing_algorithm_framework/domain/backtesting/__init__.py +21 -0
- investing_algorithm_framework/domain/backtesting/backtest.py +503 -0
- investing_algorithm_framework/domain/backtesting/backtest_date_range.py +96 -0
- investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +242 -0
- investing_algorithm_framework/domain/backtesting/backtest_metrics.py +459 -0
- investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
- investing_algorithm_framework/domain/backtesting/backtest_run.py +435 -0
- investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
- investing_algorithm_framework/domain/backtesting/combine_backtests.py +280 -0
- investing_algorithm_framework/domain/config.py +111 -0
- investing_algorithm_framework/domain/constants.py +83 -0
- investing_algorithm_framework/domain/data_provider.py +334 -0
- investing_algorithm_framework/domain/data_structures.py +42 -0
- investing_algorithm_framework/domain/decimal_parsing.py +40 -0
- investing_algorithm_framework/domain/exceptions.py +112 -0
- investing_algorithm_framework/domain/models/__init__.py +43 -0
- investing_algorithm_framework/domain/models/app_mode.py +34 -0
- investing_algorithm_framework/domain/models/base_model.py +25 -0
- investing_algorithm_framework/domain/models/data/__init__.py +7 -0
- investing_algorithm_framework/domain/models/data/data_source.py +214 -0
- investing_algorithm_framework/domain/models/data/data_type.py +46 -0
- investing_algorithm_framework/domain/models/event.py +35 -0
- investing_algorithm_framework/domain/models/market/__init__.py +5 -0
- investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
- investing_algorithm_framework/domain/models/order/__init__.py +6 -0
- investing_algorithm_framework/domain/models/order/order.py +384 -0
- investing_algorithm_framework/domain/models/order/order_side.py +36 -0
- investing_algorithm_framework/domain/models/order/order_status.py +37 -0
- investing_algorithm_framework/domain/models/order/order_type.py +30 -0
- investing_algorithm_framework/domain/models/portfolio/__init__.py +9 -0
- investing_algorithm_framework/domain/models/portfolio/portfolio.py +169 -0
- investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +93 -0
- investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +208 -0
- investing_algorithm_framework/domain/models/position/__init__.py +4 -0
- investing_algorithm_framework/domain/models/position/position.py +68 -0
- investing_algorithm_framework/domain/models/position/position_snapshot.py +47 -0
- investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
- investing_algorithm_framework/domain/models/strategy_profile.py +33 -0
- investing_algorithm_framework/domain/models/time_frame.py +153 -0
- investing_algorithm_framework/domain/models/time_interval.py +124 -0
- investing_algorithm_framework/domain/models/time_unit.py +149 -0
- investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
- investing_algorithm_framework/domain/models/trade/__init__.py +13 -0
- investing_algorithm_framework/domain/models/trade/trade.py +388 -0
- investing_algorithm_framework/domain/models/trade/trade_risk_type.py +34 -0
- investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
- investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +267 -0
- investing_algorithm_framework/domain/models/trade/trade_take_profit.py +303 -0
- investing_algorithm_framework/domain/order_executor.py +112 -0
- investing_algorithm_framework/domain/portfolio_provider.py +118 -0
- investing_algorithm_framework/domain/positions/__init__.py +4 -0
- investing_algorithm_framework/domain/positions/position_size.py +41 -0
- investing_algorithm_framework/domain/services/__init__.py +11 -0
- investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
- investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
- investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
- investing_algorithm_framework/domain/services/rounding_service.py +27 -0
- investing_algorithm_framework/domain/services/state_handler.py +38 -0
- investing_algorithm_framework/domain/stateless_actions.py +7 -0
- investing_algorithm_framework/domain/strategy.py +44 -0
- investing_algorithm_framework/domain/utils/__init__.py +27 -0
- investing_algorithm_framework/domain/utils/csv.py +104 -0
- investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
- investing_algorithm_framework/domain/utils/dates.py +57 -0
- investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
- investing_algorithm_framework/domain/utils/polars.py +53 -0
- investing_algorithm_framework/domain/utils/random.py +41 -0
- investing_algorithm_framework/domain/utils/signatures.py +17 -0
- investing_algorithm_framework/domain/utils/stoppable_thread.py +26 -0
- investing_algorithm_framework/domain/utils/synchronized.py +12 -0
- investing_algorithm_framework/download_data.py +108 -0
- investing_algorithm_framework/infrastructure/__init__.py +50 -0
- investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
- investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1143 -0
- investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
- investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
- investing_algorithm_framework/infrastructure/database/__init__.py +10 -0
- investing_algorithm_framework/infrastructure/database/sql_alchemy.py +120 -0
- investing_algorithm_framework/infrastructure/models/__init__.py +16 -0
- investing_algorithm_framework/infrastructure/models/decimal_parser.py +14 -0
- investing_algorithm_framework/infrastructure/models/model_extension.py +6 -0
- investing_algorithm_framework/infrastructure/models/order/__init__.py +4 -0
- investing_algorithm_framework/infrastructure/models/order/order.py +124 -0
- investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
- investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
- investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +4 -0
- investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +37 -0
- investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +114 -0
- investing_algorithm_framework/infrastructure/models/position/__init__.py +4 -0
- investing_algorithm_framework/infrastructure/models/position/position.py +63 -0
- investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +23 -0
- investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
- investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
- investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +40 -0
- investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +41 -0
- investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
- investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
- investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
- investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
- investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
- investing_algorithm_framework/infrastructure/repositories/__init__.py +21 -0
- investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
- investing_algorithm_framework/infrastructure/repositories/order_repository.py +96 -0
- investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +30 -0
- investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +56 -0
- investing_algorithm_framework/infrastructure/repositories/position_repository.py +66 -0
- investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +21 -0
- investing_algorithm_framework/infrastructure/repositories/repository.py +299 -0
- investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
- investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +23 -0
- investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +23 -0
- investing_algorithm_framework/infrastructure/services/__init__.py +7 -0
- investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
- investing_algorithm_framework/infrastructure/services/aws/state_handler.py +113 -0
- investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
- investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
- investing_algorithm_framework/services/__init__.py +132 -0
- investing_algorithm_framework/services/backtesting/__init__.py +5 -0
- investing_algorithm_framework/services/backtesting/backtest_service.py +651 -0
- investing_algorithm_framework/services/configuration_service.py +96 -0
- investing_algorithm_framework/services/data_providers/__init__.py +5 -0
- investing_algorithm_framework/services/data_providers/data_provider_service.py +850 -0
- investing_algorithm_framework/services/market_credential_service.py +40 -0
- investing_algorithm_framework/services/metrics/__init__.py +114 -0
- investing_algorithm_framework/services/metrics/alpha.py +0 -0
- investing_algorithm_framework/services/metrics/beta.py +0 -0
- investing_algorithm_framework/services/metrics/cagr.py +60 -0
- investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
- investing_algorithm_framework/services/metrics/drawdown.py +181 -0
- investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
- investing_algorithm_framework/services/metrics/exposure.py +210 -0
- investing_algorithm_framework/services/metrics/generate.py +358 -0
- investing_algorithm_framework/services/metrics/mean_daily_return.py +83 -0
- investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
- investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
- investing_algorithm_framework/services/metrics/recovery.py +113 -0
- investing_algorithm_framework/services/metrics/returns.py +452 -0
- investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
- investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
- investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
- investing_algorithm_framework/services/metrics/standard_deviation.py +157 -0
- investing_algorithm_framework/services/metrics/trades.py +500 -0
- investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- investing_algorithm_framework/services/metrics/volatility.py +97 -0
- investing_algorithm_framework/services/metrics/win_rate.py +177 -0
- investing_algorithm_framework/services/order_service/__init__.py +9 -0
- investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
- investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
- investing_algorithm_framework/services/order_service/order_service.py +826 -0
- investing_algorithm_framework/services/portfolios/__init__.py +16 -0
- investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
- investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +75 -0
- investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
- investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
- investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
- investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
- investing_algorithm_framework/services/positions/__init__.py +7 -0
- investing_algorithm_framework/services/positions/position_service.py +210 -0
- investing_algorithm_framework/services/positions/position_snapshot_service.py +18 -0
- investing_algorithm_framework/services/repository_service.py +40 -0
- investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
- investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +132 -0
- investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +66 -0
- investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +41 -0
- investing_algorithm_framework/services/trade_service/__init__.py +3 -0
- investing_algorithm_framework/services/trade_service/trade_service.py +1083 -0
- investing_algorithm_framework-7.19.14.dist-info/LICENSE +201 -0
- investing_algorithm_framework-7.19.14.dist-info/METADATA +459 -0
- investing_algorithm_framework-7.19.14.dist-info/RECORD +260 -0
- investing_algorithm_framework-7.19.14.dist-info/WHEEL +4 -0
- investing_algorithm_framework-7.19.14.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# README created by investing_algorithm_framework
|
|
2
|
+
|
|
3
|
+
You can find the documentation for the investing_algorithm_framework
|
|
4
|
+
[here](https://coding-kitties.github.io/investing-algorithm-framework).
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Getting Started
|
|
8
|
+
|
|
9
|
+
This project was created using the investing_algorithm_framework CLI. It provides a template for building a trading algorithm using the investing_algorithm_framework.
|
|
10
|
+
|
|
11
|
+
This repository contains a simple trading algorithm that uses the
|
|
12
|
+
`investing_algorithm_framework` to fetch data from [bitvavo](https://www.bitvavo.com/en/) and execute trades on the [bitvavo exchange](https://www.bitvavo.com/en/).
|
|
13
|
+
|
|
14
|
+
The trading strategy is a simple moving average crossover strategy that uses the 50 and 100 day moving averages and the 200 day moving average as a trend filter. The strategy is implemented in the `strategy.py` file. The data provider is implemented in the `data_providers.py` file.
|
|
15
|
+
|
|
16
|
+
All indicators are implemented with the [pyindicators](https://github.com/coding-kitties/PyIndicators) library.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
#### 1. Install the requirements
|
|
20
|
+
|
|
21
|
+
You can install the requirements using the following command:
|
|
22
|
+
```bash
|
|
23
|
+
pip install -r requirements.txt
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
This will install the `investing_algorithm_framework`, `pyindicators`, and
|
|
27
|
+
`python-dotenv` libraries. If you use the azure functions type option, it will also install the `azure-functions` library.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
#### 2. Create a `.env` file
|
|
31
|
+
You need to create a `.env` file in the root of the project. You can use the `.env.example` file as a template. The `.env` file should contain the following environment variables:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
BITVAVO_API_KEY=your_api_key
|
|
35
|
+
BITVAVO_API_SECRET=your_api_secret
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
##### 2.1 Changing the exchange
|
|
39
|
+
You can change the exchange in the `app.py` file. The default is set to `bitvavo`, but you can change it to any exchange you want. You can find the list of supported exchanges [here](https://investing-algorithm-framework.com/Getting%20Started/markets).
|
|
40
|
+
|
|
41
|
+
##### 2.2 Azure Functions `.env` file
|
|
42
|
+
If you are using the azure functions type option, you also need to add the following environment variables:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
AZURE_STORAGE_CONNECTION_STRING=your_azure_storage_connection_string
|
|
46
|
+
AZURE_STORAGE_CONTAINER_NAME=your_azure_storage_container_name
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
If you would like to have guidance on how to create the azure storage connection string, you can find it [here](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal).
|
|
50
|
+
|
|
51
|
+
#### 3. Run the app (Skip this step if you have not backtested your strategy)
|
|
52
|
+
> This will run the app as if it was run in production. It will execute live
|
|
53
|
+
> trades on your connected exchange. Please only run this if you are
|
|
54
|
+
> comfortable with this and have backtested your strategy.
|
|
55
|
+
|
|
56
|
+
You can run the app using the following command:
|
|
57
|
+
```bash
|
|
58
|
+
python app.py
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This will start the app and run the trading algorithm. The app will fetch data from the bitvavo exchange and execute trades based on the trading strategy.
|
|
62
|
+
|
|
63
|
+
#### 3.1 Run the app with azure functions locally
|
|
64
|
+
> Make sure to have the azure functions core tools installed. You can find the
|
|
65
|
+
> installation instructions [here](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local).
|
|
66
|
+
|
|
67
|
+
If you are using the azure functions type option, you can run the app locally using the following command:
|
|
68
|
+
```bash
|
|
69
|
+
func start
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### 4. Run the backtest
|
|
73
|
+
You can run the backtest using the following command:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python run_backtest.py
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### 5. Deployment
|
|
80
|
+
You can deploy your trading bot in varous ways.
|
|
81
|
+
|
|
82
|
+
##### 5.1 Azure Functions
|
|
83
|
+
You can deploy your trading bot to azure functions using the following command:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
investing-algorithm-framework deploy --type function --cloud azure
|
|
87
|
+
```
|
|
88
|
+
This will deploy your trading bot to azure functions. You can find the deployment instructions [here](https://investing-algorithm-framework.com/Getting%20Started/deployment).
|
|
89
|
+
|
|
90
|
+
## Project Structure
|
|
91
|
+
|
|
92
|
+
> We highly recommend to keep the file structure as is, as it is
|
|
93
|
+
> designed to work with the investing_algorithm_framework CLI.
|
|
94
|
+
> You can add your own files and folders as needed, however, we
|
|
95
|
+
> recommend to keep the `strategies` folder for your strategies
|
|
96
|
+
> and the `app.py` file for your app entry point.
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
.
|
|
100
|
+
├── app.py
|
|
101
|
+
├── requirements.txt
|
|
102
|
+
├── strategies
|
|
103
|
+
│ ├── data_providers.py
|
|
104
|
+
│ └── strategy.py
|
|
105
|
+
├── .gitignore
|
|
106
|
+
├── .env.example
|
|
107
|
+
└── README.md
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
If you're using the azure functions type option, you will also have an `function_app.py`, `local.settings.json`, and `function.json` file. The `function_app.py` file is the entry point for the azure function, and the `local.settings.json` file is used to configure the local environment for the azure function. The `function.json` file is used to configure the function itself.
|
|
111
|
+
|
|
112
|
+
> You can change the time trigger in the `function_app.py` when
|
|
113
|
+
> using the azure functions type option. The default is set to
|
|
114
|
+
> every 30 seconds. You can change it to any time you want,
|
|
115
|
+
> but make sure to use the correct format for the time trigger.
|
|
116
|
+
|
|
117
|
+
## Requirements
|
|
118
|
+
|
|
119
|
+
The project requires Python 3.10 or higher. You can create a virtual environment and install the requirements using the following commands:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
virtualenv venv
|
|
123
|
+
source venv/bin/activate # On Windows use `venv\Scripts\activate`
|
|
124
|
+
pip install -r requirements.txt
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
By default pyindicators is installed as its specified in the requirements.txt file. This is a requirement for the example strategy in the `strategy.py` file. You can always remove it from the requirements.txt file if you don't need it.
|
|
128
|
+
|
|
129
|
+
## Deployment
|
|
130
|
+
|
|
131
|
+
You can deploy your trading bot to azure functions using the following cli command:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
investing-algorithm-framework deploy --type function --cloud azure
|
|
135
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from investing_algorithm_framework import BacktestDateRange
|
|
4
|
+
from investing_algorithm_framework import create_app
|
|
5
|
+
from strategies.strategy import MyTradingStrategy
|
|
6
|
+
|
|
7
|
+
app = create_app()
|
|
8
|
+
app.add_strategy(MyTradingStrategy)
|
|
9
|
+
app.add_market(market="BITVAVO", trading_symbol="EUR")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if __name__ == "__main__":
|
|
13
|
+
backtest_date_range = BacktestDateRange(
|
|
14
|
+
start_date=datetime(2023, 1, 1),
|
|
15
|
+
end_date=datetime(2023, 12, 31),
|
|
16
|
+
)
|
|
17
|
+
report = app.run_backtest(
|
|
18
|
+
backtest_date_range=backtest_date_range, initial_amount=1000
|
|
19
|
+
)
|
|
20
|
+
report.show()
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from investing_algorithm_framework import TimeUnit, TradingStrategy, Context, \
|
|
2
|
+
OrderSide
|
|
3
|
+
from .data_providers import btc_eur_ohlcv_2h, btc_eur_ticker
|
|
4
|
+
from pyindicators import ema, is_crossover, is_above, is_below, is_crossunder
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MyTradingStrategy(TradingStrategy):
|
|
8
|
+
"""
|
|
9
|
+
A simple trading strategy that uses EMA crossovers to generate buy and
|
|
10
|
+
sell signals. The strategy uses a 50-period EMA and a 100-period EMA
|
|
11
|
+
to detect golden and death crosses. It also uses a 200-period EMA to
|
|
12
|
+
determine the overall trend direction. The strategy trades BTC/EUR
|
|
13
|
+
on a 2-hour timeframe. The strategy is designed to be used with the
|
|
14
|
+
Investing Algorithm Framework and uses the PyIndicators library
|
|
15
|
+
to calculate the EMAs and crossover signals.
|
|
16
|
+
|
|
17
|
+
The strategy uses a trailing stop loss and take profit to manage
|
|
18
|
+
risk. The stop loss is set to 5% below the entry price and the
|
|
19
|
+
take profit is set to 10% above the entry price. The stop loss and
|
|
20
|
+
take profit are both trailing, meaning that they will move up
|
|
21
|
+
with the price when the price goes up.
|
|
22
|
+
"""
|
|
23
|
+
time_unit = TimeUnit.HOUR
|
|
24
|
+
interval = 2
|
|
25
|
+
symbol_pairs = ["BTC/EUR"]
|
|
26
|
+
market_data_sources = [btc_eur_ohlcv_2h, btc_eur_ticker]
|
|
27
|
+
fast = 50
|
|
28
|
+
slow = 100
|
|
29
|
+
trend = 200
|
|
30
|
+
stop_loss_percentage = 2
|
|
31
|
+
stop_loss_sell_size = 50
|
|
32
|
+
take_profit_percentage = 8
|
|
33
|
+
take_profit_sell_size = 50
|
|
34
|
+
|
|
35
|
+
def apply_strategy(self, context: Context, market_data):
|
|
36
|
+
|
|
37
|
+
for pair in self.symbol_pairs:
|
|
38
|
+
symbol = pair.split('/')[0]
|
|
39
|
+
|
|
40
|
+
# Don't trade if there are open orders for the symbol
|
|
41
|
+
# This is important to avoid placing new orders while there are
|
|
42
|
+
# existing orders that are not yet filled
|
|
43
|
+
if context.has_open_orders(symbol):
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
ohlvc_data = market_data[f"{pair}-ohlcv-2h"]
|
|
47
|
+
# ticker_data = market_data[f"{symbol}-ticker"]
|
|
48
|
+
# Add fast, slow, and trend EMAs to the data
|
|
49
|
+
ohlvc_data = ema(
|
|
50
|
+
ohlvc_data,
|
|
51
|
+
source_column="Close",
|
|
52
|
+
period=self.fast,
|
|
53
|
+
result_column=f"ema_{self.fast}"
|
|
54
|
+
)
|
|
55
|
+
ohlvc_data = ema(
|
|
56
|
+
ohlvc_data,
|
|
57
|
+
source_column="Close",
|
|
58
|
+
period=self.slow,
|
|
59
|
+
result_column=f"ema_{self.slow}"
|
|
60
|
+
)
|
|
61
|
+
ohlvc_data = ema(
|
|
62
|
+
ohlvc_data,
|
|
63
|
+
source_column="Close",
|
|
64
|
+
period=self.trend,
|
|
65
|
+
result_column=f"ema_{self.trend}"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
price = ohlvc_data["Close"][-1]
|
|
69
|
+
|
|
70
|
+
if not context.has_position(symbol) \
|
|
71
|
+
and self._is_buy_signal(ohlvc_data):
|
|
72
|
+
order = context.create_limit_order(
|
|
73
|
+
target_symbol=symbol,
|
|
74
|
+
order_side=OrderSide.BUY,
|
|
75
|
+
price=price,
|
|
76
|
+
percentage_of_portfolio=25,
|
|
77
|
+
precision=4,
|
|
78
|
+
)
|
|
79
|
+
trade = context.get_trade(order_id=order.id)
|
|
80
|
+
context.add_stop_loss(
|
|
81
|
+
trade=trade,
|
|
82
|
+
trade_risk_type="trailing",
|
|
83
|
+
percentage=self.stop_loss_percentage,
|
|
84
|
+
sell_percentage=self.stop_loss_sell_size
|
|
85
|
+
)
|
|
86
|
+
context.add_take_profit(
|
|
87
|
+
trade=trade,
|
|
88
|
+
percentage=self.take_profit_percentage,
|
|
89
|
+
trade_risk_type="trailing",
|
|
90
|
+
sell_percentage=self.take_profit_sell_size
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
if context.has_position(symbol) \
|
|
94
|
+
and self._is_sell_signal(ohlvc_data):
|
|
95
|
+
open_trades = context.get_open_trades(
|
|
96
|
+
target_symbol=symbol
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
for trade in open_trades:
|
|
100
|
+
context.close_trade(trade)
|
|
101
|
+
|
|
102
|
+
def _is_sell_signal(self, data):
|
|
103
|
+
return is_crossunder(
|
|
104
|
+
data,
|
|
105
|
+
first_column=f"ema_{self.fast}",
|
|
106
|
+
second_column=f"ema_{self.slow}",
|
|
107
|
+
number_of_data_points=2
|
|
108
|
+
) and is_below(
|
|
109
|
+
data,
|
|
110
|
+
first_column=f"ema_{self.fast}",
|
|
111
|
+
second_column=f"ema_{self.trend}",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def _is_buy_signal(self, data):
|
|
115
|
+
return is_crossover(
|
|
116
|
+
data=data,
|
|
117
|
+
first_column=f"ema_{self.fast}",
|
|
118
|
+
second_column=f"ema_{self.slow}",
|
|
119
|
+
number_of_data_points=2
|
|
120
|
+
) and is_above(
|
|
121
|
+
data=data,
|
|
122
|
+
first_column=f"ema_{self.fast}",
|
|
123
|
+
second_column=f"ema_{self.trend}",
|
|
124
|
+
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import logging
|
|
3
|
+
import inspect
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
from .app import App
|
|
7
|
+
from .dependency_container import setup_dependency_container
|
|
8
|
+
from .domain import AppMode, APPLICATION_DIRECTORY, APP_MODE
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger("investing_algorithm_framework")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def create_app(
|
|
14
|
+
config: dict = None,
|
|
15
|
+
state_handler=None,
|
|
16
|
+
web: bool = False,
|
|
17
|
+
name=None
|
|
18
|
+
) -> App:
|
|
19
|
+
"""
|
|
20
|
+
Factory method to create an app instance.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
config (dict): Configuration dictionary
|
|
24
|
+
web (bool): Whether to create a web app
|
|
25
|
+
state_handler (StateHandler): State handler for the app
|
|
26
|
+
name (str): Name of the app
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
App: App instance
|
|
30
|
+
"""
|
|
31
|
+
# Load the environment variables
|
|
32
|
+
load_dotenv()
|
|
33
|
+
|
|
34
|
+
app = App(state_handler=state_handler)
|
|
35
|
+
app = setup_dependency_container(
|
|
36
|
+
app,
|
|
37
|
+
["investing_algorithm_framework"],
|
|
38
|
+
["investing_algorithm_framework"]
|
|
39
|
+
)
|
|
40
|
+
app.name = name
|
|
41
|
+
|
|
42
|
+
if config is not None:
|
|
43
|
+
app.set_config_with_dict(config)
|
|
44
|
+
|
|
45
|
+
if web:
|
|
46
|
+
app.set_config(APP_MODE, AppMode.WEB.value)
|
|
47
|
+
|
|
48
|
+
# Add the application directory to the config
|
|
49
|
+
caller_frame = inspect.stack()[1]
|
|
50
|
+
caller_path = os.path.abspath(caller_frame.filename)
|
|
51
|
+
app.set_config(APPLICATION_DIRECTORY, caller_path)
|
|
52
|
+
|
|
53
|
+
logger.info("Investing algorithm framework app created")
|
|
54
|
+
return app
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
from dependency_injector import containers, providers
|
|
2
|
+
|
|
3
|
+
from investing_algorithm_framework.app.algorithm import AlgorithmFactory
|
|
4
|
+
from investing_algorithm_framework.app.context import Context
|
|
5
|
+
from investing_algorithm_framework.infrastructure import SQLOrderRepository, \
|
|
6
|
+
SQLPositionRepository, SQLPortfolioRepository, \
|
|
7
|
+
SQLPortfolioSnapshotRepository, SQLTradeRepository, \
|
|
8
|
+
SQLPositionSnapshotRepository, SQLTradeStopLossRepository, \
|
|
9
|
+
SQLTradeTakeProfitRepository, SQLOrderMetadataRepository
|
|
10
|
+
from investing_algorithm_framework.services import OrderService, \
|
|
11
|
+
PositionService, PortfolioService, PortfolioConfigurationService, \
|
|
12
|
+
BacktestService, ConfigurationService, PortfolioSnapshotService, \
|
|
13
|
+
PositionSnapshotService, MarketCredentialService, TradeService, \
|
|
14
|
+
PortfolioSyncService, OrderExecutorLookup, PortfolioProviderLookup, \
|
|
15
|
+
DataProviderService
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def setup_dependency_container(app, modules=None, packages=None):
|
|
19
|
+
app.container = DependencyContainer()
|
|
20
|
+
app.container.wire(modules=modules, packages=packages)
|
|
21
|
+
return app
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DependencyContainer(containers.DeclarativeContainer):
|
|
25
|
+
"""
|
|
26
|
+
Dependency container for the app. It is responsible for managing the
|
|
27
|
+
dependencies of the app.
|
|
28
|
+
"""
|
|
29
|
+
config = providers.Configuration()
|
|
30
|
+
wiring_config = containers.WiringConfiguration()
|
|
31
|
+
configuration_service = providers.ThreadSafeSingleton(
|
|
32
|
+
ConfigurationService,
|
|
33
|
+
)
|
|
34
|
+
market_credential_service = providers.ThreadSafeSingleton(
|
|
35
|
+
MarketCredentialService
|
|
36
|
+
)
|
|
37
|
+
order_repository = providers.Factory(SQLOrderRepository)
|
|
38
|
+
order_executor_lookup = providers.ThreadSafeSingleton(
|
|
39
|
+
OrderExecutorLookup
|
|
40
|
+
)
|
|
41
|
+
order_metadata_repository = providers.Factory(SQLOrderMetadataRepository)
|
|
42
|
+
position_repository = providers.Factory(SQLPositionRepository)
|
|
43
|
+
portfolio_provider_lookup = providers.ThreadSafeSingleton(
|
|
44
|
+
PortfolioProviderLookup,
|
|
45
|
+
)
|
|
46
|
+
portfolio_repository = providers.Factory(SQLPortfolioRepository)
|
|
47
|
+
position_snapshot_repository = providers.Factory(
|
|
48
|
+
SQLPositionSnapshotRepository
|
|
49
|
+
)
|
|
50
|
+
portfolio_snapshot_repository = providers.Factory(
|
|
51
|
+
SQLPortfolioSnapshotRepository
|
|
52
|
+
)
|
|
53
|
+
trade_repository = providers.Factory(SQLTradeRepository)
|
|
54
|
+
trade_take_profit_repository = providers\
|
|
55
|
+
.Factory(SQLTradeTakeProfitRepository)
|
|
56
|
+
trade_stop_loss_repository = providers.Factory(SQLTradeStopLossRepository)
|
|
57
|
+
data_provider_service = providers.ThreadSafeSingleton(
|
|
58
|
+
DataProviderService,
|
|
59
|
+
configuration_service=configuration_service,
|
|
60
|
+
market_credential_service=market_credential_service
|
|
61
|
+
)
|
|
62
|
+
position_snapshot_service = providers.Factory(
|
|
63
|
+
PositionSnapshotService,
|
|
64
|
+
repository=position_snapshot_repository,
|
|
65
|
+
)
|
|
66
|
+
portfolio_snapshot_service = providers.Factory(
|
|
67
|
+
PortfolioSnapshotService,
|
|
68
|
+
order_repository=order_repository,
|
|
69
|
+
repository=portfolio_snapshot_repository,
|
|
70
|
+
portfolio_repository=portfolio_repository,
|
|
71
|
+
position_snapshot_service=position_snapshot_service,
|
|
72
|
+
position_repository=position_repository,
|
|
73
|
+
data_provider_service=data_provider_service,
|
|
74
|
+
)
|
|
75
|
+
portfolio_configuration_service = providers.ThreadSafeSingleton(
|
|
76
|
+
PortfolioConfigurationService,
|
|
77
|
+
portfolio_repository=portfolio_repository,
|
|
78
|
+
position_repository=position_repository,
|
|
79
|
+
)
|
|
80
|
+
trade_service = providers.Factory(
|
|
81
|
+
TradeService,
|
|
82
|
+
order_repository=order_repository,
|
|
83
|
+
trade_take_profit_repository=trade_take_profit_repository,
|
|
84
|
+
trade_stop_loss_repository=trade_stop_loss_repository,
|
|
85
|
+
configuration_service=configuration_service,
|
|
86
|
+
trade_repository=trade_repository,
|
|
87
|
+
portfolio_repository=portfolio_repository,
|
|
88
|
+
position_repository=position_repository,
|
|
89
|
+
order_metadata_repository=order_metadata_repository,
|
|
90
|
+
)
|
|
91
|
+
position_service = providers.Factory(
|
|
92
|
+
PositionService,
|
|
93
|
+
portfolio_repository=portfolio_repository,
|
|
94
|
+
repository=position_repository,
|
|
95
|
+
)
|
|
96
|
+
order_service = providers.Factory(
|
|
97
|
+
OrderService,
|
|
98
|
+
configuration_service=configuration_service,
|
|
99
|
+
order_repository=order_repository,
|
|
100
|
+
portfolio_repository=portfolio_repository,
|
|
101
|
+
position_service=position_service,
|
|
102
|
+
market_credential_service=market_credential_service,
|
|
103
|
+
portfolio_configuration_service=portfolio_configuration_service,
|
|
104
|
+
portfolio_snapshot_service=portfolio_snapshot_service,
|
|
105
|
+
trade_service=trade_service,
|
|
106
|
+
order_executor_lookup=order_executor_lookup,
|
|
107
|
+
portfolio_provider_lookup=portfolio_provider_lookup
|
|
108
|
+
)
|
|
109
|
+
portfolio_service = providers.Factory(
|
|
110
|
+
PortfolioService,
|
|
111
|
+
configuration_service=configuration_service,
|
|
112
|
+
market_credential_service=market_credential_service,
|
|
113
|
+
order_service=order_service,
|
|
114
|
+
position_service=position_service,
|
|
115
|
+
portfolio_repository=portfolio_repository,
|
|
116
|
+
portfolio_configuration_service=portfolio_configuration_service,
|
|
117
|
+
portfolio_snapshot_service=portfolio_snapshot_service,
|
|
118
|
+
portfolio_provider_lookup=portfolio_provider_lookup
|
|
119
|
+
)
|
|
120
|
+
portfolio_sync_service = providers.Factory(
|
|
121
|
+
PortfolioSyncService,
|
|
122
|
+
trade_service=trade_service,
|
|
123
|
+
configuration_service=configuration_service,
|
|
124
|
+
order_service=order_service,
|
|
125
|
+
position_repository=position_repository,
|
|
126
|
+
portfolio_repository=portfolio_repository,
|
|
127
|
+
portfolio_configuration_service=portfolio_configuration_service,
|
|
128
|
+
market_credential_service=market_credential_service,
|
|
129
|
+
portfolio_provider_lookup=portfolio_provider_lookup,
|
|
130
|
+
)
|
|
131
|
+
backtest_service = providers.Factory(
|
|
132
|
+
BacktestService,
|
|
133
|
+
configuration_service=configuration_service,
|
|
134
|
+
order_service=order_service,
|
|
135
|
+
trade_service=trade_service,
|
|
136
|
+
portfolio_service=portfolio_service,
|
|
137
|
+
position_repository=position_repository,
|
|
138
|
+
portfolio_configuration_service=portfolio_configuration_service,
|
|
139
|
+
portfolio_snapshot_service=portfolio_snapshot_service,
|
|
140
|
+
data_provider_service=data_provider_service,
|
|
141
|
+
)
|
|
142
|
+
context = providers.Factory(
|
|
143
|
+
Context,
|
|
144
|
+
configuration_service=configuration_service,
|
|
145
|
+
portfolio_configuration_service=portfolio_configuration_service,
|
|
146
|
+
portfolio_service=portfolio_service,
|
|
147
|
+
position_service=position_service,
|
|
148
|
+
order_service=order_service,
|
|
149
|
+
market_credential_service=market_credential_service,
|
|
150
|
+
trade_service=trade_service,
|
|
151
|
+
data_provider_service=data_provider_service,
|
|
152
|
+
)
|
|
153
|
+
algorithm_factory = providers.Factory(
|
|
154
|
+
AlgorithmFactory,
|
|
155
|
+
)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from .config import Environment, DEFAULT_LOGGING_CONFIG, \
|
|
2
|
+
AWS_LAMBDA_LOGGING_CONFIG
|
|
3
|
+
from .constants import ITEMIZE, ITEMIZED, PER_PAGE, PAGE, ENVIRONMENT, \
|
|
4
|
+
DATABASE_DIRECTORY_PATH, DATABASE_NAME, DEFAULT_PER_PAGE_VALUE, \
|
|
5
|
+
DEFAULT_PAGE_VALUE, SQLALCHEMY_DATABASE_URI, RESOURCE_DIRECTORY, \
|
|
6
|
+
DATETIME_FORMAT, DATETIME_FORMAT_BACKTESTING, BACKTESTING_FLAG, \
|
|
7
|
+
BACKTESTING_START_DATE, CCXT_DATETIME_FORMAT, \
|
|
8
|
+
BACKTEST_DATA_DIRECTORY_NAME, TICKER_DATA_TYPE, OHLCV_DATA_TYPE, \
|
|
9
|
+
CURRENT_UTC_DATETIME, BACKTESTING_END_DATE, SYMBOLS, \
|
|
10
|
+
CCXT_DATETIME_FORMAT_WITH_TIMEZONE, RESERVED_BALANCES, \
|
|
11
|
+
APP_MODE, DATABASE_DIRECTORY_NAME, BACKTESTING_INITIAL_AMOUNT, \
|
|
12
|
+
APPLICATION_DIRECTORY, SNAPSHOT_INTERVAL, AWS_S3_STATE_BUCKET_NAME, \
|
|
13
|
+
LAST_SNAPSHOT_DATETIME, DATA_DIRECTORY, INDEX_DATETIME, \
|
|
14
|
+
DATETIME_FORMAT_FILE_NAME, DEFAULT_DATETIME_FORMAT
|
|
15
|
+
from .data_provider import DataProvider
|
|
16
|
+
from .data_structures import PeekableQueue
|
|
17
|
+
from .decimal_parsing import parse_decimal_to_string, parse_string_to_decimal
|
|
18
|
+
from .exceptions import OperationalException, ApiException, DataError, \
|
|
19
|
+
PermissionDeniedApiException, ImproperlyConfigured, NetworkError
|
|
20
|
+
from .models import OrderStatus, OrderSide, OrderType, TimeInterval, \
|
|
21
|
+
TimeUnit, TimeFrame, PortfolioConfiguration, Portfolio, Position, \
|
|
22
|
+
Order, TradeStatus, StrategyProfile, Trade, MarketCredential, \
|
|
23
|
+
AppMode, DataType, DataSource, PortfolioSnapshot, PositionSnapshot, \
|
|
24
|
+
TradeRiskType, TradeTakeProfit, TradeStopLoss, Event, SnapshotInterval
|
|
25
|
+
from .order_executor import OrderExecutor
|
|
26
|
+
from .portfolio_provider import PortfolioProvider
|
|
27
|
+
from .services import MarketCredentialService, AbstractPortfolioSyncService, \
|
|
28
|
+
RoundingService, StateHandler
|
|
29
|
+
from .stateless_actions import StatelessActions
|
|
30
|
+
from .strategy import Strategy
|
|
31
|
+
from .utils import random_string, append_dict_as_row_to_csv, \
|
|
32
|
+
add_column_headers_to_csv, get_total_amount_of_rows, \
|
|
33
|
+
convert_polars_to_pandas, random_number, is_jupyter_notebook, \
|
|
34
|
+
csv_to_list, StoppableThread, load_csv_into_dict, tqdm, \
|
|
35
|
+
is_timezone_aware, sync_timezones, get_timezone
|
|
36
|
+
from .backtesting import BacktestRun, BacktestSummaryMetrics, \
|
|
37
|
+
BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
|
|
38
|
+
BacktestPermutationTest, BacktestEvaluationFocus, \
|
|
39
|
+
generate_backtest_summary_metrics
|
|
40
|
+
from .positions import PositionSize
|
|
41
|
+
|
|
42
|
+
__all__ = [
|
|
43
|
+
"OrderStatus",
|
|
44
|
+
"OrderSide",
|
|
45
|
+
"OrderType",
|
|
46
|
+
"OperationalException",
|
|
47
|
+
"ApiException",
|
|
48
|
+
"PermissionDeniedApiException",
|
|
49
|
+
"ImproperlyConfigured",
|
|
50
|
+
"TimeInterval",
|
|
51
|
+
"TimeUnit",
|
|
52
|
+
"TimeFrame",
|
|
53
|
+
"ITEMIZED",
|
|
54
|
+
"PER_PAGE",
|
|
55
|
+
"PAGE",
|
|
56
|
+
"ITEMIZE",
|
|
57
|
+
"DEFAULT_PER_PAGE_VALUE",
|
|
58
|
+
"DEFAULT_PAGE_VALUE",
|
|
59
|
+
"SQLALCHEMY_DATABASE_URI",
|
|
60
|
+
"random_string",
|
|
61
|
+
"append_dict_as_row_to_csv",
|
|
62
|
+
"add_column_headers_to_csv",
|
|
63
|
+
"get_total_amount_of_rows",
|
|
64
|
+
"csv_to_list",
|
|
65
|
+
"DATABASE_DIRECTORY_PATH",
|
|
66
|
+
"DATABASE_NAME",
|
|
67
|
+
"PortfolioConfiguration",
|
|
68
|
+
"RESOURCE_DIRECTORY",
|
|
69
|
+
'ENVIRONMENT',
|
|
70
|
+
'Environment',
|
|
71
|
+
"StoppableThread",
|
|
72
|
+
"Portfolio",
|
|
73
|
+
"Position",
|
|
74
|
+
"Order",
|
|
75
|
+
"Strategy",
|
|
76
|
+
"DATETIME_FORMAT",
|
|
77
|
+
"StatelessActions",
|
|
78
|
+
"parse_decimal_to_string",
|
|
79
|
+
"parse_string_to_decimal",
|
|
80
|
+
"BacktestRun",
|
|
81
|
+
"DATETIME_FORMAT_BACKTESTING",
|
|
82
|
+
"BACKTESTING_FLAG",
|
|
83
|
+
"PortfolioSnapshot",
|
|
84
|
+
"BACKTESTING_START_DATE",
|
|
85
|
+
"StrategyProfile",
|
|
86
|
+
"CCXT_DATETIME_FORMAT",
|
|
87
|
+
"BACKTEST_DATA_DIRECTORY_NAME",
|
|
88
|
+
"Trade",
|
|
89
|
+
"TICKER_DATA_TYPE",
|
|
90
|
+
"OHLCV_DATA_TYPE",
|
|
91
|
+
"CURRENT_UTC_DATETIME",
|
|
92
|
+
"MarketCredential",
|
|
93
|
+
"PeekableQueue",
|
|
94
|
+
"BACKTESTING_END_DATE",
|
|
95
|
+
"PositionSnapshot",
|
|
96
|
+
"MarketCredentialService",
|
|
97
|
+
"TradeStatus",
|
|
98
|
+
"CCXT_DATETIME_FORMAT_WITH_TIMEZONE",
|
|
99
|
+
"load_csv_into_dict",
|
|
100
|
+
"SYMBOLS",
|
|
101
|
+
"RESERVED_BALANCES",
|
|
102
|
+
"AbstractPortfolioSyncService",
|
|
103
|
+
"APP_MODE",
|
|
104
|
+
"AppMode",
|
|
105
|
+
"RoundingService",
|
|
106
|
+
"BacktestDateRange",
|
|
107
|
+
"convert_polars_to_pandas",
|
|
108
|
+
"DEFAULT_LOGGING_CONFIG",
|
|
109
|
+
"DATABASE_DIRECTORY_NAME",
|
|
110
|
+
"BACKTESTING_INITIAL_AMOUNT",
|
|
111
|
+
"TradeRiskType",
|
|
112
|
+
"TradeTakeProfit",
|
|
113
|
+
"TradeStopLoss",
|
|
114
|
+
"StateHandler",
|
|
115
|
+
"APPLICATION_DIRECTORY",
|
|
116
|
+
"DataProvider",
|
|
117
|
+
"NetworkError",
|
|
118
|
+
"DataSource",
|
|
119
|
+
"OrderExecutor",
|
|
120
|
+
"PortfolioProvider",
|
|
121
|
+
"random_number",
|
|
122
|
+
"is_timezone_aware",
|
|
123
|
+
"sync_timezones",
|
|
124
|
+
"get_timezone",
|
|
125
|
+
"Event",
|
|
126
|
+
"SNAPSHOT_INTERVAL",
|
|
127
|
+
"SnapshotInterval",
|
|
128
|
+
"AWS_S3_STATE_BUCKET_NAME",
|
|
129
|
+
"AWS_LAMBDA_LOGGING_CONFIG",
|
|
130
|
+
"DataType",
|
|
131
|
+
"DataSource",
|
|
132
|
+
"Backtest",
|
|
133
|
+
"BacktestMetrics",
|
|
134
|
+
"BacktestSummaryMetrics",
|
|
135
|
+
"BacktestPermutationTest",
|
|
136
|
+
"LAST_SNAPSHOT_DATETIME",
|
|
137
|
+
"DATA_DIRECTORY",
|
|
138
|
+
"INDEX_DATETIME",
|
|
139
|
+
"DATETIME_FORMAT_FILE_NAME",
|
|
140
|
+
"is_jupyter_notebook",
|
|
141
|
+
"tqdm",
|
|
142
|
+
"DEFAULT_DATETIME_FORMAT",
|
|
143
|
+
"BacktestEvaluationFocus",
|
|
144
|
+
'combine_backtests',
|
|
145
|
+
'PositionSize',
|
|
146
|
+
'generate_backtest_summary_metrics',
|
|
147
|
+
'DataError'
|
|
148
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .backtest_summary_metrics import BacktestSummaryMetrics
|
|
2
|
+
from .backtest_date_range import BacktestDateRange
|
|
3
|
+
from .backtest_metrics import BacktestMetrics
|
|
4
|
+
from .backtest_run import BacktestRun
|
|
5
|
+
from .backtest import Backtest
|
|
6
|
+
from .backtest_permutation_test import BacktestPermutationTest
|
|
7
|
+
from .backtest_evaluation_focuss import BacktestEvaluationFocus
|
|
8
|
+
from .combine_backtests import combine_backtests, \
|
|
9
|
+
generate_backtest_summary_metrics
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"Backtest",
|
|
13
|
+
"BacktestSummaryMetrics",
|
|
14
|
+
"BacktestDateRange",
|
|
15
|
+
"BacktestMetrics",
|
|
16
|
+
"BacktestRun",
|
|
17
|
+
"BacktestPermutationTest",
|
|
18
|
+
"BacktestEvaluationFocus",
|
|
19
|
+
"combine_backtests",
|
|
20
|
+
"generate_backtest_summary_metrics"
|
|
21
|
+
]
|