investing-algorithm-framework 1.3.1__py3-none-any.whl → 7.25.6__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.
Files changed (282) hide show
  1. investing_algorithm_framework/__init__.py +195 -16
  2. investing_algorithm_framework/analysis/__init__.py +16 -0
  3. investing_algorithm_framework/analysis/backtest_data_ranges.py +202 -0
  4. investing_algorithm_framework/analysis/data.py +170 -0
  5. investing_algorithm_framework/analysis/markdown.py +91 -0
  6. investing_algorithm_framework/analysis/ranking.py +298 -0
  7. investing_algorithm_framework/app/__init__.py +31 -4
  8. investing_algorithm_framework/app/algorithm/__init__.py +7 -0
  9. investing_algorithm_framework/app/algorithm/algorithm.py +193 -0
  10. investing_algorithm_framework/app/algorithm/algorithm_factory.py +118 -0
  11. investing_algorithm_framework/app/app.py +2233 -264
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1724 -0
  14. investing_algorithm_framework/app/eventloop.py +620 -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/action_handlers/__init__.py +6 -3
  37. investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
  38. investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +2 -1
  39. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
  40. investing_algorithm_framework/app/stateless/exception_handler.py +1 -1
  41. investing_algorithm_framework/app/strategy.py +873 -52
  42. investing_algorithm_framework/app/task.py +5 -3
  43. investing_algorithm_framework/app/web/__init__.py +2 -1
  44. investing_algorithm_framework/app/web/controllers/__init__.py +2 -2
  45. investing_algorithm_framework/app/web/controllers/orders.py +4 -3
  46. investing_algorithm_framework/app/web/controllers/portfolio.py +1 -1
  47. investing_algorithm_framework/app/web/controllers/positions.py +3 -3
  48. investing_algorithm_framework/app/web/create_app.py +4 -2
  49. investing_algorithm_framework/app/web/error_handler.py +1 -1
  50. investing_algorithm_framework/app/web/schemas/order.py +2 -2
  51. investing_algorithm_framework/app/web/schemas/position.py +1 -0
  52. investing_algorithm_framework/cli/__init__.py +0 -0
  53. investing_algorithm_framework/cli/cli.py +231 -0
  54. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
  55. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  56. investing_algorithm_framework/cli/initialize_app.py +603 -0
  57. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  58. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  59. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  60. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  61. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  62. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  63. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  64. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  65. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  66. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  67. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  68. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  69. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  70. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  71. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  72. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  73. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  74. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  75. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  76. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  77. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  78. investing_algorithm_framework/cli/validate_backtest_checkpoints.py +197 -0
  79. investing_algorithm_framework/create_app.py +43 -9
  80. investing_algorithm_framework/dependency_container.py +121 -33
  81. investing_algorithm_framework/domain/__init__.py +109 -22
  82. investing_algorithm_framework/domain/algorithm_id.py +69 -0
  83. investing_algorithm_framework/domain/backtesting/__init__.py +25 -0
  84. investing_algorithm_framework/domain/backtesting/backtest.py +548 -0
  85. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +113 -0
  86. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +241 -0
  87. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +470 -0
  88. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  89. investing_algorithm_framework/domain/backtesting/backtest_run.py +663 -0
  90. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  91. investing_algorithm_framework/domain/backtesting/backtest_utils.py +198 -0
  92. investing_algorithm_framework/domain/backtesting/combine_backtests.py +392 -0
  93. investing_algorithm_framework/domain/config.py +60 -138
  94. investing_algorithm_framework/domain/constants.py +23 -34
  95. investing_algorithm_framework/domain/data_provider.py +334 -0
  96. investing_algorithm_framework/domain/data_structures.py +42 -0
  97. investing_algorithm_framework/domain/decimal_parsing.py +40 -0
  98. investing_algorithm_framework/domain/exceptions.py +51 -1
  99. investing_algorithm_framework/domain/models/__init__.py +29 -14
  100. investing_algorithm_framework/domain/models/app_mode.py +34 -0
  101. investing_algorithm_framework/domain/models/base_model.py +3 -1
  102. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  103. investing_algorithm_framework/domain/models/data/data_source.py +222 -0
  104. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  105. investing_algorithm_framework/domain/models/event.py +35 -0
  106. investing_algorithm_framework/domain/models/market/__init__.py +5 -0
  107. investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
  108. investing_algorithm_framework/domain/models/order/__init__.py +3 -4
  109. investing_algorithm_framework/domain/models/order/order.py +243 -86
  110. investing_algorithm_framework/domain/models/order/order_status.py +2 -2
  111. investing_algorithm_framework/domain/models/order/order_type.py +1 -3
  112. investing_algorithm_framework/domain/models/portfolio/__init__.py +7 -2
  113. investing_algorithm_framework/domain/models/portfolio/portfolio.py +134 -1
  114. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +37 -37
  115. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +208 -0
  116. investing_algorithm_framework/domain/models/position/__init__.py +3 -2
  117. investing_algorithm_framework/domain/models/position/position.py +29 -0
  118. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  119. investing_algorithm_framework/domain/models/position/{position_cost.py → position_snapshot.py} +16 -8
  120. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  121. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  122. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -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 +94 -98
  126. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  127. investing_algorithm_framework/domain/models/time_unit.py +111 -2
  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 +11 -0
  131. investing_algorithm_framework/domain/models/trade/trade.py +389 -0
  132. investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
  133. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
  134. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
  135. investing_algorithm_framework/domain/order_executor.py +112 -0
  136. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  137. investing_algorithm_framework/domain/services/__init__.py +11 -0
  138. investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
  139. investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
  140. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
  141. investing_algorithm_framework/domain/services/rounding_service.py +27 -0
  142. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  143. investing_algorithm_framework/domain/strategy.py +1 -29
  144. investing_algorithm_framework/domain/utils/__init__.py +16 -4
  145. investing_algorithm_framework/domain/utils/csv.py +22 -0
  146. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  147. investing_algorithm_framework/domain/utils/dates.py +57 -0
  148. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  149. investing_algorithm_framework/domain/utils/polars.py +53 -0
  150. investing_algorithm_framework/domain/utils/random.py +29 -0
  151. investing_algorithm_framework/download_data.py +244 -0
  152. investing_algorithm_framework/infrastructure/__init__.py +39 -11
  153. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  154. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1152 -0
  155. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  156. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  157. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  158. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +87 -13
  159. investing_algorithm_framework/infrastructure/models/__init__.py +13 -4
  160. investing_algorithm_framework/infrastructure/models/decimal_parser.py +14 -0
  161. investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -2
  162. investing_algorithm_framework/infrastructure/models/order/order.py +73 -73
  163. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  164. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  165. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +3 -2
  166. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +37 -0
  167. investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +57 -3
  168. investing_algorithm_framework/infrastructure/models/position/__init__.py +2 -2
  169. investing_algorithm_framework/infrastructure/models/position/position.py +16 -11
  170. investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +23 -0
  171. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  172. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  173. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
  174. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
  175. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  176. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  177. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  178. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  179. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  180. investing_algorithm_framework/infrastructure/repositories/__init__.py +13 -5
  181. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  182. investing_algorithm_framework/infrastructure/repositories/order_repository.py +32 -19
  183. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +2 -2
  184. investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +56 -0
  185. investing_algorithm_framework/infrastructure/repositories/position_repository.py +47 -4
  186. investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +21 -0
  187. investing_algorithm_framework/infrastructure/repositories/repository.py +85 -31
  188. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  189. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
  190. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
  191. investing_algorithm_framework/infrastructure/services/__init__.py +9 -2
  192. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  193. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +193 -0
  194. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  195. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  196. investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +9 -0
  197. investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +2596 -0
  198. investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +285 -0
  199. investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +468 -0
  200. investing_algorithm_framework/services/__init__.py +127 -10
  201. investing_algorithm_framework/services/configuration_service.py +95 -0
  202. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  203. investing_algorithm_framework/services/data_providers/data_provider_service.py +1058 -0
  204. investing_algorithm_framework/services/market_credential_service.py +40 -0
  205. investing_algorithm_framework/services/metrics/__init__.py +119 -0
  206. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  207. investing_algorithm_framework/services/metrics/beta.py +0 -0
  208. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  209. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  210. investing_algorithm_framework/services/metrics/drawdown.py +218 -0
  211. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  212. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  213. investing_algorithm_framework/services/metrics/generate.py +358 -0
  214. investing_algorithm_framework/services/metrics/mean_daily_return.py +84 -0
  215. investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
  216. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  217. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  218. investing_algorithm_framework/services/metrics/returns.py +452 -0
  219. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  220. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  221. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  222. investing_algorithm_framework/services/metrics/standard_deviation.py +156 -0
  223. investing_algorithm_framework/services/metrics/trades.py +473 -0
  224. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  225. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  226. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  227. investing_algorithm_framework/services/metrics/volatility.py +118 -0
  228. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  229. investing_algorithm_framework/services/order_service/__init__.py +9 -0
  230. investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
  231. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  232. investing_algorithm_framework/services/order_service/order_service.py +826 -0
  233. investing_algorithm_framework/services/portfolios/__init__.py +16 -0
  234. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
  235. investing_algorithm_framework/services/{portfolio_configuration_service.py → portfolios/portfolio_configuration_service.py} +27 -12
  236. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  237. investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
  238. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
  239. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
  240. investing_algorithm_framework/services/positions/__init__.py +7 -0
  241. investing_algorithm_framework/services/positions/position_service.py +210 -0
  242. investing_algorithm_framework/services/positions/position_snapshot_service.py +18 -0
  243. investing_algorithm_framework/services/repository_service.py +8 -2
  244. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  245. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +117 -0
  246. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  247. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  248. investing_algorithm_framework/services/trade_service/__init__.py +9 -0
  249. investing_algorithm_framework/services/trade_service/trade_service.py +1099 -0
  250. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  251. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  252. investing_algorithm_framework-7.25.6.dist-info/METADATA +535 -0
  253. investing_algorithm_framework-7.25.6.dist-info/RECORD +268 -0
  254. {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/WHEEL +1 -2
  255. investing_algorithm_framework-7.25.6.dist-info/entry_points.txt +3 -0
  256. investing_algorithm_framework/app/algorithm.py +0 -410
  257. investing_algorithm_framework/domain/models/market_data/__init__.py +0 -11
  258. investing_algorithm_framework/domain/models/market_data/asset_price.py +0 -50
  259. investing_algorithm_framework/domain/models/market_data/ohlcv.py +0 -76
  260. investing_algorithm_framework/domain/models/market_data/order_book.py +0 -63
  261. investing_algorithm_framework/domain/models/market_data/ticker.py +0 -92
  262. investing_algorithm_framework/domain/models/order/order_fee.py +0 -45
  263. investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
  264. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -205
  265. investing_algorithm_framework/domain/singleton.py +0 -9
  266. investing_algorithm_framework/infrastructure/models/order/order_fee.py +0 -21
  267. investing_algorithm_framework/infrastructure/models/position/position_cost.py +0 -32
  268. investing_algorithm_framework/infrastructure/repositories/order_fee_repository.py +0 -15
  269. investing_algorithm_framework/infrastructure/repositories/position_cost_repository.py +0 -16
  270. investing_algorithm_framework/infrastructure/services/market_service.py +0 -422
  271. investing_algorithm_framework/services/market_data_service.py +0 -75
  272. investing_algorithm_framework/services/order_service.py +0 -464
  273. investing_algorithm_framework/services/portfolio_service.py +0 -105
  274. investing_algorithm_framework/services/position_cost_service.py +0 -5
  275. investing_algorithm_framework/services/position_service.py +0 -50
  276. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -219
  277. investing_algorithm_framework/setup_logging.py +0 -40
  278. investing_algorithm_framework-1.3.1.dist-info/AUTHORS.md +0 -8
  279. investing_algorithm_framework-1.3.1.dist-info/METADATA +0 -172
  280. investing_algorithm_framework-1.3.1.dist-info/RECORD +0 -103
  281. investing_algorithm_framework-1.3.1.dist-info/top_level.txt +0 -1
  282. {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/LICENSE +0 -0
@@ -0,0 +1,244 @@
1
+ from dataclasses import dataclass
2
+ from pathlib import Path
3
+ from dateutil import parser
4
+ from datetime import timezone, datetime
5
+ import pandas
6
+ import polars
7
+ from typing import Union, Optional
8
+
9
+ from investing_algorithm_framework.services import DataProviderService, \
10
+ ConfigurationService, MarketCredentialService
11
+ from investing_algorithm_framework.infrastructure import \
12
+ get_default_data_providers
13
+ from investing_algorithm_framework.domain import DataSource, \
14
+ OperationalException, DataType
15
+
16
+
17
+ @dataclass
18
+ class DownloadResult:
19
+ """
20
+ Result container for download function.
21
+
22
+ Attributes:
23
+ data: The downloaded data as a pandas or polars DataFrame.
24
+ path: The file path where the data was saved (None if not saved).
25
+ """
26
+ data: Union[pandas.DataFrame, polars.DataFrame]
27
+ path: Optional[Path] = None
28
+
29
+
30
+ def create_data_storage_path(
31
+ symbol: str,
32
+ market: str,
33
+ time_frame: str,
34
+ start_date: datetime,
35
+ end_date: datetime,
36
+ storage_path: str,
37
+ data_type: str = "ohlcv",
38
+ ) -> Path:
39
+ """
40
+ Create the file path where data would be stored.
41
+
42
+ This function generates the same path that the download function
43
+ uses when saving data, allowing you to reference the file later.
44
+
45
+ Args:
46
+ symbol: Trading pair (e.g., "BTC/EUR")
47
+ market: Market identifier (e.g., "BITVAVO")
48
+ time_frame: Time frame (e.g., "2h", "4h", "1d")
49
+ start_date: Start date of the data
50
+ end_date: End date of the data
51
+ storage_path: Base directory for storing files
52
+ data_type: Type of data (default: "ohlcv")
53
+
54
+ Returns:
55
+ Path: The full file path where data would be stored.
56
+ """
57
+ datetime_format = "%Y-%m-%d-%H-%M"
58
+ symbol_formatted = symbol.upper().replace('/', '-')
59
+ start_date_str = start_date.strftime(datetime_format)
60
+ end_date_str = end_date.strftime(datetime_format)
61
+ filename = (
62
+ f"{data_type.upper()}_{symbol_formatted}_{market.upper()}_"
63
+ f"{time_frame}_{start_date_str}_{end_date_str}.csv"
64
+ )
65
+ return Path(storage_path) / filename
66
+
67
+
68
+ def download(
69
+ symbol: str,
70
+ market: str = None,
71
+ date: Union[datetime, str] = None,
72
+ time_frame: str = None,
73
+ data_type: Union[str, DataType] = DataType.OHLCV,
74
+ start_date: Union[datetime, str] = None,
75
+ end_date: Union[datetime, str] = None,
76
+ window_size: int = 200,
77
+ pandas: bool = True,
78
+ save: bool = True,
79
+ storage_path: Union[str, Path] = None,
80
+ save_to: Union[str, Path] = None,
81
+ ) -> Union[pandas.DataFrame, polars.DataFrame]:
82
+ """
83
+ Download market data from the specified source. This function
84
+ uses the MarketDataSourceService to get the data provider
85
+ for the given set of parameters.
86
+
87
+ Args:
88
+ symbol (str): The symbol to download data for.
89
+ market (str): The market to download data from.
90
+ data_type (str): The type of data to
91
+ download (e.g., "ohlcv", "ticker").
92
+ start_date (str): The start date for the data download.
93
+ end_date (str): The end date for the data download.
94
+ window_size (int): The size of the data window.
95
+ pandas (bool): Whether to return the data as a pandas DataFrame.
96
+ save (bool): Whether to save the downloaded data.
97
+ storage_path (str): The directory to save the downloaded data.
98
+ save_to (str): The path to save the downloaded data. If provided,
99
+ it overrides storage_path.
100
+ time_frame (str): The time frame for the data download.
101
+ date (str): The date for the data download.
102
+ window_size (int): The size of the data window.
103
+ pandas (bool): Whether to return the data as a pandas DataFrame.
104
+
105
+ Returns:
106
+ None
107
+ """
108
+ configuration_service = ConfigurationService()
109
+ market_credential_service = MarketCredentialService()
110
+ data_provider_service = DataProviderService(
111
+ default_data_providers=get_default_data_providers(),
112
+ configuration_service=configuration_service,
113
+ market_credential_service=market_credential_service,
114
+ )
115
+
116
+ if start_date is not None and isinstance(start_date, str):
117
+ start_date = parser.parse(start_date)
118
+ start_date = start_date.replace(tzinfo=timezone.utc)
119
+
120
+ if end_date is not None and isinstance(end_date, str):
121
+ end_date = parser.parse(end_date)
122
+ end_date = end_date.replace(tzinfo=timezone.utc)
123
+
124
+ if date is not None and isinstance(date, str):
125
+ date = parser.parse(date)
126
+ date = date.replace(tzinfo=timezone.utc)
127
+
128
+ # Check if all the datetime parameters are in UTC
129
+ if date is not None \
130
+ and (date.tzinfo is None or date.tzinfo != timezone.utc):
131
+ raise OperationalException("Date must be a UTC datetime object")
132
+
133
+ if start_date is not None \
134
+ and (
135
+ start_date.tzinfo is None or start_date.tzinfo != timezone.utc
136
+ ):
137
+ raise OperationalException("Start date must be a UTC datetime object")
138
+
139
+ if end_date is not None \
140
+ and (end_date.tzinfo is None or end_date.tzinfo != timezone.utc):
141
+ raise OperationalException("End date must be a UTC datetime object")
142
+
143
+ data_source = DataSource(
144
+ symbol=symbol,
145
+ market=market,
146
+ data_type=data_type,
147
+ time_frame=time_frame,
148
+ date=date,
149
+ start_date=start_date,
150
+ end_date=end_date,
151
+ window_size=window_size,
152
+ pandas=pandas,
153
+ save=save,
154
+ storage_path=storage_path
155
+ )
156
+ data_provider_service.index_data_providers(
157
+ data_sources=[data_source]
158
+ )
159
+ return data_provider_service.get_data(
160
+ data_source=data_source,
161
+ date=date,
162
+ start_date=start_date,
163
+ end_date=end_date,
164
+ )
165
+
166
+
167
+ def download_v2(
168
+ symbol: str,
169
+ market: str = None,
170
+ date: Union[datetime, str] = None,
171
+ time_frame: str = None,
172
+ data_type: Union[str, DataType] = DataType.OHLCV,
173
+ start_date: Union[datetime, str] = None,
174
+ end_date: Union[datetime, str] = None,
175
+ window_size: int = 200,
176
+ pandas: bool = True,
177
+ save: bool = True,
178
+ storage_path: Union[str, Path] = None,
179
+ ) -> DownloadResult:
180
+ """
181
+ Download market data and return both the DataFrame and file path.
182
+
183
+ This is an improved version of download() that returns a DownloadResult
184
+ containing both the downloaded data and the file path where it was saved.
185
+
186
+ Args:
187
+ symbol: Trading pair (e.g., "BTC/EUR")
188
+ market: Market identifier (e.g., "BITVAVO")
189
+ time_frame: Time frame (e.g., "2h", "4h", "1d")
190
+ data_type: Type of data (default: "ohlcv")
191
+ start_date: Start date for data range
192
+ end_date: End date for data range
193
+ date: Specific date for data download
194
+ window_size: Size of the data window
195
+ pandas: Whether to return the data as a pandas DataFrame
196
+ save: Whether to save the data to disk
197
+ storage_path: Base directory for storing files
198
+
199
+ Returns:
200
+ DownloadResult with .data (DataFrame) and .path (Path or None)
201
+ """
202
+ # Parse dates if they are strings
203
+ parsed_start_date = start_date
204
+ parsed_end_date = end_date
205
+
206
+ if parsed_start_date is not None and isinstance(parsed_start_date, str):
207
+ parsed_start_date = parser.parse(parsed_start_date)
208
+ parsed_start_date = parsed_start_date.replace(tzinfo=timezone.utc)
209
+
210
+ if parsed_end_date is not None and isinstance(parsed_end_date, str):
211
+ parsed_end_date = parser.parse(parsed_end_date)
212
+ parsed_end_date = parsed_end_date.replace(tzinfo=timezone.utc)
213
+
214
+ # Download the data using the existing function
215
+ data = download(
216
+ symbol=symbol,
217
+ market=market,
218
+ date=date,
219
+ time_frame=time_frame,
220
+ data_type=data_type,
221
+ start_date=start_date,
222
+ end_date=end_date,
223
+ window_size=window_size,
224
+ pandas=pandas,
225
+ save=save,
226
+ storage_path=storage_path,
227
+ )
228
+
229
+ # Determine the file path if data was saved
230
+ file_path = None
231
+ if save and storage_path and parsed_start_date and parsed_end_date:
232
+ data_type_str = data_type.value \
233
+ if isinstance(data_type, DataType) else data_type
234
+ file_path = create_data_storage_path(
235
+ symbol=symbol,
236
+ market=market,
237
+ time_frame=time_frame,
238
+ start_date=parsed_start_date,
239
+ end_date=parsed_end_date,
240
+ storage_path=str(storage_path),
241
+ data_type=data_type_str,
242
+ )
243
+
244
+ return DownloadResult(data=data, path=file_path)
@@ -1,24 +1,52 @@
1
- from .repositories import SQLOrderRepository, SQLPositionRepository, \
2
- SQLPortfolioRepository, SQLPositionCostRepository, SQLOrderFeeRepository
3
- from .services import MarketService
4
1
  from .database import setup_sqlalchemy, Session, \
5
- create_all_tables
6
- from .models import SQLPortfolio, SQLOrder, SQLPosition, SQLOrderFee, \
7
- SQLPositionCost
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
+ BacktestService
13
+ from .data_providers import CSVOHLCVDataProvider, get_default_data_providers, \
14
+ get_default_ohlcv_data_providers, CCXTOHLCVDataProvider, \
15
+ PandasOHLCVDataProvider
16
+ from .order_executors import CCXTOrderExecutor, BacktestOrderExecutor
17
+ from .portfolio_providers import CCXTPortfolioProvider
8
18
 
9
19
  __all__ = [
20
+ "clear_db",
10
21
  "create_all_tables",
11
22
  "SQLPositionRepository",
12
23
  "SQLPortfolioRepository",
13
- "SQLPositionCostRepository",
14
24
  "SQLOrderRepository",
15
- "SQLOrderFeeRepository",
16
- "MarketService",
25
+ "SQLPortfolioSnapshotRepository",
26
+ "SQLPositionSnapshotRepository",
17
27
  "setup_sqlalchemy",
18
28
  "Session",
19
29
  "SQLPortfolio",
30
+ "SQLTrade",
20
31
  "SQLOrder",
21
- "SQLOrderFee",
22
32
  "SQLPosition",
23
- "SQLPositionCost"
33
+ "SQLPortfolioSnapshot",
34
+ "SQLPositionSnapshot",
35
+ "AzureBlobStorageStateHandler",
36
+ "SQLTradeRepository",
37
+ "SQLTradeTakeProfit",
38
+ "SQLTradeStopLoss",
39
+ "SQLTradeTakeProfitRepository",
40
+ "SQLTradeStopLossRepository",
41
+ "SQLOrderMetadataRepository",
42
+ "CSVOHLCVDataProvider",
43
+ "CCXTOrderExecutor",
44
+ "CCXTPortfolioProvider",
45
+ "get_default_data_providers",
46
+ "get_default_ohlcv_data_providers",
47
+ "AWSS3StorageStateHandler",
48
+ "CCXTOHLCVDataProvider",
49
+ "BacktestOrderExecutor",
50
+ "PandasOHLCVDataProvider",
51
+ "BacktestService",
24
52
  ]
@@ -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
+ ]