Skip to content

Commit db55f9b

Browse files
committed
Change metric names
1 parent 248cebb commit db55f9b

File tree

13 files changed

+843
-651
lines changed

13 files changed

+843
-651
lines changed

investing_algorithm_framework/__init__.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@
3535
get_calmar_ratio, get_trade_frequency, get_yearly_returns, \
3636
get_monthly_returns, get_best_year, get_best_month, get_worst_year, \
3737
get_worst_month, get_best_trade, get_worst_trade, \
38-
get_average_yearly_return, get_average_gain, get_average_loss, \
39-
get_average_monthly_return, get_percentage_winning_months, \
40-
get_max_drawdown_duration, get_max_daily_drawdown, get_trades_per_day, \
38+
get_average_yearly_return, get_average_trade_gain, \
39+
get_average_trade_loss, get_average_monthly_return, \
40+
get_percentage_winning_months, get_max_drawdown_duration, \
41+
get_max_daily_drawdown, get_trades_per_day, \
4142
get_trades_per_year, get_average_monthly_return_losing_months, \
4243
get_average_monthly_return_winning_months, get_percentage_winning_years, \
43-
get_rolling_sharpe_ratio, create_backtest_metrics, get_growth, \
44-
get_growth_percentage, get_cumulative_exposure, get_median_return, \
45-
get_average_return, get_risk_free_rate_us, get_cumulative_return, \
44+
get_rolling_sharpe_ratio, create_backtest_metrics, get_total_growth, \
45+
get_total_loss, get_cumulative_exposure, get_median_trade_return, \
46+
get_average_trade_return, get_risk_free_rate_us, get_cumulative_return, \
4647
get_cumulative_return_series
4748

4849

@@ -135,8 +136,8 @@
135136
"get_best_trade",
136137
"get_worst_trade",
137138
"get_average_yearly_return",
138-
"get_average_gain",
139-
"get_average_loss",
139+
"get_average_trade_gain",
140+
"get_average_trade_loss",
140141
"get_average_monthly_return",
141142
"get_percentage_winning_months",
142143
"get_average_trade_duration",
@@ -163,14 +164,14 @@
163164
"rank_results",
164165
"create_weights",
165166
"get_entry_and_exit_signals",
166-
"get_growth",
167-
"get_growth_percentage",
168167
"BacktestEvaluationFocus",
169168
"combine_backtests",
170169
"PositionSize",
171-
"get_median_return",
172-
"get_average_return",
170+
"get_median_trade_return",
171+
"get_average_trade_return",
173172
"get_risk_free_rate_us",
174173
"get_cumulative_return",
175174
"get_cumulative_return_series",
175+
"get_total_loss",
176+
"get_total_growth"
176177
]

investing_algorithm_framework/app/analysis/ranking.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@ def safe_mean(values):
195195
backtest_start_date=start_date,
196196
backtest_end_date=end_date,
197197
equity_curve=[], # leave empty to avoid misleading curves
198-
growth=safe_mean([m.growth for m in backtest_metrics]),
199-
growth_percentage=safe_mean(
200-
[m.growth_percentage for m in backtest_metrics]),
198+
total_growth=safe_mean([m.total_growth for m in backtest_metrics]),
199+
total_growth_percentage=safe_mean(
200+
[m.total_growth_percentage for m in backtest_metrics]),
201201
total_net_gain=safe_mean([m.total_net_gain for m in backtest_metrics]),
202202
total_net_gain_percentage=safe_mean(
203203
[m.total_net_gain_percentage for m in backtest_metrics]),
@@ -228,10 +228,27 @@ def safe_mean(values):
228228
exposure_ratio=safe_mean(
229229
[m.exposure_ratio for m in backtest_metrics]
230230
),
231-
trades_average_gain=safe_mean(
232-
[m.trades_average_gain for m in backtest_metrics]),
233-
trades_average_loss=safe_mean(
234-
[m.trades_average_loss for m in backtest_metrics]),
231+
average_trade_gain=safe_mean(
232+
[m.average_trade_gain for m in backtest_metrics]),
233+
average_trade_gain_percentage=(
234+
safe_mean(
235+
[m.average_trade_gain_percentage for m in backtest_metrics]
236+
)
237+
),
238+
average_trade_loss=safe_mean(
239+
[m.average_trade_loss for m in backtest_metrics]),
240+
average_trade_loss_percentage=(
241+
safe_mean(
242+
[m.average_trade_loss_percentage for m in backtest_metrics]
243+
)
244+
),
245+
median_trade_return=safe_mean(
246+
[m.median_trade_return for m in backtest_metrics]),
247+
median_trade_return_percentage=(
248+
safe_mean(
249+
[m.median_trade_return_percentage for m in backtest_metrics]
250+
)
251+
),
235252
best_trade=max((
236253
m.best_trade for m in backtest_metrics if m.best_trade),
237254
key=lambda t: t.net_gain if t else float('-inf'),

investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ def create_html_trade_metrics_table(results, report):
8888
copy_results['Worst Trade'] = f"{worst_trade['net_gain']:.2f} {report.trading_symbol}"
8989
copy_results['Worst Trade Date'] = safe_format_date(worst_trade['opened_at'], format_str=DEFAULT_DATETIME_FORMAT)
9090

91-
copy_results['Trades Average Gain'] = f"{safe_format(copy_results['trades_average_gain'], string_format)} {report.trading_symbol} {copy_results['trades_average_gain_percentage']:.2f}%"
92-
copy_results['Trades Average Loss'] = f"{safe_format(copy_results['trades_average_loss'], string_format)} {report.trading_symbol} {copy_results['trades_average_loss_percentage']:.2f}%"
91+
copy_results['Trades Average Gain'] = f"{safe_format(copy_results['average_trade_gain'], string_format)} {report.trading_symbol} {copy_results['trades_average_gain_percentage']:.2f}%"
92+
copy_results['Trades Average Loss'] = f"{safe_format(copy_results['average_trade_loss'], string_format)} {report.trading_symbol} {copy_results['trades_average_loss_percentage']:.2f}%"
9393
copy_results['Average Trade Duration'] = f"{copy_results['average_trade_duration']:.2f} hours"
9494
copy_results['Number of Trades'] = f"{copy_results['number_of_trades']}"
9595
copy_results['Win Rate'] = f"{copy_results['win_rate']:.2f}%"

investing_algorithm_framework/domain/backtesting/backtest_metrics.py

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ class BacktestMetrics:
2323
Attributes:
2424
backtest_start_date (datetime): The start date of the backtest.
2525
backtest_end_date (datetime): The end date of the backtest.
26+
final_value (float): The final value of the portfolio at the end
27+
of the backtest.
2628
equity_curve (List[Tuple[datetime, float]]): A list of
2729
tuples representing the equity curve, where each tuple
2830
contains a date and the corresponding portfolio value.
29-
growth (float): The growth of the portfolio over the backtest period.
30-
growth_percentage (float): The percentage growth of the portfolio
31+
total_growth (float): The growth of the portfolio over the
32+
backtest period.
33+
total_growth_percentage (float): The percentage growth of the portfolio
3134
over the backtest period.
32-
final_value (float): The final value of the portfolio at the end
33-
of the backtest.
3435
total_net_gain (float): The total return of the backtest.
3536
total_net_gain_percentage (float): The total return percentage
3637
total_loss (float): The total loss of the backtest.
38+
total_loss_percentage (float): The total loss percentage
3739
cagr (float): The compound annual growth rate of the backtest.
3840
sharpe_ratio (float): The Sharpe ratio of the backtest, indicating
3941
risk-adjusted return.
@@ -68,15 +70,24 @@ class BacktestMetrics:
6870
average exposure of the portfolio.
6971
cumulative_exposure (float): The cumulative exposure, indicating the
7072
total exposure of the portfolio over the backtest period.
71-
trades_average_gain (float): The average gain from winning trades.
72-
trades_average_gain_percentage (float): The average gain percentage
73-
from winning trades.
74-
trades_average_loss (float): The average loss from losing trades.
75-
trades_average_loss_percentage (float): The average loss percentage
73+
average_trade_size (float): The average size of trades executed
74+
during the backtest.
75+
average_trade_loss (float): The average loss from losing trades.
76+
average_trade_loss_percentage (float): The average loss percentage
7677
from losing trades.
77-
trades_average_return (float): The average return from all trades.
78-
trades_average_return_percentage (float): The average return
79-
percentage from all trades.
78+
average_trade_gain (float): The average gain from winning trades.
79+
average_trade_gain_percentage (float): The average gain percentage
80+
from winning trades.
81+
average_trade_return (float): The average return from all trades.
82+
average_trade_return_percentage (float): The average return percentage
83+
from all trades.
84+
median_trade_return (float): The median return from all trades.
85+
median_trade_return_percentage (float): The median return percentage
86+
from all trades.
87+
number_of_positive_trades (int): The total number of profitable trades
88+
executed during the backtest.
89+
number_of_negative_trades (int): The total number of unprofitable
90+
trades executed during the backtest.
8091
best_trade (float): A string representation of the best trade,
8192
including net gain and percentage.
8293
worst_trade (float): A string representation of the worst trade,
@@ -123,10 +134,12 @@ class BacktestMetrics:
123134
backtest_start_date: datetime
124135
backtest_end_date: datetime
125136
equity_curve: List[Tuple[float, datetime]] = field(default_factory=list)
126-
growth: float = 0.0
127-
growth_percentage: float = 0.0
137+
total_growth: float = 0.0
138+
total_growth_percentage: float = 0.0
128139
total_net_gain: float = 0.0
129140
total_net_gain_percentage: float = 0.0
141+
total_loss: float = 0.0
142+
total_loss_percentage: float = 0.0
130143
final_value: float = 0.0
131144
cumulative_return: float = 0.0
132145
cumulative_return_series: List[Tuple[float, datetime]] = \
@@ -152,24 +165,28 @@ class BacktestMetrics:
152165
trade_per_day: float = 0.0
153166
exposure_ratio: float = 0.0
154167
cumulative_exposure: float = 0.0
155-
trades_average_gain: float = 0.0
156-
trades_average_gain_percentage: float = 0.0
157-
trades_average_loss: float = 0.0
158-
trades_average_loss_percentage: float = 0.0
159-
trades_average_return: float = 0.0
160-
trades_average_return_percentage: float = 0.0
161168
best_trade: Trade = None
162169
worst_trade: Trade = None
170+
number_of_positive_trades: int = 0
171+
percentage_positive_trades: float = 0.0
172+
number_of_negative_trades: int = 0
173+
percentage_negative_trades: float = 0.0
163174
average_trade_duration: float = 0.0
164175
average_trade_size: float = 0.0
176+
average_trade_loss: float = 0.0
177+
average_trade_loss_percentage: float = 0.0
178+
average_trade_gain: float = 0.0
179+
average_trade_gain_percentage: float = 0.0
180+
average_trade_return: float = 0.0
181+
average_trade_return_percentage: float = 0.0
182+
median_trade_return: float = 0.0
183+
median_trade_return_percentage: float = 0.0
165184
number_of_trades: int = 0
166185
number_of_trades_closed: int = 0
167186
number_of_trades_opened: int = 0
168187
number_of_trades_open_at_end: int = 0
169188
win_rate: float = 0.0
170189
win_loss_ratio: float = 0.0
171-
percentage_positive_trades: float = 0.0
172-
percentage_negative_trades: float = 0.0
173190
percentage_winning_months: float = 0.0
174191
percentage_winning_years: float = 0.0
175192
average_monthly_return: float = 0.0
@@ -198,11 +215,13 @@ def to_dict(self) -> dict:
198215
"backtest_end_date": self.backtest_end_date.isoformat(),
199216
"equity_curve": [(value, date.isoformat())
200217
for value, date in self.equity_curve],
218+
"final_value": self.final_value,
201219
"total_net_gain": self.total_net_gain,
202220
"total_net_gain_percentage": self.total_net_gain_percentage,
203-
"final_value": self.final_value,
204-
"growth": self.growth,
205-
"growth_percentage": self.growth_percentage,
221+
"total_growth": self.total_growth,
222+
"total_growth_percentage": self.total_growth_percentage,
223+
"total_loss": self.total_loss,
224+
"total_loss_percentage": self.total_loss_percentage,
206225
"cumulative_return": self.cumulative_return,
207226
"cumulative_return_series": [(value, date.isoformat())
208227
for value, date in
@@ -216,8 +235,6 @@ def to_dict(self) -> dict:
216235
"sortino_ratio": self.sortino_ratio,
217236
"calmar_ratio": self.calmar_ratio,
218237
"profit_factor": self.profit_factor,
219-
"gross_profit": self.gross_profit,
220-
"gross_loss": self.gross_loss,
221238
"annual_volatility": self.annual_volatility,
222239
"monthly_returns": [(value, date.isoformat())
223240
for value, date in self.monthly_returns],
@@ -233,15 +250,22 @@ def to_dict(self) -> dict:
233250
"trade_per_day": self.trade_per_day,
234251
"exposure_ratio": self.exposure_ratio,
235252
"cumulative_exposure": self.cumulative_exposure,
236-
"trades_average_gain": self.trades_average_gain,
237-
"trades_average_gain_percentage":
238-
self.trades_average_gain_percentage,
239-
"trades_average_loss": self.trades_average_loss,
240-
"trades_average_loss_percentage":
241-
self.trades_average_loss_percentage,
242-
"trades_average_return": self.trades_average_return,
243-
"trades_average_return_percentage":
244-
self.trades_average_return_percentage,
253+
"average_trade_gain": self.average_trade_gain,
254+
"average_trade_gain_percentage":
255+
self.average_trade_gain_percentage,
256+
"average_trade_loss": self.average_trade_loss,
257+
"average_trade_loss_percentage":
258+
self.average_trade_loss_percentage,
259+
"average_trade_return": self.average_trade_return,
260+
"average_trade_return_percentage":
261+
self.average_trade_return_percentage,
262+
"median_trade_return": self.median_trade_return,
263+
"median_trade_return_percentage":
264+
self.median_trade_return_percentage,
265+
"number_of_positive_trades": self.number_of_positive_trades,
266+
"percentage_positive_trades": self.percentage_positive_trades,
267+
"number_of_negative_trades": self.number_of_negative_trades,
268+
"percentage_negative_trades": self.percentage_negative_trades,
245269
"best_trade": self.best_trade.to_dict()
246270
if self.best_trade else None,
247271
"worst_trade": self.worst_trade.to_dict()
@@ -253,8 +277,6 @@ def to_dict(self) -> dict:
253277
"win_loss_ratio": self.win_loss_ratio,
254278
"percentage_winning_months": self.percentage_winning_months,
255279
"percentage_winning_years": self.percentage_winning_years,
256-
"percentage_positive_trades": self.percentage_positive_trades,
257-
"percentage_negative_trades": self.percentage_negative_trades,
258280
"average_monthly_return": self.average_monthly_return,
259281
"average_monthly_return_losing_months":
260282
self.average_monthly_return_losing_months,

investing_algorithm_framework/domain/backtesting/backtest_run.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ class BacktestRun:
6666
backtest_start_date: datetime
6767
backtest_end_date: datetime
6868
trading_symbol: str
69-
initial_unallocated: float
70-
number_of_runs: int
71-
portfolio_snapshots: List[PortfolioSnapshot]
72-
trades: List[Trade]
73-
orders: List[Order]
74-
positions: List[Position]
75-
created_at: datetime
69+
initial_unallocated: float = 0.0
70+
number_of_runs: int = 0
71+
portfolio_snapshots: List[PortfolioSnapshot] = field(default_factory=list)
72+
trades: List[Trade] = field(default_factory=list)
73+
orders: List[Order] = field(default_factory=list)
74+
positions: List[Position] = field(default_factory=list)
75+
created_at: datetime = None,
7676
symbols: List[str] = field(default_factory=list)
7777
number_of_days: int = 0
7878
number_of_trades: int = 0

0 commit comments

Comments
 (0)