investing-algorithm-framework 7.19.1__py3-none-any.whl → 7.19.3__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.

@@ -831,7 +831,10 @@ class App:
831
831
  symbol=data_source.symbol,
832
832
  start_date=backtest_date_range.start_date,
833
833
  end_date=backtest_date_range.end_date,
834
- pandas=True
834
+ pandas=True,
835
+ add_pandas_index=False,
836
+ add_datetime_column=True,
837
+ time_frame=data_source.time_frame
835
838
  )
836
839
  df = df.copy()
837
840
  df['Datetime'] = pd.to_datetime(df['Datetime'])
@@ -6,6 +6,7 @@ def convert_polars_to_pandas(
6
6
  data: PolarsDataFrame,
7
7
  remove_duplicates=True,
8
8
  add_index=True,
9
+ add_datetime_column=True,
9
10
  datetime_column_name="Datetime"
10
11
  ):
11
12
  """
@@ -21,6 +22,8 @@ def convert_polars_to_pandas(
21
22
  dates will be removed from the dataframe
22
23
  add_index: Boolean - If set to true, an index will
23
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
24
27
  datetime_column_name: String - the column name that has the
25
28
  datetime object. By default this is set to column name Datetime
26
29
  This is only used if add_index is set to True
@@ -35,6 +38,9 @@ def convert_polars_to_pandas(
35
38
 
36
39
  df = data.to_pandas().copy()
37
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
+
38
44
  # Ensure datetime column is datetime type
39
45
  df[datetime_column_name] = pd.to_datetime(df[datetime_column_name])
40
46
 
@@ -7,7 +7,7 @@ from typing import List, Tuple, Optional, Dict, Any
7
7
 
8
8
  from investing_algorithm_framework.domain import DataProvider, \
9
9
  OperationalException, ImproperlyConfigured, DataSource, DataType, \
10
- BacktestDateRange, tqdm, convert_polars_to_pandas
10
+ BacktestDateRange, tqdm, convert_polars_to_pandas, TimeFrame
11
11
 
12
12
  logger = logging.getLogger("investing_algorithm_framework")
13
13
 
@@ -26,6 +26,7 @@ class DataProviderIndex:
26
26
  self.data_providers_lookup = defaultdict()
27
27
  self.ohlcv_data_providers = defaultdict()
28
28
  self.ohlcv_data_providers_no_market = defaultdict()
29
+ self.ohlcv_data_providers_with_timeframe = defaultdict()
29
30
  self.ticker_data_providers = defaultdict()
30
31
 
31
32
  def add(self, data_provider: DataProvider):
@@ -80,11 +81,15 @@ class DataProviderIndex:
80
81
 
81
82
  symbol = data_source.symbol
82
83
  market = data_source.market
84
+ time_frame = data_source.time_frame
83
85
 
84
86
  if DataType.OHLCV.equals(data_source.data_type):
85
87
  if symbol not in self.ohlcv_data_providers:
86
88
  self.ohlcv_data_providers[(symbol, market)] = best_provider
87
89
  self.ohlcv_data_providers_no_market[symbol] = best_provider
90
+ self.ohlcv_data_providers_with_timeframe[
91
+ (symbol, market, time_frame)
92
+ ] = best_provider
88
93
  else:
89
94
  try:
90
95
  # If the symbol already exists, we can update the provider
@@ -105,6 +110,11 @@ class DataProviderIndex:
105
110
  self.ohlcv_data_providers_no_market[symbol] =\
106
111
  best_provider
107
112
 
113
+ time_frame_key = (symbol, market, time_frame)
114
+ self.ohlcv_data_providers_with_timeframe[
115
+ time_frame_key
116
+ ] = best_provider
117
+
108
118
  except Exception:
109
119
  # If the existing provider does not have a time_frame
110
120
  # attribute, we can safely ignore this
@@ -165,12 +175,16 @@ class DataProviderIndex:
165
175
 
166
176
  symbol = data_source.symbol
167
177
  market = data_source.market
178
+ time_frame = data_source.time_frame
168
179
 
169
180
  if DataType.OHLCV.equals(data_source.data_type):
170
181
 
171
182
  if symbol not in self.ohlcv_data_providers:
172
183
  self.ohlcv_data_providers[(symbol, market)] = best_provider
173
184
  self.ohlcv_data_providers_no_market[symbol] = best_provider
185
+ self.ohlcv_data_providers_with_timeframe[
186
+ (symbol, market, time_frame)
187
+ ] = best_provider
174
188
  else:
175
189
  try:
176
190
  # If the symbol already exists, we can update the provider
@@ -192,6 +206,11 @@ class DataProviderIndex:
192
206
  self.ohlcv_data_providers_no_market[symbol] = \
193
207
  best_provider
194
208
 
209
+ time_frame_key = (symbol, market, data_source.time_frame)
210
+ self.ohlcv_data_providers_with_timeframe[
211
+ time_frame_key
212
+ ] = best_provider
213
+
195
214
  except Exception:
196
215
  # If the existing provider does not have a time_frame
197
216
  # attribute, we can safely ignore this
@@ -264,7 +283,10 @@ class DataProviderIndex:
264
283
  return len(self.data_providers_lookup)
265
284
 
266
285
  def get_ohlcv_data_provider(
267
- self, symbol: str, market: Optional[str] = None
286
+ self,
287
+ symbol: str,
288
+ market: Optional[str] = None,
289
+ time_frame: Optional[str] = None
268
290
  ) -> Optional[DataProvider]:
269
291
  """
270
292
  Get the OHLCV data provider for a given symbol and market.
@@ -272,12 +294,20 @@ class DataProviderIndex:
272
294
  Args:
273
295
  symbol (str): The symbol to get the data provider for.
274
296
  market (Optional[str]): The market to get the data provider for.
297
+ time_frame (Optional[str]): The time frame to get the
298
+ data provider for.
275
299
 
276
300
  Returns:
277
301
  DataProvider: The OHLCV data provider for the symbol and market,
278
302
  or None if no provider is found.
279
303
  """
280
304
 
305
+ if market is not None and time_frame is not None:
306
+ time_frame = TimeFrame.from_value(time_frame)
307
+ return self.ohlcv_data_providers_with_timeframe.get(
308
+ (symbol, market, time_frame), None
309
+ )
310
+
281
311
  if market is None:
282
312
  # If no market is specified
283
313
  return self.ohlcv_data_providers_no_market.get(symbol, None)
@@ -462,7 +492,9 @@ class DataProviderService:
462
492
  start_date: Optional[datetime] = None,
463
493
  end_date: Optional[datetime] = None,
464
494
  window_size: Optional[int] = None,
465
- pandas: bool = False
495
+ pandas: bool = False,
496
+ add_pandas_index: bool = True,
497
+ add_datetime_column: bool = False,
466
498
  ):
467
499
  """
468
500
  Function to get OHLCV data from the data provider.
@@ -476,6 +508,10 @@ class DataProviderService:
476
508
  end_date (datetime): The end date for the OHLCV data.
477
509
  window_size (int): The window size for the OHLCV data.
478
510
  pandas (bool): Whether to return the data as a pandas DataFrame.
511
+ add_pandas_index (bool): Whether to add a pandas index to
512
+ the DataFrame if pandas is True.
513
+ add_datetime_column (bool): Whether to add a datetime column
514
+ to the DataFrame if pandas is True.
479
515
 
480
516
  Returns:
481
517
  DataFrame: The OHLCV data for the given symbol and market.
@@ -483,6 +519,7 @@ class DataProviderService:
483
519
  data_provider = self.data_provider_index.get_ohlcv_data_provider(
484
520
  symbol=symbol,
485
521
  market=market,
522
+ time_frame=time_frame
486
523
  )
487
524
 
488
525
  if data_provider is None:
@@ -511,7 +548,11 @@ class DataProviderService:
511
548
 
512
549
  if pandas:
513
550
  if isinstance(data, pl.DataFrame):
514
- return convert_polars_to_pandas(data)
551
+ return convert_polars_to_pandas(
552
+ data,
553
+ add_index=add_pandas_index,
554
+ add_datetime_column=add_datetime_column
555
+ )
515
556
  else:
516
557
  return data
517
558
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 7.19.1
3
+ Version: 7.19.3
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -8,7 +8,7 @@ investing_algorithm_framework/app/analysis/backtest_data_ranges.py,sha256=pt8vUj
8
8
  investing_algorithm_framework/app/analysis/backtest_utils.py,sha256=W_X1T8f1UOllUUkaO4ZiQlQ7dSEGi9TqVo_ROyv7XNE,2121
9
9
  investing_algorithm_framework/app/analysis/permutation.py,sha256=NHzyMQ9aCqLiLXyw1CpRZfITLzsRwHmMn8Uj8oV5_1E,3941
10
10
  investing_algorithm_framework/app/analysis/ranking.py,sha256=-XEWmU3rxLvkC9GOW6Zci7E3Y7H2xKwU3id8ljf0n9k,10888
11
- investing_algorithm_framework/app/app.py,sha256=bubVZeIQx1JLl2CRDRpf0KLhgVWRIwaD_72HN3TG4qo,85834
11
+ investing_algorithm_framework/app/app.py,sha256=VeVyiQKImJCd4uR5kH62kPCUE-wpVKeM_2nnX46yAf8,85991
12
12
  investing_algorithm_framework/app/app_hook.py,sha256=cDiY4x2n06tljpx-fcbIM1oPnjTnEthibvqxUvfEppo,834
13
13
  investing_algorithm_framework/app/context.py,sha256=kWOBZq7E45xoAPbMfn9HPhDQmEcyCqBYWi-NJK5nMXk,58874
14
14
  investing_algorithm_framework/app/eventloop.py,sha256=w9zufVpiHrgsxuh4_AW2DXxOfI4LVcScNHTLfL9-Tws,21736
@@ -150,7 +150,7 @@ investing_algorithm_framework/domain/utils/csv.py,sha256=QK7EC_jY4u9s97OFOcoxwZs
150
150
  investing_algorithm_framework/domain/utils/custom_tqdm.py,sha256=LwPiuYedzujtV-kp4Uq_Pe8CqjH6zFvvCuSWCharOP8,583
151
151
  investing_algorithm_framework/domain/utils/dates.py,sha256=T3ZwN6UXKZmcqSjrdH5j2Ielq2PB4fm12QXSy-wdrZw,1541
152
152
  investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py,sha256=Al0T72bhvmyYFGEYDVPbIBOpXtIfgmn8_Tq1KKJYyig,624
153
- investing_algorithm_framework/domain/utils/polars.py,sha256=nO8OdTsdnq6Q3TQJ13AKJeE4tzvGHySEyQ_ojST9Kmk,1550
153
+ investing_algorithm_framework/domain/utils/polars.py,sha256=1oqlZbNgOvIUyoJTRuwxdzZhlSqYF7R1SDjdhgb0Reg,1828
154
154
  investing_algorithm_framework/domain/utils/random.py,sha256=25PQSDuTmMd32sN7H3LQejUO73hQW5FCHGOpKYfdXI0,945
155
155
  investing_algorithm_framework/domain/utils/signatures.py,sha256=MO2hCrrnQjbsT6guX4AdeJfcAP55pRXtjJ73uX1cjaI,417
156
156
  investing_algorithm_framework/domain/utils/stoppable_thread.py,sha256=z3-OGZ-wrygfYn4zhB3COHdB43qQYa65TeShyVokSp0,608
@@ -206,7 +206,7 @@ investing_algorithm_framework/services/backtesting/__init__.py,sha256=sD6JMQVuUT
206
206
  investing_algorithm_framework/services/backtesting/backtest_service.py,sha256=rWxOxAXhuywb0jx_j0XVChKBPU3CUV4vYF0T7oTtG2E,24841
207
207
  investing_algorithm_framework/services/configuration_service.py,sha256=BCgiBlrLjMjfU4afmjYaHu9gOWNmgaxhf6RBN2XJkw0,2853
208
208
  investing_algorithm_framework/services/data_providers/__init__.py,sha256=OHVccpIYGc-1B2AkCI_2Nhsb9KMaAUrng4DHhIbFD8Y,96
209
- investing_algorithm_framework/services/data_providers/data_provider_service.py,sha256=KOhxQEdU1VxE5MXl713Lo4lzv3J8kuSxCa025Ywyr20,28455
209
+ investing_algorithm_framework/services/data_providers/data_provider_service.py,sha256=7gUzwGD2E1e4IEAFRBoSnksAyMzVof6rZwDLsNm3tZE,30239
210
210
  investing_algorithm_framework/services/market_credential_service.py,sha256=syitQ61sECzK0i0Wd-Hc8xaTv4tpRYRFbCjyw9pWMeA,1197
211
211
  investing_algorithm_framework/services/metrics/__init__.py,sha256=kQaAw5r-hXCsaEY9fQ5Fch8CfjltdjKrGFn6gNSWWdA,4322
212
212
  investing_algorithm_framework/services/metrics/alpha.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -253,8 +253,8 @@ investing_algorithm_framework/services/trade_order_evaluator/default_trade_order
253
253
  investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py,sha256=pNnmgaKMR9RY6Kxq7xS0nURKoaQDe2ehrP5GfElkkcI,1328
254
254
  investing_algorithm_framework/services/trade_service/__init__.py,sha256=AcwPyJjDRdiREnl_MWMkDSc-V-ZjXtvpHD6eQT9mc1o,68
255
255
  investing_algorithm_framework/services/trade_service/trade_service.py,sha256=OtzIS5EebByGcqDvV2AFeBjXSarvrgubMXDaVKg6Rbw,41193
256
- investing_algorithm_framework-7.19.1.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
257
- investing_algorithm_framework-7.19.1.dist-info/METADATA,sha256=NfXQinQSPYQibLY_6KTabg9vi7NUStbMosX5TAtfbew,19635
258
- investing_algorithm_framework-7.19.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
259
- investing_algorithm_framework-7.19.1.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
260
- investing_algorithm_framework-7.19.1.dist-info/RECORD,,
256
+ investing_algorithm_framework-7.19.3.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
257
+ investing_algorithm_framework-7.19.3.dist-info/METADATA,sha256=fuIfBz-8G1y2uDWrEynERnrI0pM2xek0NxI8-DfexD4,19635
258
+ investing_algorithm_framework-7.19.3.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
259
+ investing_algorithm_framework-7.19.3.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
260
+ investing_algorithm_framework-7.19.3.dist-info/RECORD,,