Skip to content

Commit b12fa5d

Browse files
committed
Fix absolute net gain calculation
1 parent 0426d53 commit b12fa5d

File tree

1 file changed

+27
-13
lines changed
  • investing_algorithm_framework/services/metrics

1 file changed

+27
-13
lines changed

investing_algorithm_framework/services/metrics/trades.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -298,28 +298,34 @@ def get_average_trade_gain(trades: List[Trade]) -> Tuple[float, float]:
298298
trades (List[Trade]): List of trades.
299299
300300
Returns:
301-
Tuple[float, float]: The average gain
302-
percentage of the average loss
301+
Tuple[float, float]: The average gain and average gain percentage
303302
"""
304303
if trades is None or len(trades) == 0:
305304
raise OperationalException(
306305
"Trades list is empty or None, cannot calculate average gain."
307306
)
308307

309308
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)
311309

312310
if not gains:
313311
return 0.0, 0.0
314312

315313
average_gain = sum(gains) / len(gains)
316-
percentage = (average_gain / cost) if cost > 0 else 0.0
317-
return average_gain, percentage
318314

315+
# Updated percentage calculation to match other functions
316+
percentage_returns = [
317+
(t.net_gain_absolute / t.cost) for t in trades
318+
if t.net_gain_absolute > 0 and t.cost > 0
319+
]
320+
average_gain_percentage = (
321+
sum(percentage_returns) / len(percentage_returns)
322+
if percentage_returns else 0.0
323+
)
319324

320-
def get_current_average_trade_gain(
321-
trades: List[Trade]
322-
) -> Tuple[float, float]:
325+
return average_gain, average_gain_percentage
326+
327+
328+
def get_current_average_trade_gain(trades: List[Trade]) -> Tuple[float, float]:
323329
"""
324330
Calculate the average gain from a list of trades,
325331
including both closed and open trades.
@@ -329,23 +335,31 @@ def get_current_average_trade_gain(
329335
Args:
330336
trades (List[Trade]): List of trades.
331337
Returns:
332-
Tuple[float, float]: The average gain
333-
percentage of the average loss
338+
Tuple[float, float]: The average gain and average gain percentage
334339
"""
335340
if trades is None or len(trades) == 0:
336341
raise OperationalException(
337342
"Trades list is empty or None, cannot calculate average gain."
338343
)
339344

340345
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)
342346

343347
if not gains:
344348
return 0.0, 0.0
345349

346350
average_gain = sum(gains) / len(gains)
347-
percentage = (average_gain / cost) if cost > 0 else 0.0
348-
return average_gain, percentage
351+
352+
# Updated percentage calculation to match other functions
353+
percentage_returns = [
354+
(t.net_gain_absolute / t.cost) for t in trades
355+
if t.net_gain_absolute > 0 and t.cost > 0
356+
]
357+
average_gain_percentage = (
358+
sum(percentage_returns) / len(percentage_returns)
359+
if percentage_returns else 0.0
360+
)
361+
362+
return average_gain, average_gain_percentage
349363

350364

351365
def get_average_trade_loss(trades: List[Trade]) -> Tuple[float, float]:

0 commit comments

Comments
 (0)