investing-algorithm-framework 3.7.0__py3-none-any.whl → 7.19.15__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 (256) hide show
  1. investing_algorithm_framework/__init__.py +168 -45
  2. investing_algorithm_framework/app/__init__.py +32 -1
  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 +1933 -589
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1725 -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/action_handlers/__init__.py +4 -2
  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 +1 -1
  39. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
  40. investing_algorithm_framework/app/strategy.py +664 -84
  41. investing_algorithm_framework/app/task.py +5 -3
  42. investing_algorithm_framework/app/web/__init__.py +2 -1
  43. investing_algorithm_framework/app/web/create_app.py +4 -2
  44. investing_algorithm_framework/cli/__init__.py +0 -0
  45. investing_algorithm_framework/cli/cli.py +226 -0
  46. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
  47. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  48. investing_algorithm_framework/cli/initialize_app.py +603 -0
  49. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  50. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  51. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  52. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  53. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  54. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  55. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  56. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  57. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  58. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  59. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  60. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  61. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  62. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  63. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  64. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  65. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  66. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  67. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  68. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  69. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  70. investing_algorithm_framework/create_app.py +40 -6
  71. investing_algorithm_framework/dependency_container.py +72 -56
  72. investing_algorithm_framework/domain/__init__.py +71 -47
  73. investing_algorithm_framework/domain/backtesting/__init__.py +21 -0
  74. investing_algorithm_framework/domain/backtesting/backtest.py +503 -0
  75. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +96 -0
  76. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +242 -0
  77. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +459 -0
  78. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  79. investing_algorithm_framework/domain/backtesting/backtest_run.py +605 -0
  80. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  81. investing_algorithm_framework/domain/backtesting/combine_backtests.py +280 -0
  82. investing_algorithm_framework/domain/config.py +59 -91
  83. investing_algorithm_framework/domain/constants.py +13 -38
  84. investing_algorithm_framework/domain/data_provider.py +334 -0
  85. investing_algorithm_framework/domain/data_structures.py +3 -2
  86. investing_algorithm_framework/domain/exceptions.py +51 -1
  87. investing_algorithm_framework/domain/models/__init__.py +17 -12
  88. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  89. investing_algorithm_framework/domain/models/data/data_source.py +214 -0
  90. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  91. investing_algorithm_framework/domain/models/event.py +35 -0
  92. investing_algorithm_framework/domain/models/market/market_credential.py +55 -1
  93. investing_algorithm_framework/domain/models/order/order.py +77 -83
  94. investing_algorithm_framework/domain/models/order/order_status.py +2 -2
  95. investing_algorithm_framework/domain/models/order/order_type.py +1 -3
  96. investing_algorithm_framework/domain/models/portfolio/portfolio.py +81 -3
  97. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +26 -3
  98. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +108 -11
  99. investing_algorithm_framework/domain/models/position/__init__.py +2 -1
  100. investing_algorithm_framework/domain/models/position/position.py +12 -0
  101. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  102. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  103. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  104. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
  105. investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
  106. investing_algorithm_framework/domain/models/strategy_profile.py +19 -151
  107. investing_algorithm_framework/domain/models/time_frame.py +37 -0
  108. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  109. investing_algorithm_framework/domain/models/time_unit.py +66 -2
  110. investing_algorithm_framework/domain/models/trade/__init__.py +8 -1
  111. investing_algorithm_framework/domain/models/trade/trade.py +295 -171
  112. investing_algorithm_framework/domain/models/trade/trade_status.py +9 -2
  113. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
  114. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
  115. investing_algorithm_framework/domain/order_executor.py +112 -0
  116. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  117. investing_algorithm_framework/domain/services/__init__.py +2 -9
  118. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -6
  119. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  120. investing_algorithm_framework/domain/strategy.py +1 -29
  121. investing_algorithm_framework/domain/utils/__init__.py +12 -7
  122. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  123. investing_algorithm_framework/domain/utils/dates.py +57 -0
  124. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  125. investing_algorithm_framework/domain/utils/polars.py +53 -0
  126. investing_algorithm_framework/domain/utils/random.py +29 -0
  127. investing_algorithm_framework/download_data.py +108 -0
  128. investing_algorithm_framework/infrastructure/__init__.py +31 -18
  129. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  130. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1143 -0
  131. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  132. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  133. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  134. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +86 -12
  135. investing_algorithm_framework/infrastructure/models/__init__.py +6 -11
  136. investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -1
  137. investing_algorithm_framework/infrastructure/models/order/order.py +35 -49
  138. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  139. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  140. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +1 -1
  141. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +8 -0
  142. investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +17 -5
  143. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  144. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  145. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
  146. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
  147. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  148. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  149. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  150. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  151. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  152. investing_algorithm_framework/infrastructure/repositories/__init__.py +8 -0
  153. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  154. investing_algorithm_framework/infrastructure/repositories/order_repository.py +5 -0
  155. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +1 -1
  156. investing_algorithm_framework/infrastructure/repositories/position_repository.py +11 -0
  157. investing_algorithm_framework/infrastructure/repositories/repository.py +81 -27
  158. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  159. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
  160. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
  161. investing_algorithm_framework/infrastructure/services/__init__.py +4 -4
  162. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  163. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +113 -0
  164. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  165. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  166. investing_algorithm_framework/services/__init__.py +113 -16
  167. investing_algorithm_framework/services/backtesting/__init__.py +0 -7
  168. investing_algorithm_framework/services/backtesting/backtest_service.py +566 -359
  169. investing_algorithm_framework/services/configuration_service.py +77 -11
  170. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  171. investing_algorithm_framework/services/data_providers/data_provider_service.py +850 -0
  172. investing_algorithm_framework/services/market_credential_service.py +16 -1
  173. investing_algorithm_framework/services/metrics/__init__.py +114 -0
  174. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  175. investing_algorithm_framework/services/metrics/beta.py +0 -0
  176. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  177. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  178. investing_algorithm_framework/services/metrics/drawdown.py +181 -0
  179. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  180. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  181. investing_algorithm_framework/services/metrics/generate.py +358 -0
  182. investing_algorithm_framework/services/metrics/mean_daily_return.py +83 -0
  183. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  184. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  185. investing_algorithm_framework/services/metrics/returns.py +452 -0
  186. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  187. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  188. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  189. investing_algorithm_framework/services/metrics/standard_deviation.py +157 -0
  190. investing_algorithm_framework/services/metrics/trades.py +500 -0
  191. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  192. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  193. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  194. investing_algorithm_framework/services/metrics/volatility.py +97 -0
  195. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  196. investing_algorithm_framework/services/order_service/__init__.py +3 -1
  197. investing_algorithm_framework/services/order_service/order_backtest_service.py +76 -89
  198. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  199. investing_algorithm_framework/services/order_service/order_service.py +407 -326
  200. investing_algorithm_framework/services/portfolios/__init__.py +3 -1
  201. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +37 -3
  202. investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +22 -8
  203. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  204. investing_algorithm_framework/services/portfolios/portfolio_service.py +96 -28
  205. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +97 -28
  206. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +116 -313
  207. investing_algorithm_framework/services/positions/__init__.py +7 -0
  208. investing_algorithm_framework/services/positions/position_service.py +210 -0
  209. investing_algorithm_framework/services/repository_service.py +8 -2
  210. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  211. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +113 -0
  212. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  213. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  214. investing_algorithm_framework/services/trade_service/__init__.py +7 -1
  215. investing_algorithm_framework/services/trade_service/trade_service.py +1013 -315
  216. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  217. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  218. investing_algorithm_framework-7.19.15.dist-info/METADATA +537 -0
  219. investing_algorithm_framework-7.19.15.dist-info/RECORD +263 -0
  220. investing_algorithm_framework-7.19.15.dist-info/entry_points.txt +3 -0
  221. investing_algorithm_framework/app/algorithm.py +0 -1105
  222. investing_algorithm_framework/domain/graphs.py +0 -382
  223. investing_algorithm_framework/domain/metrics/__init__.py +0 -6
  224. investing_algorithm_framework/domain/models/backtesting/__init__.py +0 -11
  225. investing_algorithm_framework/domain/models/backtesting/backtest_date_range.py +0 -43
  226. investing_algorithm_framework/domain/models/backtesting/backtest_position.py +0 -120
  227. investing_algorithm_framework/domain/models/backtesting/backtest_report.py +0 -580
  228. investing_algorithm_framework/domain/models/backtesting/backtest_reports_evaluation.py +0 -243
  229. investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
  230. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -223
  231. investing_algorithm_framework/domain/services/market_data_sources.py +0 -344
  232. investing_algorithm_framework/domain/services/market_service.py +0 -153
  233. investing_algorithm_framework/domain/singleton.py +0 -9
  234. investing_algorithm_framework/domain/utils/backtesting.py +0 -472
  235. investing_algorithm_framework/infrastructure/models/market_data_sources/__init__.py +0 -12
  236. investing_algorithm_framework/infrastructure/models/market_data_sources/ccxt.py +0 -559
  237. investing_algorithm_framework/infrastructure/models/market_data_sources/csv.py +0 -254
  238. investing_algorithm_framework/infrastructure/models/market_data_sources/us_treasury_yield.py +0 -47
  239. investing_algorithm_framework/infrastructure/services/market_service/__init__.py +0 -5
  240. investing_algorithm_framework/infrastructure/services/market_service/ccxt_market_service.py +0 -455
  241. investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -7
  242. investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -2
  243. investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -350
  244. investing_algorithm_framework/services/backtesting/backtest_report_writer_service.py +0 -53
  245. investing_algorithm_framework/services/backtesting/graphs.py +0 -61
  246. investing_algorithm_framework/services/market_data_source_service/__init__.py +0 -8
  247. investing_algorithm_framework/services/market_data_source_service/backtest_market_data_source_service.py +0 -150
  248. investing_algorithm_framework/services/market_data_source_service/market_data_source_service.py +0 -189
  249. investing_algorithm_framework/services/position_service.py +0 -31
  250. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -264
  251. investing_algorithm_framework-3.7.0.dist-info/METADATA +0 -339
  252. investing_algorithm_framework-3.7.0.dist-info/RECORD +0 -147
  253. /investing_algorithm_framework/{domain → services}/metrics/price_efficiency.py +0 -0
  254. /investing_algorithm_framework/services/{position_snapshot_service.py → positions/position_snapshot_service.py} +0 -0
  255. {investing_algorithm_framework-3.7.0.dist-info → investing_algorithm_framework-7.19.15.dist-info}/LICENSE +0 -0
  256. {investing_algorithm_framework-3.7.0.dist-info → investing_algorithm_framework-7.19.15.dist-info}/WHEEL +0 -0
@@ -1,254 +0,0 @@
1
- import logging
2
- from datetime import datetime
3
-
4
- import polars
5
- from dateutil.parser import parse
6
-
7
- from investing_algorithm_framework.domain import OHLCVMarketDataSource, \
8
- BacktestMarketDataSource, OperationalException, TickerMarketDataSource, \
9
- DATETIME_FORMAT
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
-
14
- class CSVOHLCVMarketDataSource(OHLCVMarketDataSource):
15
- """
16
- Implementation of a OHLCV data source that reads OHLCV data
17
- from a csv file. Market data source that reads OHLCV data from a csv file.
18
- """
19
-
20
- def empty(self, start_date, end_date=None):
21
- if end_date is None:
22
- end_date = self.create_end_date(
23
- start_date, self.timeframe, self.window_size
24
- )
25
- data = self.get_data(start_date=start_date, end_date=end_date)
26
- return len(data) == 0
27
-
28
- def __init__(
29
- self,
30
- csv_file_path,
31
- identifier=None,
32
- market=None,
33
- symbol=None,
34
- timeframe=None,
35
- window_size=None,
36
- ):
37
- super().__init__(
38
- identifier=identifier,
39
- market=market,
40
- symbol=symbol,
41
- timeframe=timeframe,
42
- window_size=window_size,
43
- )
44
- self._csv_file_path = csv_file_path
45
- self._columns = [
46
- "Datetime", "Open", "High", "Low", "Close", "Volume"
47
- ]
48
- df = polars.read_csv(csv_file_path)
49
-
50
- # Check if all column names are in the csv file
51
- if not all(column in df.columns for column in self._columns):
52
- # Identify missing columns
53
- missing_columns = [column for column in self._columns if
54
- column not in df.columns]
55
- raise OperationalException(
56
- f"Csv file {self._csv_file_path} does not contain "
57
- f"all required ohlcv columns. "
58
- f"Missing columns: {missing_columns}"
59
- )
60
-
61
- first_row = df.head(1)
62
- last_row = df.tail(1)
63
- self._start_date_data_source = parse(first_row["Datetime"][0])
64
- self._end_date_data_source = parse(last_row["Datetime"][0])
65
-
66
- @property
67
- def csv_file_path(self):
68
- return self._csv_file_path
69
-
70
- def get_data(self, **kwargs):
71
- """
72
- Get the data from the csv file. The data can be filtered by
73
- the start_date and end_date in the kwargs. backtest_index_date
74
- can also be provided to filter the data, where this will be used
75
- as start_date.
76
-
77
- Args:
78
- **kwargs: Keyword arguments that can contain the following:
79
- start_date (datetime): The start date to filter the data.
80
- end_date (datetime): The end date to filter the data.
81
- backtest_index_date (datetime): The backtest index date to
82
- filter the data. This will be used as start_date.
83
-
84
- Returns:
85
- df (polars.DataFrame): The data from the csv file.
86
- """
87
- start_date = kwargs.get("start_date")
88
- end_date = kwargs.get("end_date")
89
- backtest_index_date = kwargs.get("backtest_index_date")
90
-
91
- if start_date is None \
92
- and end_date is None \
93
- and backtest_index_date is None:
94
- return polars.read_csv(
95
- self.csv_file_path, columns=self._columns, separator=","
96
- )
97
-
98
- if backtest_index_date is not None:
99
- end_date = backtest_index_date
100
- start_date = self.create_start_date(
101
- end_date, self.timeframe, self.window_size
102
- )
103
- else:
104
- if start_date is None:
105
- start_date = self.create_start_date(
106
- end_date, self.timeframe, self.window_size
107
- )
108
-
109
- if end_date is None:
110
- end_date = self.create_end_date(
111
- start_date, self.timeframe, self.window_size
112
- )
113
-
114
- # # Check if start or end date are out of range with
115
- # # the dates of the datasource.
116
- # if self._start_date_data_source > start_date:
117
- # raise OperationalException(
118
- # f"Given start date {start_date} is before the start date "
119
- # f"of the data source {self._start_date_data_source}"
120
- # )
121
- #
122
- # if self._end_date_data_source < end_date:
123
- # raise OperationalException(
124
- # f"End date {end_date} is after the end date "
125
- # f"of the data source {self._end_date_data_source}"
126
- # )
127
-
128
- df = polars.read_csv(
129
- self.csv_file_path, columns=self._columns, separator=","
130
- )
131
- df = df.filter(
132
- (df['Datetime'] >= start_date.strftime(DATETIME_FORMAT))
133
- & (df['Datetime'] <= end_date.strftime(DATETIME_FORMAT))
134
- )
135
- return df
136
-
137
- def dataframe_to_list_of_lists(self, dataframe, columns):
138
- # Extract selected columns from DataFrame and convert
139
- # to a list of lists
140
- data_list_of_lists = dataframe[columns].values.tolist()
141
- return data_list_of_lists
142
-
143
- def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
144
- pass
145
-
146
-
147
- class CSVTickerMarketDataSource(TickerMarketDataSource):
148
-
149
- def __init__(
150
- self,
151
- identifier,
152
- market,
153
- symbol,
154
- csv_file_path,
155
- ):
156
- super().__init__(
157
- identifier=identifier,
158
- market=market,
159
- symbol=symbol,
160
- )
161
- self._csv_file_path = csv_file_path
162
- self._columns = [
163
- "Datetime", "Open", "High", "Low", "Close", "Volume"
164
- ]
165
- df = polars.read_csv(self._csv_file_path)
166
-
167
- if not all(column in df.columns for column in self._columns):
168
- # Identify missing columns
169
- missing_columns = [column for column in self._columns if
170
- column not in df.columns]
171
- raise OperationalException(
172
- f"Csv file {self._csv_file_path} does not contain "
173
- f"all required ohlcv columns. "
174
- f"Missing columns: {missing_columns}"
175
- )
176
-
177
- first_row = df.head(1)
178
- last_row = df.tail(1)
179
- self._start_date_data_source = parse(first_row["Datetime"][0])
180
- self._end_date_data_source = parse(last_row["Datetime"][0])
181
-
182
- @property
183
- def csv_file_path(self):
184
- return self._csv_file_path
185
-
186
- def get_data(self, **kwargs):
187
- date = None
188
-
189
- if "index_datetime" in kwargs:
190
- date = kwargs["index_datetime"]
191
-
192
- if "start_date" in kwargs:
193
- date = kwargs["start_date"]
194
-
195
- if 'date' in kwargs:
196
- date = kwargs['date']
197
-
198
- if date is None:
199
- raise OperationalException("Date is required to get ticker data")
200
-
201
- if not isinstance(date, datetime):
202
-
203
- if isinstance(date, str):
204
- date = parse(date)
205
- else:
206
- raise OperationalException(
207
- "Date value should be either a string or datetime object"
208
- )
209
-
210
- if date < self._start_date_data_source:
211
- raise OperationalException(
212
- f"Date {date} is before the start date "
213
- f"of the data source {self._start_date_data_source}"
214
- )
215
-
216
- if date > self._end_date_data_source:
217
- raise OperationalException(
218
- f"Date {date} is after the end date "
219
- f"of the data source {self._end_date_data_source}"
220
- )
221
-
222
- # Filter the data based on the backtest index date and the end date
223
- df = polars.read_csv(self._csv_file_path)
224
- df = df.filter(
225
- (df['Datetime'] >= date.strftime(DATETIME_FORMAT))
226
- )
227
-
228
- # Check if the dataframe is empty
229
- if df.shape[0] == 0:
230
- raise OperationalException(
231
- f"No ticker data found for {self.symbol} "
232
- f"at {date.strftime(DATETIME_FORMAT)}"
233
- )
234
-
235
- first_row = df.head(1)[0]
236
-
237
- # Calculate the bid and ask price based on the high and low price
238
- return {
239
- "symbol": self.symbol,
240
- "bid": float((first_row["Low"][0])
241
- + float(first_row["High"][0])) / 2,
242
- "ask": float((first_row["Low"][0])
243
- + float(first_row["High"][0])) / 2,
244
- "datetime": first_row["Datetime"][0],
245
- }
246
-
247
- def dataframe_to_list_of_lists(self, dataframe, columns):
248
- # Extract selected columns from DataFrame and convert
249
- # to a list of lists
250
- data_list_of_lists = dataframe[columns].values.tolist()
251
- return data_list_of_lists
252
-
253
- def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
254
- pass
@@ -1,47 +0,0 @@
1
- import requests
2
- from investing_algorithm_framework.domain import MarketDataSource, \
3
- BacktestMarketDataSource
4
-
5
-
6
- class UsTreasuryYieldDataSource(MarketDataSource):
7
- """
8
- UsTreasuryYield is a subclass of MarketDataSource.
9
- It is used to get the US Treasury Yield data.
10
- """
11
-
12
- def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
13
- pass
14
-
15
- URL = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/" \
16
- "v2/accounting/od/avg_interest_rates?" \
17
- "filter=record_date:gte:2024-01-01"
18
-
19
- def get_data(
20
- self,
21
- time_stamp=None,
22
- from_time_stamp=None,
23
- to_time_stamp=None,
24
- **kwargs
25
- ):
26
- response = requests.get(self.URL)
27
-
28
- if response.status_code == 200:
29
- # Extract risk-free rate from API response
30
- # (e.g., 10-year Treasury yield)
31
- treasury_yield_data = response.json()
32
- entries = treasury_yield_data["data"]
33
- for entry in entries:
34
- print(entry)
35
- print(entries[-1])
36
- print(entries[-1]["avg_interest_rate_amt"])
37
- # print(treasury_yield_data)
38
- # ten_year_yield = treasury_yield_data["data"][0]["value"]
39
- # risk_free_rate = ten_year_yield / 100 # Convert
40
- # percentage to decimal
41
- # print("10-Year Treasury Yield (Risk-Free Rate):", risk_free_rate)
42
- else:
43
- print("Failed to retrieve Treasury yield data. Status code:",
44
- response.status_code)
45
-
46
- def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
47
- pass
@@ -1,5 +0,0 @@
1
- from .ccxt_market_service import CCXTMarketService
2
-
3
- __all__ = [
4
- "CCXTMarketService",
5
- ]