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

@@ -375,9 +375,9 @@ class BacktestService:
375
375
  ohlcv = granular_ohlcv_data_order_by_symbol[
376
376
  f"{open_trade.target_symbol}/{trading_symbol}"
377
377
  ]
378
-
379
378
  try:
380
379
  price = ohlcv.loc[:ts, "Close"].iloc[-1]
380
+ open_trade.last_reported_price = price
381
381
  except IndexError:
382
382
  continue # skip if no price yet
383
383
 
@@ -27,7 +27,7 @@ def get_positive_trades(
27
27
  ]
28
28
 
29
29
  positive_trades = [
30
- trade for trade in closed_trades if trade.net_gain > 0
30
+ trade for trade in closed_trades if trade.net_gain_absolute > 0
31
31
  ]
32
32
  number_of_positive_trades = len(positive_trades)
33
33
  percentage_positive_trades = (
@@ -60,7 +60,7 @@ def get_negative_trades(
60
60
  ]
61
61
 
62
62
  negative_trades = [
63
- trade for trade in closed_trades if trade.net_gain < 0
63
+ trade for trade in closed_trades if trade.net_gain_absolute < 0
64
64
  ]
65
65
  number_of_negative_trades = len(negative_trades)
66
66
  percentage_negative_trades = (
@@ -241,11 +241,11 @@ def get_average_trade_return(trades: List[Trade]) -> Tuple[float, float]:
241
241
  if not closed_trades:
242
242
  return 0.0, 0.0
243
243
 
244
- total_return = sum(t.net_gain for t in closed_trades)
244
+ total_return = sum(t.net_gain_absolute for t in closed_trades)
245
245
  average_return = total_return / len(closed_trades)
246
246
 
247
247
  percentage_returns = [
248
- (t.net_gain / t.cost) * 100.0 for t in closed_trades if t.cost > 0
248
+ (t.net_gain_absolute / t.cost) for t in closed_trades if t.cost > 0
249
249
  ]
250
250
  average_return_percentage = (
251
251
  sum(percentage_returns) / len(percentage_returns)
@@ -274,11 +274,11 @@ def get_current_average_trade_return(
274
274
  "Trades list is empty, cannot compute average return."
275
275
  )
276
276
 
277
- total_return = sum(t.net_gain for t in trades)
277
+ total_return = sum(t.net_gain_absolute for t in trades)
278
278
  average_return = total_return / len(trades)
279
279
 
280
280
  percentage_returns = [
281
- (t.net_gain / t.cost) * 100.0 for t in trades if t.cost > 0
281
+ (t.net_gain_absolute / t.cost) for t in trades if t.cost > 0
282
282
  ]
283
283
  average_return_percentage = (
284
284
  sum(percentage_returns) / len(percentage_returns)
@@ -306,8 +306,8 @@ def get_average_trade_gain(trades: List[Trade]) -> Tuple[float, float]:
306
306
  "Trades list is empty or None, cannot calculate average gain."
307
307
  )
308
308
 
309
- gains = [t.net_gain for t in trades if t.net_gain > 0]
310
- cost = sum(t.cost for t in trades if t.net_gain > 0)
309
+ gains = [t.net_gain_absolute for t in trades if t.net_gain_absolute > 0]
310
+ cost = sum(t.cost for t in trades if t.net_gain_absolute > 0)
311
311
 
312
312
  if not gains:
313
313
  return 0.0, 0.0
@@ -337,8 +337,8 @@ def get_current_average_trade_gain(
337
337
  "Trades list is empty or None, cannot calculate average gain."
338
338
  )
339
339
 
340
- gains = [t.net_gain for t in trades if t.net_gain > 0]
341
- cost = sum(t.cost for t in trades if t.net_gain > 0)
340
+ gains = [t.net_gain_absolute for t in trades if t.net_gain_absolute > 0]
341
+ cost = sum(t.cost for t in trades if t.net_gain_absolute > 0)
342
342
 
343
343
  if not gains:
344
344
  return 0.0, 0.0
@@ -371,10 +371,10 @@ def get_average_trade_loss(trades: List[Trade]) -> Tuple[float, float]:
371
371
  if not losing_trades or len(losing_trades) == 0:
372
372
  return 0.0, 0.0
373
373
 
374
- losses = [t.net_gain for t in losing_trades]
374
+ losses = [t.net_gain_absolute for t in losing_trades]
375
375
  average_loss = sum(losses) / len(losses)
376
376
  percentage_returns = [
377
- (t.net_gain / t.cost) * 100.0 for t in losing_trades if t.cost > 0
377
+ (t.net_gain_absolute / t.cost) for t in losing_trades if t.cost > 0
378
378
  ]
379
379
  average_return_percentage = (
380
380
  sum(percentage_returns) / len(percentage_returns)
@@ -404,15 +404,15 @@ def get_current_average_trade_loss(
404
404
  "Trades list is empty or None, cannot calculate average loss."
405
405
  )
406
406
 
407
- losing_trades = [t for t in trades if t.net_gain < 0]
407
+ losing_trades = [t for t in trades if t.net_gain_absolute < 0]
408
408
 
409
409
  if not losing_trades or len(losing_trades) == 0:
410
410
  return 0.0, 0.0
411
411
 
412
- losses = [t.net_gain for t in losing_trades]
412
+ losses = [t.net_gain_absolute for t in losing_trades]
413
413
  average_loss = sum(losses) / len(losses)
414
414
  percentage_returns = [
415
- (t.net_gain / t.cost) * 100.0 for t in losing_trades if t.cost > 0
415
+ (t.net_gain_absolute / t.cost) for t in losing_trades if t.cost > 0
416
416
  ]
417
417
  average_return_percentage = (
418
418
  sum(percentage_returns) / len(percentage_returns)
@@ -438,7 +438,7 @@ def get_median_trade_return(trades: List[Trade]) -> Tuple[float, float]:
438
438
  if not trades:
439
439
  return 0.0, 0.0
440
440
 
441
- sorted_returns = sorted(t.net_gain for t in trades)
441
+ sorted_returns = sorted(t.net_gain_absolute for t in trades)
442
442
  n = len(sorted_returns)
443
443
  mid = n // 2
444
444
 
@@ -466,7 +466,7 @@ def get_best_trade(trades: List[Trade]) -> Trade:
466
466
  if not trades:
467
467
  return None
468
468
 
469
- return max(trades, key=lambda t: t.net_gain)
469
+ return max(trades, key=lambda t: t.net_gain_absolute)
470
470
 
471
471
 
472
472
  def get_worst_trade(trades: List[Trade]) -> Trade:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 7.16.2
3
+ Version: 7.16.4
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -202,7 +202,7 @@ investing_algorithm_framework/infrastructure/services/azure/__init__.py,sha256=P
202
202
  investing_algorithm_framework/infrastructure/services/azure/state_handler.py,sha256=EUk4PdVl6RQ19DuWdrC4DzgOhGcL3qiZKWgWh_obT4E,5240
203
203
  investing_algorithm_framework/services/__init__.py,sha256=9p0Y2enp6UMOlU4qJgVoojHBRARLGefNzbPxgSCN0wI,4999
204
204
  investing_algorithm_framework/services/backtesting/__init__.py,sha256=sD6JMQVuUT8NRKV77VC9jyGnHcGox0W2n9eA-4ydeHY,84
205
- investing_algorithm_framework/services/backtesting/backtest_service.py,sha256=xyfTzNlKPLlOsZhPbeTIcUNvdeOUTTGdWKpfdUXFA4A,23369
205
+ investing_algorithm_framework/services/backtesting/backtest_service.py,sha256=wT2FqRCnv9HUREvTV6b9sHAZRlJ3go3FtAqfwHTwxB8,23427
206
206
  investing_algorithm_framework/services/configuration_service.py,sha256=BCgiBlrLjMjfU4afmjYaHu9gOWNmgaxhf6RBN2XJkw0,2853
207
207
  investing_algorithm_framework/services/data_providers/__init__.py,sha256=OHVccpIYGc-1B2AkCI_2Nhsb9KMaAUrng4DHhIbFD8Y,96
208
208
  investing_algorithm_framework/services/data_providers/data_provider_service.py,sha256=Tv5W38rshK7sG7XEhp7L-McdiNWAAlvU_1ScSdt1NCE,28420
@@ -225,7 +225,7 @@ investing_algorithm_framework/services/metrics/risk_free_rate.py,sha256=bATheWxy
225
225
  investing_algorithm_framework/services/metrics/sharpe_ratio.py,sha256=XDEiTUBoK-qpoeqmbhrcy1v-AuNagWhTWx_Myn0g8-A,5497
226
226
  investing_algorithm_framework/services/metrics/sortino_ratio.py,sha256=WA8uTkyk8RMG6uMplCvV8okAlKG_aeTP4ZAX2VyNkpA,2993
227
227
  investing_algorithm_framework/services/metrics/standard_deviation.py,sha256=oObshTljORuE3x1cS0wej8QCqmDzAwHQgOA5u_HdfbU,4533
228
- investing_algorithm_framework/services/metrics/trades.py,sha256=ttCB7Ohb7-yPhfioeuhHjvrrfouXKba6KCsnfjY-uwQ,13493
228
+ investing_algorithm_framework/services/metrics/trades.py,sha256=BR-9jcgVq9vXxfborngS7gYWwbDkcS2HikjYjQwnjRQ,13632
229
229
  investing_algorithm_framework/services/metrics/treynor_ratio.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
230
  investing_algorithm_framework/services/metrics/ulcer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
231
  investing_algorithm_framework/services/metrics/value_at_risk.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -252,8 +252,8 @@ investing_algorithm_framework/services/trade_order_evaluator/default_trade_order
252
252
  investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py,sha256=pNnmgaKMR9RY6Kxq7xS0nURKoaQDe2ehrP5GfElkkcI,1328
253
253
  investing_algorithm_framework/services/trade_service/__init__.py,sha256=AcwPyJjDRdiREnl_MWMkDSc-V-ZjXtvpHD6eQT9mc1o,68
254
254
  investing_algorithm_framework/services/trade_service/trade_service.py,sha256=OtzIS5EebByGcqDvV2AFeBjXSarvrgubMXDaVKg6Rbw,41193
255
- investing_algorithm_framework-7.16.2.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
256
- investing_algorithm_framework-7.16.2.dist-info/METADATA,sha256=b6TVpZAyED9jpV0Kl1O36c3OgDXT1Fiaegyb2cHSMhY,19635
257
- investing_algorithm_framework-7.16.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
258
- investing_algorithm_framework-7.16.2.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
259
- investing_algorithm_framework-7.16.2.dist-info/RECORD,,
255
+ investing_algorithm_framework-7.16.4.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
256
+ investing_algorithm_framework-7.16.4.dist-info/METADATA,sha256=FgBxt4ophibk2Xta-bdnCEuyRqHdx9Qf092ZEBK3iWE,19635
257
+ investing_algorithm_framework-7.16.4.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
258
+ investing_algorithm_framework-7.16.4.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
259
+ investing_algorithm_framework-7.16.4.dist-info/RECORD,,