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.

Files changed (260) hide show
  1. investing_algorithm_framework/__init__.py +197 -0
  2. investing_algorithm_framework/app/__init__.py +47 -0
  3. investing_algorithm_framework/app/algorithm/__init__.py +7 -0
  4. investing_algorithm_framework/app/algorithm/algorithm.py +239 -0
  5. investing_algorithm_framework/app/algorithm/algorithm_factory.py +114 -0
  6. investing_algorithm_framework/app/analysis/__init__.py +15 -0
  7. investing_algorithm_framework/app/analysis/backtest_data_ranges.py +121 -0
  8. investing_algorithm_framework/app/analysis/backtest_utils.py +107 -0
  9. investing_algorithm_framework/app/analysis/permutation.py +116 -0
  10. investing_algorithm_framework/app/analysis/ranking.py +297 -0
  11. investing_algorithm_framework/app/app.py +2204 -0
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1667 -0
  14. investing_algorithm_framework/app/eventloop.py +590 -0
  15. investing_algorithm_framework/app/reporting/__init__.py +27 -0
  16. investing_algorithm_framework/app/reporting/ascii.py +921 -0
  17. investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
  18. investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
  19. investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
  20. investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
  21. investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
  22. investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  23. investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
  24. investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
  25. investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
  26. investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
  27. investing_algorithm_framework/app/reporting/generate.py +185 -0
  28. investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
  29. investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
  30. investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  31. investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
  32. investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
  33. investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
  34. investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
  35. investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
  36. investing_algorithm_framework/app/stateless/__init__.py +35 -0
  37. investing_algorithm_framework/app/stateless/action_handlers/__init__.py +84 -0
  38. investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +8 -0
  39. investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +15 -0
  40. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +40 -0
  41. investing_algorithm_framework/app/stateless/exception_handler.py +40 -0
  42. investing_algorithm_framework/app/strategy.py +675 -0
  43. investing_algorithm_framework/app/task.py +41 -0
  44. investing_algorithm_framework/app/web/__init__.py +5 -0
  45. investing_algorithm_framework/app/web/controllers/__init__.py +13 -0
  46. investing_algorithm_framework/app/web/controllers/orders.py +20 -0
  47. investing_algorithm_framework/app/web/controllers/portfolio.py +20 -0
  48. investing_algorithm_framework/app/web/controllers/positions.py +18 -0
  49. investing_algorithm_framework/app/web/create_app.py +20 -0
  50. investing_algorithm_framework/app/web/error_handler.py +59 -0
  51. investing_algorithm_framework/app/web/responses.py +20 -0
  52. investing_algorithm_framework/app/web/run_strategies.py +4 -0
  53. investing_algorithm_framework/app/web/schemas/__init__.py +12 -0
  54. investing_algorithm_framework/app/web/schemas/order.py +12 -0
  55. investing_algorithm_framework/app/web/schemas/portfolio.py +22 -0
  56. investing_algorithm_framework/app/web/schemas/position.py +15 -0
  57. investing_algorithm_framework/app/web/setup_cors.py +6 -0
  58. investing_algorithm_framework/cli/__init__.py +0 -0
  59. investing_algorithm_framework/cli/cli.py +207 -0
  60. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +499 -0
  61. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  62. investing_algorithm_framework/cli/initialize_app.py +603 -0
  63. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  64. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  65. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  66. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  67. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  68. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  69. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  70. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  71. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  72. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  73. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  74. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  75. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  76. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  77. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  78. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  79. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  80. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  81. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  82. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  83. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  84. investing_algorithm_framework/create_app.py +54 -0
  85. investing_algorithm_framework/dependency_container.py +155 -0
  86. investing_algorithm_framework/domain/__init__.py +148 -0
  87. investing_algorithm_framework/domain/backtesting/__init__.py +21 -0
  88. investing_algorithm_framework/domain/backtesting/backtest.py +503 -0
  89. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +96 -0
  90. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +242 -0
  91. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +459 -0
  92. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  93. investing_algorithm_framework/domain/backtesting/backtest_run.py +435 -0
  94. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  95. investing_algorithm_framework/domain/backtesting/combine_backtests.py +280 -0
  96. investing_algorithm_framework/domain/config.py +111 -0
  97. investing_algorithm_framework/domain/constants.py +83 -0
  98. investing_algorithm_framework/domain/data_provider.py +334 -0
  99. investing_algorithm_framework/domain/data_structures.py +42 -0
  100. investing_algorithm_framework/domain/decimal_parsing.py +40 -0
  101. investing_algorithm_framework/domain/exceptions.py +112 -0
  102. investing_algorithm_framework/domain/models/__init__.py +43 -0
  103. investing_algorithm_framework/domain/models/app_mode.py +34 -0
  104. investing_algorithm_framework/domain/models/base_model.py +25 -0
  105. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  106. investing_algorithm_framework/domain/models/data/data_source.py +214 -0
  107. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  108. investing_algorithm_framework/domain/models/event.py +35 -0
  109. investing_algorithm_framework/domain/models/market/__init__.py +5 -0
  110. investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
  111. investing_algorithm_framework/domain/models/order/__init__.py +6 -0
  112. investing_algorithm_framework/domain/models/order/order.py +384 -0
  113. investing_algorithm_framework/domain/models/order/order_side.py +36 -0
  114. investing_algorithm_framework/domain/models/order/order_status.py +37 -0
  115. investing_algorithm_framework/domain/models/order/order_type.py +30 -0
  116. investing_algorithm_framework/domain/models/portfolio/__init__.py +9 -0
  117. investing_algorithm_framework/domain/models/portfolio/portfolio.py +169 -0
  118. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +93 -0
  119. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +208 -0
  120. investing_algorithm_framework/domain/models/position/__init__.py +4 -0
  121. investing_algorithm_framework/domain/models/position/position.py +68 -0
  122. investing_algorithm_framework/domain/models/position/position_snapshot.py +47 -0
  123. investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
  124. investing_algorithm_framework/domain/models/strategy_profile.py +33 -0
  125. investing_algorithm_framework/domain/models/time_frame.py +153 -0
  126. investing_algorithm_framework/domain/models/time_interval.py +124 -0
  127. investing_algorithm_framework/domain/models/time_unit.py +149 -0
  128. investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  129. investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
  130. investing_algorithm_framework/domain/models/trade/__init__.py +13 -0
  131. investing_algorithm_framework/domain/models/trade/trade.py +388 -0
  132. investing_algorithm_framework/domain/models/trade/trade_risk_type.py +34 -0
  133. investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
  134. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +267 -0
  135. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +303 -0
  136. investing_algorithm_framework/domain/order_executor.py +112 -0
  137. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  138. investing_algorithm_framework/domain/positions/__init__.py +4 -0
  139. investing_algorithm_framework/domain/positions/position_size.py +41 -0
  140. investing_algorithm_framework/domain/services/__init__.py +11 -0
  141. investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
  142. investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
  143. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
  144. investing_algorithm_framework/domain/services/rounding_service.py +27 -0
  145. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  146. investing_algorithm_framework/domain/stateless_actions.py +7 -0
  147. investing_algorithm_framework/domain/strategy.py +44 -0
  148. investing_algorithm_framework/domain/utils/__init__.py +27 -0
  149. investing_algorithm_framework/domain/utils/csv.py +104 -0
  150. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  151. investing_algorithm_framework/domain/utils/dates.py +57 -0
  152. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  153. investing_algorithm_framework/domain/utils/polars.py +53 -0
  154. investing_algorithm_framework/domain/utils/random.py +41 -0
  155. investing_algorithm_framework/domain/utils/signatures.py +17 -0
  156. investing_algorithm_framework/domain/utils/stoppable_thread.py +26 -0
  157. investing_algorithm_framework/domain/utils/synchronized.py +12 -0
  158. investing_algorithm_framework/download_data.py +108 -0
  159. investing_algorithm_framework/infrastructure/__init__.py +50 -0
  160. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  161. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1143 -0
  162. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  163. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  164. investing_algorithm_framework/infrastructure/database/__init__.py +10 -0
  165. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +120 -0
  166. investing_algorithm_framework/infrastructure/models/__init__.py +16 -0
  167. investing_algorithm_framework/infrastructure/models/decimal_parser.py +14 -0
  168. investing_algorithm_framework/infrastructure/models/model_extension.py +6 -0
  169. investing_algorithm_framework/infrastructure/models/order/__init__.py +4 -0
  170. investing_algorithm_framework/infrastructure/models/order/order.py +124 -0
  171. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  172. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  173. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +4 -0
  174. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +37 -0
  175. investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +114 -0
  176. investing_algorithm_framework/infrastructure/models/position/__init__.py +4 -0
  177. investing_algorithm_framework/infrastructure/models/position/position.py +63 -0
  178. investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +23 -0
  179. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  180. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  181. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +40 -0
  182. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +41 -0
  183. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  184. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  185. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  186. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  187. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  188. investing_algorithm_framework/infrastructure/repositories/__init__.py +21 -0
  189. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  190. investing_algorithm_framework/infrastructure/repositories/order_repository.py +96 -0
  191. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +30 -0
  192. investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +56 -0
  193. investing_algorithm_framework/infrastructure/repositories/position_repository.py +66 -0
  194. investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +21 -0
  195. investing_algorithm_framework/infrastructure/repositories/repository.py +299 -0
  196. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  197. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +23 -0
  198. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +23 -0
  199. investing_algorithm_framework/infrastructure/services/__init__.py +7 -0
  200. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  201. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +113 -0
  202. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  203. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  204. investing_algorithm_framework/services/__init__.py +132 -0
  205. investing_algorithm_framework/services/backtesting/__init__.py +5 -0
  206. investing_algorithm_framework/services/backtesting/backtest_service.py +651 -0
  207. investing_algorithm_framework/services/configuration_service.py +96 -0
  208. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  209. investing_algorithm_framework/services/data_providers/data_provider_service.py +850 -0
  210. investing_algorithm_framework/services/market_credential_service.py +40 -0
  211. investing_algorithm_framework/services/metrics/__init__.py +114 -0
  212. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  213. investing_algorithm_framework/services/metrics/beta.py +0 -0
  214. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  215. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  216. investing_algorithm_framework/services/metrics/drawdown.py +181 -0
  217. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  218. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  219. investing_algorithm_framework/services/metrics/generate.py +358 -0
  220. investing_algorithm_framework/services/metrics/mean_daily_return.py +83 -0
  221. investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
  222. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  223. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  224. investing_algorithm_framework/services/metrics/returns.py +452 -0
  225. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  226. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  227. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  228. investing_algorithm_framework/services/metrics/standard_deviation.py +157 -0
  229. investing_algorithm_framework/services/metrics/trades.py +500 -0
  230. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  231. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  232. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  233. investing_algorithm_framework/services/metrics/volatility.py +97 -0
  234. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  235. investing_algorithm_framework/services/order_service/__init__.py +9 -0
  236. investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
  237. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  238. investing_algorithm_framework/services/order_service/order_service.py +826 -0
  239. investing_algorithm_framework/services/portfolios/__init__.py +16 -0
  240. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
  241. investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +75 -0
  242. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  243. investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
  244. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
  245. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
  246. investing_algorithm_framework/services/positions/__init__.py +7 -0
  247. investing_algorithm_framework/services/positions/position_service.py +210 -0
  248. investing_algorithm_framework/services/positions/position_snapshot_service.py +18 -0
  249. investing_algorithm_framework/services/repository_service.py +40 -0
  250. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  251. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +132 -0
  252. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +66 -0
  253. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +41 -0
  254. investing_algorithm_framework/services/trade_service/__init__.py +3 -0
  255. investing_algorithm_framework/services/trade_service/trade_service.py +1083 -0
  256. investing_algorithm_framework-7.19.14.dist-info/LICENSE +201 -0
  257. investing_algorithm_framework-7.19.14.dist-info/METADATA +459 -0
  258. investing_algorithm_framework-7.19.14.dist-info/RECORD +260 -0
  259. investing_algorithm_framework-7.19.14.dist-info/WHEEL +4 -0
  260. 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,12 @@
1
+ import functools
2
+ import threading
3
+
4
+
5
+ def synchronized(function):
6
+ lock = threading.Lock()
7
+
8
+ @functools.wraps(function)
9
+ def wrapper(self, *args, **kwargs):
10
+ with lock:
11
+ return function(self, *args, **kwargs)
12
+ return wrapper
@@ -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
+ ]