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,19 @@
|
|
|
1
|
+
def is_jupyter_notebook():
|
|
2
|
+
"""
|
|
3
|
+
Check if the code is running in a Jupyter Notebook environment.
|
|
4
|
+
|
|
5
|
+
Returns:
|
|
6
|
+
bool: True if running in a Jupyter Notebook, False otherwise.
|
|
7
|
+
"""
|
|
8
|
+
try:
|
|
9
|
+
# Check for the presence of the 'IPython' module
|
|
10
|
+
from IPython import get_ipython
|
|
11
|
+
return 'IPKernelApp' in get_ipython().config
|
|
12
|
+
except ImportError:
|
|
13
|
+
return False
|
|
14
|
+
except AttributeError:
|
|
15
|
+
# If get_ipython() does not have 'config', it is not a Jupyter Notebook
|
|
16
|
+
return False
|
|
17
|
+
except Exception:
|
|
18
|
+
# Catch any other exceptions and return False
|
|
19
|
+
return False
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
from polars import DataFrame as PolarsDataFrame
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def convert_polars_to_pandas(
|
|
6
|
+
data: PolarsDataFrame,
|
|
7
|
+
remove_duplicates=True,
|
|
8
|
+
add_index=True,
|
|
9
|
+
add_datetime_column=True,
|
|
10
|
+
datetime_column_name="Datetime"
|
|
11
|
+
):
|
|
12
|
+
"""
|
|
13
|
+
Function to convert polars dataframe to pandas dataframe.
|
|
14
|
+
|
|
15
|
+
The function will set the index to the datetime column. The reason
|
|
16
|
+
for this is that You can filter with clean, readable code in a faster way
|
|
17
|
+
then with filtering on a column that is not the index.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
data:Polars Dataframe - The original polars dataframe
|
|
21
|
+
remove_duplicates: Boolean - If set to true, all duplicate
|
|
22
|
+
dates will be removed from the dataframe
|
|
23
|
+
add_index: Boolean - If set to true, an index will
|
|
24
|
+
be added to the dataframe
|
|
25
|
+
add_datetime_column: Boolean - If set to true, a datetime
|
|
26
|
+
column will be added to the dataframe
|
|
27
|
+
datetime_column_name: String - the column name that has the
|
|
28
|
+
datetime object. By default this is set to column name Datetime
|
|
29
|
+
This is only used if add_index is set to True
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
DataFrame: Pandas DataFrame that has been converted
|
|
33
|
+
from a Polars DataFrame
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
if not isinstance(data, PolarsDataFrame):
|
|
37
|
+
raise ValueError("Data must be a Polars DataFrame")
|
|
38
|
+
|
|
39
|
+
df = data.to_pandas().copy()
|
|
40
|
+
|
|
41
|
+
if add_datetime_column and datetime_column_name not in df.columns:
|
|
42
|
+
df[datetime_column_name] = pd.to_datetime(df.index)
|
|
43
|
+
|
|
44
|
+
# Ensure datetime column is datetime type
|
|
45
|
+
df[datetime_column_name] = pd.to_datetime(df[datetime_column_name])
|
|
46
|
+
|
|
47
|
+
if remove_duplicates:
|
|
48
|
+
df = df.drop_duplicates(subset=datetime_column_name, keep="first")
|
|
49
|
+
|
|
50
|
+
if add_index:
|
|
51
|
+
df.set_index(datetime_column_name, inplace=True)
|
|
52
|
+
|
|
53
|
+
return df
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import random
|
|
2
|
+
import string
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def random_string(n, spaces: bool = False):
|
|
6
|
+
"""
|
|
7
|
+
Function to generate a random string of n characters.
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
n: number of characters
|
|
11
|
+
spaces: if True, include spaces in the string
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
str: Random string of n characters
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
if spaces:
|
|
18
|
+
return ''.join(
|
|
19
|
+
random.choice(string.ascii_lowercase + ' ') for _ in range(n)
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
return ''.join(random.choice(string.ascii_lowercase) for _ in range(n))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def random_number(n, variable_size: bool = False):
|
|
26
|
+
"""
|
|
27
|
+
Function to generate a random number of n digits.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
n: number of digits
|
|
31
|
+
variable_size: if True, the number of digits will be variable
|
|
32
|
+
between 1 and n
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
int: Random number of n digits
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
if variable_size:
|
|
39
|
+
n = random.randint(1, n)
|
|
40
|
+
|
|
41
|
+
return int(''.join(random.choice(string.digits) for _ in range(n)))
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import hmac
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# Function to create a sha256 signature
|
|
6
|
+
def create_sha256_signature(secret_key: str, params: str):
|
|
7
|
+
|
|
8
|
+
# Encode the secret key
|
|
9
|
+
byte_secret_key = bytearray()
|
|
10
|
+
byte_secret_key.extend(map(ord, secret_key))
|
|
11
|
+
|
|
12
|
+
# Encode the params
|
|
13
|
+
encoded_params = params.encode()
|
|
14
|
+
|
|
15
|
+
# Create signature
|
|
16
|
+
return hmac.new(byte_secret_key, encoded_params, hashlib.sha256)\
|
|
17
|
+
.hexdigest()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class StoppableThread(threading.Thread):
|
|
5
|
+
"""Thread class with a stop() method. The thread itself has to check
|
|
6
|
+
regularly for the stopped() condition."""
|
|
7
|
+
|
|
8
|
+
def __init__(self, *args, **kwargs):
|
|
9
|
+
super().__init__(*args, **kwargs)
|
|
10
|
+
self._stop_event = threading.Event()
|
|
11
|
+
self.done = False
|
|
12
|
+
self._name = None
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def name(self):
|
|
16
|
+
return self._name
|
|
17
|
+
|
|
18
|
+
@name.setter
|
|
19
|
+
def name(self, name):
|
|
20
|
+
self._name = name
|
|
21
|
+
|
|
22
|
+
def stop(self):
|
|
23
|
+
self._stop_event.set()
|
|
24
|
+
|
|
25
|
+
def stopped(self):
|
|
26
|
+
return self._stop_event.is_set()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from dateutil import parser
|
|
3
|
+
from datetime import timezone, datetime
|
|
4
|
+
import pandas
|
|
5
|
+
import polars
|
|
6
|
+
from typing import Union
|
|
7
|
+
from investing_algorithm_framework.services import DataProviderService, \
|
|
8
|
+
ConfigurationService, MarketCredentialService
|
|
9
|
+
from investing_algorithm_framework.infrastructure import \
|
|
10
|
+
get_default_data_providers
|
|
11
|
+
from investing_algorithm_framework.domain import DataSource, \
|
|
12
|
+
OperationalException, DataType
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def download(
|
|
16
|
+
symbol: str,
|
|
17
|
+
market: str = None,
|
|
18
|
+
date: Union[datetime, str] = None,
|
|
19
|
+
time_frame: str = None,
|
|
20
|
+
data_type: Union[str, DataType] = DataType.OHLCV,
|
|
21
|
+
start_date: Union[datetime, str] = None,
|
|
22
|
+
end_date: Union[datetime, str] = None,
|
|
23
|
+
window_size: int = 200,
|
|
24
|
+
pandas: bool = True,
|
|
25
|
+
save: bool = True,
|
|
26
|
+
storage_path: Union[str, Path] = None,
|
|
27
|
+
) -> Union[pandas.DataFrame, polars.DataFrame]:
|
|
28
|
+
"""
|
|
29
|
+
Download market data from the specified source. This function
|
|
30
|
+
uses the MarketDataSourceService to get the data provider
|
|
31
|
+
for the given set of parameters.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
symbol (str): The symbol to download data for.
|
|
35
|
+
market (str): The market to download data from.
|
|
36
|
+
data_type (str): The type of data to
|
|
37
|
+
download (e.g., "ohlcv", "ticker").
|
|
38
|
+
start_date (str): The start date for the data download.
|
|
39
|
+
end_date (str): The end date for the data download.
|
|
40
|
+
window_size (int): The size of the data window.
|
|
41
|
+
pandas (bool): Whether to return the data as a pandas DataFrame.
|
|
42
|
+
save (bool): Whether to save the downloaded data.
|
|
43
|
+
storage_path (str): The directory to save the downloaded data.
|
|
44
|
+
time_frame (str): The time frame for the data download.
|
|
45
|
+
date (str): The date for the data download.
|
|
46
|
+
window_size (int): The size of the data window.
|
|
47
|
+
pandas (bool): Whether to return the data as a pandas DataFrame.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
None
|
|
51
|
+
"""
|
|
52
|
+
configuration_service = ConfigurationService()
|
|
53
|
+
market_credential_service = MarketCredentialService()
|
|
54
|
+
data_provider_service = DataProviderService(
|
|
55
|
+
default_data_providers=get_default_data_providers(),
|
|
56
|
+
configuration_service=configuration_service,
|
|
57
|
+
market_credential_service=market_credential_service,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
if start_date is not None and isinstance(start_date, str):
|
|
61
|
+
start_date = parser.parse(start_date)
|
|
62
|
+
start_date = start_date.replace(tzinfo=timezone.utc)
|
|
63
|
+
|
|
64
|
+
if end_date is not None and isinstance(end_date, str):
|
|
65
|
+
end_date = parser.parse(end_date)
|
|
66
|
+
end_date = end_date.replace(tzinfo=timezone.utc)
|
|
67
|
+
|
|
68
|
+
if date is not None and isinstance(date, str):
|
|
69
|
+
date = parser.parse(date)
|
|
70
|
+
date = date.replace(tzinfo=timezone.utc)
|
|
71
|
+
|
|
72
|
+
# Check if all the datetime parameters are in UTC
|
|
73
|
+
if date is not None \
|
|
74
|
+
and (date.tzinfo is None or date.tzinfo != timezone.utc):
|
|
75
|
+
raise OperationalException("Date must be a UTC datetime object")
|
|
76
|
+
|
|
77
|
+
if start_date is not None \
|
|
78
|
+
and (
|
|
79
|
+
start_date.tzinfo is None or start_date.tzinfo != timezone.utc
|
|
80
|
+
):
|
|
81
|
+
raise OperationalException("Start date must be a UTC datetime object")
|
|
82
|
+
|
|
83
|
+
if end_date is not None \
|
|
84
|
+
and (end_date.tzinfo is None or end_date.tzinfo != timezone.utc):
|
|
85
|
+
raise OperationalException("End date must be a UTC datetime object")
|
|
86
|
+
|
|
87
|
+
data_source = DataSource(
|
|
88
|
+
symbol=symbol,
|
|
89
|
+
market=market,
|
|
90
|
+
data_type=data_type,
|
|
91
|
+
time_frame=time_frame,
|
|
92
|
+
date=date,
|
|
93
|
+
start_date=start_date,
|
|
94
|
+
end_date=end_date,
|
|
95
|
+
window_size=window_size,
|
|
96
|
+
pandas=pandas,
|
|
97
|
+
save=save,
|
|
98
|
+
storage_path=storage_path
|
|
99
|
+
)
|
|
100
|
+
data_provider_service.index_data_providers(
|
|
101
|
+
data_sources=[data_source]
|
|
102
|
+
)
|
|
103
|
+
return data_provider_service.get_data(
|
|
104
|
+
data_source=data_source,
|
|
105
|
+
date=date,
|
|
106
|
+
start_date=start_date,
|
|
107
|
+
end_date=end_date,
|
|
108
|
+
)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from .database import setup_sqlalchemy, Session, \
|
|
2
|
+
create_all_tables, clear_db
|
|
3
|
+
from .models import SQLPortfolio, SQLOrder, SQLPosition, \
|
|
4
|
+
SQLPortfolioSnapshot, SQLPositionSnapshot, SQLTrade, \
|
|
5
|
+
SQLTradeTakeProfit, SQLTradeStopLoss
|
|
6
|
+
from .repositories import SQLOrderRepository, SQLPositionRepository, \
|
|
7
|
+
SQLPortfolioRepository, SQLTradeRepository, \
|
|
8
|
+
SQLPortfolioSnapshotRepository, SQLPositionSnapshotRepository, \
|
|
9
|
+
SQLTradeTakeProfitRepository, SQLTradeStopLossRepository, \
|
|
10
|
+
SQLOrderMetadataRepository
|
|
11
|
+
from .services import AzureBlobStorageStateHandler, AWSS3StorageStateHandler
|
|
12
|
+
from .data_providers import CSVOHLCVDataProvider, get_default_data_providers, \
|
|
13
|
+
get_default_ohlcv_data_providers, CCXTOHLCVDataProvider, \
|
|
14
|
+
PandasOHLCVDataProvider
|
|
15
|
+
from .order_executors import CCXTOrderExecutor, BacktestOrderExecutor
|
|
16
|
+
from .portfolio_providers import CCXTPortfolioProvider
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"clear_db",
|
|
20
|
+
"create_all_tables",
|
|
21
|
+
"SQLPositionRepository",
|
|
22
|
+
"SQLPortfolioRepository",
|
|
23
|
+
"SQLOrderRepository",
|
|
24
|
+
"SQLPortfolioSnapshotRepository",
|
|
25
|
+
"SQLPositionSnapshotRepository",
|
|
26
|
+
"setup_sqlalchemy",
|
|
27
|
+
"Session",
|
|
28
|
+
"SQLPortfolio",
|
|
29
|
+
"SQLTrade",
|
|
30
|
+
"SQLOrder",
|
|
31
|
+
"SQLPosition",
|
|
32
|
+
"SQLPortfolioSnapshot",
|
|
33
|
+
"SQLPositionSnapshot",
|
|
34
|
+
"AzureBlobStorageStateHandler",
|
|
35
|
+
"SQLTradeRepository",
|
|
36
|
+
"SQLTradeTakeProfit",
|
|
37
|
+
"SQLTradeStopLoss",
|
|
38
|
+
"SQLTradeTakeProfitRepository",
|
|
39
|
+
"SQLTradeStopLossRepository",
|
|
40
|
+
"SQLOrderMetadataRepository",
|
|
41
|
+
"CSVOHLCVDataProvider",
|
|
42
|
+
"CCXTOrderExecutor",
|
|
43
|
+
"CCXTPortfolioProvider",
|
|
44
|
+
"get_default_data_providers",
|
|
45
|
+
"get_default_ohlcv_data_providers",
|
|
46
|
+
"AWSS3StorageStateHandler",
|
|
47
|
+
"CCXTOHLCVDataProvider",
|
|
48
|
+
"BacktestOrderExecutor",
|
|
49
|
+
"PandasOHLCVDataProvider",
|
|
50
|
+
]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from .ccxt import CCXTOHLCVDataProvider
|
|
2
|
+
from .csv import CSVOHLCVDataProvider
|
|
3
|
+
from .pandas import PandasOHLCVDataProvider
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_default_data_providers():
|
|
7
|
+
"""
|
|
8
|
+
Function to get the default data providers.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
list: List of default data providers.
|
|
12
|
+
"""
|
|
13
|
+
return [
|
|
14
|
+
CCXTOHLCVDataProvider(),
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_default_ohlcv_data_providers():
|
|
19
|
+
"""
|
|
20
|
+
Function to get the default OHLCV data providers.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
list: List of default OHLCV data providers.
|
|
24
|
+
"""
|
|
25
|
+
return [
|
|
26
|
+
CCXTOHLCVDataProvider(),
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
'CSVOHLCVDataProvider',
|
|
32
|
+
'CCXTOHLCVDataProvider',
|
|
33
|
+
'get_default_data_providers',
|
|
34
|
+
'get_default_ohlcv_data_providers',
|
|
35
|
+
'PandasOHLCVDataProvider',
|
|
36
|
+
]
|