Skip to content

Commit f8384f3

Browse files
committed
Add filtering to metrics calculation
1 parent 4be0899 commit f8384f3

File tree

8 files changed

+399
-130
lines changed

8 files changed

+399
-130
lines changed

investing_algorithm_framework/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
get_average_monthly_return_winning_months, get_percentage_winning_years, \
4343
get_rolling_sharpe_ratio, create_backtest_metrics, get_growth, \
4444
get_growth_percentage, get_cumulative_exposure, get_median_return, \
45-
get_average_return, get_risk_free_rate_us
45+
get_average_return, get_risk_free_rate_us, get_cumulative_return, \
46+
get_cumulative_return_series
4647

4748

4849
__all__ = [
@@ -169,5 +170,7 @@
169170
"PositionSize",
170171
"get_median_return",
171172
"get_average_return",
172-
"get_risk_free_rate_us"
173+
"get_risk_free_rate_us",
174+
"get_cumulative_return",
175+
"get_cumulative_return_series",
173176
]

investing_algorithm_framework/app/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,7 +1323,9 @@ def run_permutation_test(
13231323
original_datasets_ordered_by_symbol = {}
13241324

13251325
for data_source in data_sources:
1326+
print(data_source)
13261327
if DataType.OHLCV.equals(data_source.data_type):
1328+
print(data_source.symbol)
13271329
data_provider = data_provider_service.get(data_source)
13281330
data = data_provider_service.get_data(
13291331
data_source=data_source,

investing_algorithm_framework/domain/backtesting/backtest_metrics.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pathlib import Path
33
from dataclasses import dataclass, field
44
from logging import getLogger
5-
from typing import Tuple, List
5+
from typing import Tuple, List, Dict
66
from datetime import datetime, date
77
import json
88
import pandas as pd
@@ -85,6 +85,12 @@ class BacktestMetrics:
8585
trades in hours.
8686
number_of_trades (int): The total number of trades executed
8787
during the backtest.
88+
number_of_trades_closed (int): The total number of trades close
89+
during the backtest.
90+
number_of_trades_opened (int): The total number of trades opened
91+
during the backtest.
92+
number_of_trades_open_at_end (int): The number of trades
93+
still open at the end of the backtest.
8894
win_rate (float): The win rate of the trades, expressed
8995
as a percentage.
9096
win_loss_ratio (float): The ratio of winning trades
@@ -111,6 +117,8 @@ class BacktestMetrics:
111117
including return and date.
112118
worst_year (datetime): A string representation of the worst year,
113119
including return and date.
120+
metadata (Dict[str, str]): A dictionary to store any additional
121+
metadata related to the backtest.
114122
"""
115123
backtest_start_date: datetime
116124
backtest_end_date: datetime
@@ -120,6 +128,9 @@ class BacktestMetrics:
120128
total_net_gain: float = 0.0
121129
total_net_gain_percentage: float = 0.0
122130
final_value: float = 0.0
131+
cumulative_return: float = 0.0
132+
cumulative_return_series: List[Tuple[float, datetime]] = \
133+
field(default_factory=list)
123134
cagr: float = 0.0
124135
sharpe_ratio: float = 0.0
125136
rolling_sharpe_ratio: List[Tuple[float, datetime]] = \
@@ -152,6 +163,9 @@ class BacktestMetrics:
152163
average_trade_duration: float = 0.0
153164
average_trade_size: float = 0.0
154165
number_of_trades: int = 0
166+
number_of_trades_closed: int = 0
167+
number_of_trades_opened: int = 0
168+
number_of_trades_open_at_end: int = 0
155169
win_rate: float = 0.0
156170
win_loss_ratio: float = 0.0
157171
percentage_positive_trades: float = 0.0
@@ -166,6 +180,7 @@ class BacktestMetrics:
166180
worst_month: Tuple[float, datetime] = None
167181
worst_year: Tuple[float, date] = None
168182
total_number_of_days: int = None
183+
metadata: Dict[str, str] = field(default_factory=dict)
169184

170185
def __post_init__(self):
171186
self.total_number_of_days = (self.backtest_end_date -
@@ -186,6 +201,12 @@ def to_dict(self) -> dict:
186201
"total_net_gain": self.total_net_gain,
187202
"total_net_gain_percentage": self.total_net_gain_percentage,
188203
"final_value": self.final_value,
204+
"growth": self.growth,
205+
"growth_percentage": self.growth_percentage,
206+
"cumulative_return": self.cumulative_return,
207+
"cumulative_return_series": [(value, date.isoformat())
208+
for value, date in
209+
self.cumulative_return_series],
189210
"cagr": self.cagr,
190211
"sharpe_ratio": self.sharpe_ratio,
191212
"rolling_sharpe_ratio": [

investing_algorithm_framework/domain/backtesting/backtest_run.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ def open(directory_path: Union[str, Path]) -> 'BacktestRun':
151151

152152
if os.path.isfile(run_file):
153153
data = json.load(open(run_file, 'r'))
154+
else:
155+
raise OperationalException(
156+
f"The run file {run_file} does not exist."
157+
)
154158

155159
# Parse datetime fields
156160
data["backtest_start_date"] = datetime.strptime(

investing_algorithm_framework/services/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
get_average_monthly_return_winning_months, get_percentage_winning_years, \
3333
get_rolling_sharpe_ratio, create_backtest_metrics, get_growth, \
3434
get_growth_percentage, get_risk_free_rate_us, get_median_return, \
35-
get_average_return
35+
get_average_return, get_cumulative_return, get_cumulative_return_series
3636

3737
__all__ = [
3838
"OrderService",
@@ -109,5 +109,7 @@
109109
"create_backtest_metrics",
110110
"get_growth",
111111
"get_median_return",
112-
"get_average_return"
112+
"get_average_return",
113+
"get_cumulative_return",
114+
"get_cumulative_return_series",
113115
]

investing_algorithm_framework/services/metrics/__init__.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020
get_average_gain, get_average_loss, get_average_monthly_return, \
2121
get_percentage_winning_months, get_average_monthly_return_losing_months, \
2222
get_average_monthly_return_winning_months, get_growth, \
23-
get_percentage_winning_years, get_worst_year, \
24-
get_growth_percentage, get_median_return, get_average_return
23+
get_percentage_winning_years, get_worst_year, get_cumulative_return, \
24+
get_growth_percentage, get_median_return, get_average_return, \
25+
get_cumulative_return_series
2526
from .exposure import get_average_trade_duration, \
2627
get_trade_frequency, get_trades_per_day, get_trades_per_year, \
2728
get_cumulative_exposure, get_exposure_ratio
@@ -49,7 +50,6 @@
4950
"get_total_return",
5051
"get_cumulative_exposure",
5152
"get_exposure_ratio",
52-
"get_average_trade_duration",
5353
"get_win_rate",
5454
"get_win_loss_ratio",
5555
"get_calmar_ratio",
@@ -86,5 +86,7 @@
8686
"get_growth_percentage",
8787
"get_risk_free_rate_us",
8888
"get_median_return",
89-
"get_average_return"
89+
"get_average_return",
90+
"get_cumulative_return",
91+
"get_cumulative_return_series",
9092
]

0 commit comments

Comments
 (0)