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

@@ -14,7 +14,7 @@ from .domain import ApiException, combine_backtests, PositionSize, \
14
14
  Position, TimeFrame, INDEX_DATETIME, MarketCredential, \
15
15
  PortfolioConfiguration, RESOURCE_DIRECTORY, AWS_LAMBDA_LOGGING_CONFIG, \
16
16
  Trade, SYMBOLS, RESERVED_BALANCES, APP_MODE, AppMode, DATETIME_FORMAT, \
17
- BacktestDateRange, convert_polars_to_pandas, \
17
+ BacktestDateRange, convert_polars_to_pandas, BacktestRun, \
18
18
  DEFAULT_LOGGING_CONFIG, DataType, DataProvider, \
19
19
  TradeStatus, TradeRiskType, generate_backtest_summary_metrics, \
20
20
  APPLICATION_DIRECTORY, DataSource, OrderExecutor, PortfolioProvider, \
@@ -189,4 +189,5 @@ __all__ = [
189
189
  "get_negative_trades",
190
190
  "get_positive_trades",
191
191
  "get_number_of_trades",
192
+ "BacktestRun"
192
193
  ]
@@ -1,33 +1,79 @@
1
1
  from enum import Enum
2
2
 
3
3
 
4
- default_weights = {
5
- # Profitability
6
- "total_net_gain": 3.0,
7
- "gross_loss": 0.0,
8
- "growth": 0.0,
9
- "trades_average_return": 0.0,
10
-
11
- # Risk-adjusted returns
12
- "sharpe_ratio": 1.0,
13
- "sortino_ratio": 1.0,
14
- "profit_factor": 1.0,
15
-
16
- # Risk
17
- "max_drawdown": -2.0,
18
- "max_drawdown_duration": -0.5,
19
-
20
- # Trading activity
21
- "number_of_trades": 2.0,
22
- "win_rate": 3.0,
23
-
24
- # Exposure
25
- "cumulative_exposure": 0.5,
26
- "exposure_ratio": 0.0,
27
- }
28
-
29
-
30
4
  class BacktestEvaluationFocus(Enum):
5
+ """
6
+ Enumeration for backtest evaluation focus areas.
7
+
8
+ The available metrics are:
9
+ - backtest_start_date
10
+ - backtest_end_date
11
+ - equity_curve
12
+ - final_value
13
+ - total_growth
14
+ - total_growth_percentage
15
+ - total_net_gain
16
+ - total_net_gain_percentage
17
+ - total_loss
18
+ - total_loss_percentage
19
+ - cumulative_return
20
+ - cumulative_return_series
21
+ - cagr
22
+ - sharpe_ratio
23
+ - rolling_sharpe_ratio
24
+ - sortino_ratio
25
+ - calmar_ratio
26
+ - profit_factor
27
+ - annual_volatility
28
+ - monthly_returns
29
+ - yearly_returns
30
+ - drawdown_series
31
+ - max_drawdown
32
+ - max_drawdown_absolute
33
+ - max_daily_drawdown
34
+ - max_drawdown_duration
35
+ - trades_per_year
36
+ - trade_per_day
37
+ - exposure_ratio
38
+ - cumulative_exposure
39
+ - best_trade
40
+ - worst_trade
41
+ - number_of_positive_trades
42
+ - percentage_positive_trades
43
+ - number_of_negative_trades
44
+ - percentage_negative_trades
45
+ - average_trade_duration
46
+ - average_trade_size
47
+ - average_trade_loss
48
+ - average_trade_loss_percentage
49
+ - average_trade_gain
50
+ - average_trade_gain_percentage
51
+ - average_trade_return
52
+ - average_trade_return_percentage
53
+ - median_trade_return
54
+ - number_of_trades
55
+ - number_of_trades_closed
56
+ - number_of_trades_opened
57
+ - number_of_trades_open_at_end
58
+ - win_rate
59
+ - current_win_rate
60
+ - win_loss_ratio
61
+ - current_win_loss_ratio
62
+ - percentage_winning_months
63
+ - percentage_winning_years
64
+ - average_monthly_return
65
+ - average_monthly_return_losing_months
66
+ - average_monthly_return_winning_months
67
+ - best_month
68
+ - best_year
69
+ - worst_month
70
+ - worst_year
71
+ - total_number_of_days
72
+ - current_average_trade_gain
73
+ - current_average_trade_return
74
+ - current_average_trade_duration
75
+ - current_average_trade_loss
76
+ """
31
77
  BALANCED = "balanced"
32
78
  PROFIT = "profit"
33
79
  FREQUENCY = "frequency"
@@ -73,44 +119,124 @@ class BacktestEvaluationFocus(Enum):
73
119
  return BacktestEvaluationFocus.from_string(other) == self
74
120
 
75
121
  def get_weights(self):
76
- # default / balanced
77
- base = {
78
- "total_net_gain": 3.0,
79
- "win_rate": 3.0,
80
- "number_of_trades": 2.0,
81
- "sharpe_ratio": 1.0,
82
- "sortino_ratio": 1.0,
83
- "profit_factor": 1.0,
84
- "max_drawdown": -2.0,
85
- "max_drawdown_duration": -0.5,
86
- "total_net_loss": 0.0,
87
- "total_return": 0.0,
88
- "avg_return_per_trade": 0.0,
89
- "exposure_factor": 0.5,
90
- "exposure_ratio": 0.0,
91
- "exposure_time": 0.0,
92
- }
93
-
94
- if self != BacktestEvaluationFocus.BALANCED:
95
-
96
- # apply presets
97
- if self == BacktestEvaluationFocus.PROFIT:
98
- base.update({
99
- "total_net_gain": 3.0,
100
- "win_rate": 2.0,
101
- "number_of_trades": 1.0,
102
- })
103
- elif self == BacktestEvaluationFocus.FREQUENCY:
104
- base.update({
105
- "number_of_trades": 3.0,
106
- "win_rate": 2.0,
107
- "total_net_gain": 2.0,
108
- })
109
- elif self == BacktestEvaluationFocus.RISK_ADJUSTED:
110
- base.update({
111
- "sharpe_ratio": 3.0,
112
- "sortino_ratio": 3.0,
113
- "max_drawdown": -3.0,
114
- })
115
-
116
- return base
122
+ """
123
+ Get evaluation weights for different focus areas.
124
+ Returns a dictionary with metric weights where:
125
+ - Positive weights favor higher values
126
+ - Negative weights favor lower values (penalties)
127
+ - Zero weights ignore the metric
128
+ """
129
+
130
+ if self == BacktestEvaluationFocus.BALANCED:
131
+ return {
132
+ # Core profitability metrics (moderate weight)
133
+ "total_net_gain_percentage": 2.0,
134
+ "cagr": 1.5,
135
+ "average_trade_return_percentage": 1.0,
136
+
137
+ # Risk-adjusted returns (important for balance)
138
+ "sharpe_ratio": 2.0,
139
+ "sortino_ratio": 1.5,
140
+ "calmar_ratio": 1.0,
141
+ "profit_factor": 1.5,
142
+
143
+ # Risk management (penalties for bad metrics)
144
+ "max_drawdown": -1.5,
145
+ "max_drawdown_duration": -0.5,
146
+ "annual_volatility": -0.8,
147
+
148
+ # Trading consistency
149
+ "win_rate": 1.5,
150
+ "win_loss_ratio": 1.0,
151
+ "number_of_trades": 0.8, # Some activity needed
152
+
153
+ # Efficiency metrics
154
+ "exposure_ratio": 0.5,
155
+ "trades_per_year": 0.3,
156
+ }
157
+
158
+ elif self == BacktestEvaluationFocus.PROFIT:
159
+ return {
160
+ # Maximize absolute and relative profits
161
+ "total_net_gain_percentage": 3.0,
162
+ "cagr": 2.5,
163
+ "total_net_gain": 2.0,
164
+ "average_trade_return_percentage": 1.5,
165
+ "best_trade": 1.0,
166
+
167
+ # Profit consistency
168
+ "win_rate": 2.0,
169
+ "profit_factor": 2.0,
170
+ "percentage_positive_trades": 1.0,
171
+
172
+ # Risk secondary (but still important)
173
+ "sharpe_ratio": 1.0,
174
+ "max_drawdown": -1.0,
175
+
176
+ # Activity level (need some trades)
177
+ "number_of_trades": 0.5,
178
+
179
+ # Monthly/yearly consistency
180
+ "percentage_winning_months": 0.8,
181
+ "average_monthly_return": 1.0,
182
+ }
183
+
184
+ elif self == BacktestEvaluationFocus.FREQUENCY:
185
+ return {
186
+ # High trading activity with good results
187
+ "number_of_trades": 3.0,
188
+ "trades_per_year": 2.5,
189
+ "exposure_ratio": 2.0,
190
+
191
+ # Profitability per trade (scaled for frequency)
192
+ "average_trade_return_percentage": 2.0,
193
+ "win_rate": 2.5,
194
+ "total_net_gain_percentage": 1.5,
195
+
196
+ # Consistency across many trades
197
+ "win_loss_ratio": 1.5,
198
+ "percentage_positive_trades": 1.0,
199
+
200
+ # Risk management for frequent trading
201
+ "max_drawdown": -1.5,
202
+ "sharpe_ratio": 1.0,
203
+ "profit_factor": 1.2,
204
+
205
+ # Duration efficiency
206
+ "average_trade_duration": -0.3, # Prefer shorter trades
207
+ }
208
+
209
+ elif self == BacktestEvaluationFocus.RISK_ADJUSTED:
210
+ return {
211
+ # Risk-adjusted performance metrics (highest priority)
212
+ "sharpe_ratio": 3.0,
213
+ "sortino_ratio": 2.5,
214
+ "calmar_ratio": 2.0,
215
+
216
+ # Risk management (strong penalties)
217
+ "max_drawdown": -3.0,
218
+ "max_drawdown_duration": -1.5,
219
+ "annual_volatility": -2.0,
220
+ "worst_trade": -1.0,
221
+
222
+ # Consistent performance
223
+ "win_rate": 2.0,
224
+ "win_loss_ratio": 1.5,
225
+ "percentage_winning_months": 1.5,
226
+
227
+ # Stable returns
228
+ "average_trade_return_percentage": 1.5,
229
+ "total_net_gain_percentage": 1.0,
230
+ "profit_factor": 1.8,
231
+
232
+ # Reasonable activity
233
+ "number_of_trades": 0.5,
234
+
235
+ # Downside protection
236
+ "average_trade_loss_percentage": -1.0,
237
+ "percentage_negative_trades": -1.0,
238
+ }
239
+
240
+ # Fallback to balanced if unknown focus
241
+ return self.get_weights() \
242
+ if self != BacktestEvaluationFocus.BALANCED else {}
@@ -150,23 +150,24 @@ class PortfolioSnapshot(BaseModel):
150
150
  if datetime_format is not None:
151
151
  created_at = self.created_at.strftime(datetime_format) \
152
152
  if self.created_at else None
153
-
154
153
  else:
155
154
  created_at = self.created_at.strftime(DEFAULT_DATETIME_FORMAT)
156
155
 
157
156
  return {
158
- "metadata": self.metadata,
159
- "portfolio_id": self.portfolio_id,
160
- "trading_symbol": self.trading_symbol,
161
- "pending_value": self.pending_value,
162
- "unallocated": self.unallocated,
163
- "total_net_gain": self.total_net_gain,
164
- "total_revenue": self.total_revenue,
165
- "total_cost": self.total_cost,
166
- "cash_flow": self.cash_flow,
167
- "net_size": self.net_size,
168
- "created_at": created_at,
169
- "total_value": self.total_value,
157
+ "metadata": self.metadata if self.metadata else {},
158
+ "portfolio_id": self.portfolio_id if self.portfolio_id else "",
159
+ "trading_symbol": self.trading_symbol
160
+ if self.trading_symbol else "",
161
+ "pending_value": self.pending_value if self.pending_value else 0.0,
162
+ "unallocated": self.unallocated if self.unallocated else 0.0,
163
+ "total_net_gain": self.total_net_gain
164
+ if self.total_net_gain else 0.0,
165
+ "total_revenue": self.total_revenue if self.total_revenue else 0.0,
166
+ "total_cost": self.total_cost if self.total_cost else 0.0,
167
+ "cash_flow": self.cash_flow if self.cash_flow else 0.0,
168
+ "net_size": self.net_size if self.net_size else 0.0,
169
+ "created_at": created_at if created_at else "",
170
+ "total_value": self.total_value if self.total_value else 0.0,
170
171
  }
171
172
 
172
173
  @staticmethod
@@ -283,14 +283,14 @@ class Trade(BaseModel):
283
283
  "trading_symbol": self.trading_symbol,
284
284
  "status": self.status,
285
285
  "amount": self.amount,
286
- "remaining": self.remaining,
286
+ "remaining": self.remaining if self.remaining is not None else 0,
287
287
  "open_price": self.open_price,
288
288
  "last_reported_price": self.last_reported_price,
289
289
  "opened_at": opened_at,
290
290
  "closed_at": closed_at,
291
291
  "updated_at": updated_at,
292
- "net_gain": self.net_gain,
293
- "cost": self.cost,
292
+ "net_gain": self.net_gain if self.net_gain is not None else 0,
293
+ "cost": self.cost if self.cost is not None else 0,
294
294
  "stop_losses": [
295
295
  stop_loss.to_dict(datetime_format=datetime_format)
296
296
  for stop_loss in self.stop_losses
@@ -165,13 +165,19 @@ class BacktestService:
165
165
  portfolio_configurations = []
166
166
  portfolio_configurations.append(
167
167
  PortfolioConfiguration(
168
+ identifier="vector_backtest",
168
169
  market=market,
169
170
  trading_symbol=trading_symbol,
170
171
  initial_balance=initial_amount
171
172
  )
172
173
  )
173
174
 
175
+ portfolio_configuration = portfolio_configurations[0]
176
+
174
177
  trading_symbol = portfolio_configurations[0].trading_symbol
178
+ portfolio = Portfolio.from_portfolio_configuration(
179
+ portfolio_configuration
180
+ )
175
181
 
176
182
  # Load vectorized backtest data
177
183
  data = self._data_provider_service.get_vectorized_backtest_data(
@@ -188,7 +194,9 @@ class BacktestService:
188
194
  index = pd.Index([])
189
195
 
190
196
  most_granular_ohlcv_data_source = \
191
- self._get_most_granular_ohlcv_data_source(strategy.data_sources)
197
+ BacktestService.get_most_granular_ohlcv_data_source(
198
+ strategy.data_sources
199
+ )
192
200
  most_granular_ohlcv_data = self._data_provider_service.get_ohlcv_data(
193
201
  symbol=most_granular_ohlcv_data_source.symbol,
194
202
  start_date=backtest_date_range.start_date,
@@ -212,6 +220,8 @@ class BacktestService:
212
220
  granular_ohlcv_data_order_by_symbol = {}
213
221
  snapshots = [
214
222
  PortfolioSnapshot(
223
+ trading_symbol=trading_symbol,
224
+ portfolio_id=portfolio.identifier,
215
225
  created_at=backtest_date_range.start_date,
216
226
  unallocated=initial_amount,
217
227
  total_value=initial_amount,
@@ -268,6 +278,11 @@ class BacktestService:
268
278
  # Trade generation
269
279
  last_trade = None
270
280
 
281
+ # Align signals with most granular OHLCV data
282
+ close = df["Close"].reindex(index, method='ffill')
283
+ buy_signal = buy_signals[symbol].reindex(index, fill_value=False)
284
+ sell_signal = sell_signals[symbol].reindex(index, fill_value=False)
285
+
271
286
  # Loop over all timestamps in the backtest
272
287
  for i in range(len(index)):
273
288
 
@@ -341,7 +356,7 @@ class BacktestService:
341
356
  {
342
357
  "orders": trade_orders,
343
358
  "closed_at": current_date,
344
- "trade_status": TradeStatus.CLOSED,
359
+ "status": TradeStatus.CLOSED,
345
360
  "updated_at": current_date,
346
361
  "net_gain": net_gain_val
347
362
  }
@@ -387,6 +402,7 @@ class BacktestService:
387
402
  # total_net_gain = total_value - initial_amount
388
403
  snapshots.append(
389
404
  PortfolioSnapshot(
405
+ portfolio_id=portfolio.identifier,
390
406
  created_at=interval_datetime,
391
407
  unallocated=unallocated,
392
408
  total_value=unallocated + allocated,
@@ -575,7 +591,7 @@ class BacktestService:
575
591
  )
576
592
 
577
593
  @staticmethod
578
- def _get_most_granular_ohlcv_data_source(data_sources):
594
+ def get_most_granular_ohlcv_data_source(data_sources):
579
595
  """
580
596
  Get the most granular data source from a list of data sources.
581
597
 
@@ -55,6 +55,7 @@ def get_win_rate(trades: List[Trade]) -> float:
55
55
  trades = [
56
56
  trade for trade in trades if TradeStatus.CLOSED.equals(trade.status)
57
57
  ]
58
+ print(len(trades))
58
59
  positive_trades = sum(1 for trade in trades if trade.net_gain > 0)
59
60
  total_trades = len(trades)
60
61
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 7.16.10
3
+ Version: 7.16.12
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -1,4 +1,4 @@
1
- investing_algorithm_framework/__init__.py,sha256=UwHvSZuc4UnjRY7MD4LqaZQFhMl1uiTJXqI8kkvikug,6826
1
+ investing_algorithm_framework/__init__.py,sha256=rYv3eJDD0QbOPXCvK-Ye8oml63MYM_QLqXrt6vFpHk8,6857
2
2
  investing_algorithm_framework/app/__init__.py,sha256=x683g8hvp5yERywt0CFWLavMcTDnCwVVUW_g3o5kyOc,1539
3
3
  investing_algorithm_framework/app/algorithm/__init__.py,sha256=-a9o9bTfAhW9qSW-bKvlLQuMCf-YXxIztudo2TxMjCI,136
4
4
  investing_algorithm_framework/app/algorithm/algorithm.py,sha256=v8AZZ7hr5ZKJbavk242xCUpGHv3mKZ4sqfGV7BwPgdU,6854
@@ -86,7 +86,7 @@ investing_algorithm_framework/domain/__init__.py,sha256=PASQlRGcU_MDIwnLppanXGo-
86
86
  investing_algorithm_framework/domain/backtesting/__init__.py,sha256=q-NejGHzE233w5jXPhSsuLpBZ_yl3m-qb2g6FnxZaps,699
87
87
  investing_algorithm_framework/domain/backtesting/backtest.py,sha256=mS7JdPTXhw5AQrQ-krXWtpNsBbVVYkxc1lBSoPhCqoQ,15617
88
88
  investing_algorithm_framework/domain/backtesting/backtest_date_range.py,sha256=e_V7HMdtln4uu87jwwa_Yr7ZesgrpFqsEqtr0e0DTto,3186
89
- investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py,sha256=ZGfJm-zjsWudQMOdYKfW_2T7K3SBy-JjaMoJp9zijWE,3010
89
+ investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py,sha256=D__3I_TSxDVnGtlddmWt4wHcqut8MGyYMf1IfQZXYJ0,7547
90
90
  investing_algorithm_framework/domain/backtesting/backtest_metrics.py,sha256=HR0bEDT3xh-TQq50PLDcKhYggjtnE-JTRuY2TlXz54w,19552
91
91
  investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py,sha256=8JXdu3EgFh2f2Yc41OYwIBwlYtjFiumyAJUrN5kL078,6703
92
92
  investing_algorithm_framework/domain/backtesting/backtest_run.py,sha256=ffQgilEkyixGrGvKeCZF670OPoY3ljixlgsXPajHpZY,14310
@@ -115,7 +115,7 @@ investing_algorithm_framework/domain/models/order/order_type.py,sha256=d0TkR5hjZ
115
115
  investing_algorithm_framework/domain/models/portfolio/__init__.py,sha256=gMMZG6Owvbsq7jL9PhhRbqV8tM9oebGUY8Yc6zedHj4,230
116
116
  investing_algorithm_framework/domain/models/portfolio/portfolio.py,sha256=xUUk9mEwuJLhDPpA6nVmY6AZtFjA1bHrye0mTbAmgUs,5503
117
117
  investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py,sha256=EX3RXeAEGqwZj5oXVCsaYSP7TysRTqLL_9iu5ViW8gE,2737
118
- investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py,sha256=MubaXZrLvIBF82vStYe1VOs5E1Bmde3CzmvGmT1Tow0,6538
118
+ investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py,sha256=w8-nyhGC4ZZzvNv31MkuGGcRQhVsKD2uSknGxVpNSP0,6901
119
119
  investing_algorithm_framework/domain/models/position/__init__.py,sha256=Iv4-DUwgwf521P5qCu6R3WSVZxPeEtGoHP8WsS3qNUU,123
120
120
  investing_algorithm_framework/domain/models/position/position.py,sha256=MSE1hHowJEUF9ljjSeUnvMLU0eLy1gdL6P7cwExzwZM,1575
121
121
  investing_algorithm_framework/domain/models/position/position_snapshot.py,sha256=BpMhUTn--oUVXQHi62uOb4Ac7yuBwHW3iUCFpBPOtW0,1131
@@ -127,7 +127,7 @@ investing_algorithm_framework/domain/models/time_unit.py,sha256=dCi1lcVK-QGlOt6y
127
127
  investing_algorithm_framework/domain/models/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  investing_algorithm_framework/domain/models/tracing/trace.py,sha256=iAVEN102-y_7Wj9Qg7kdti8-2I63Y8UG0SF3V2pkHj8,699
129
129
  investing_algorithm_framework/domain/models/trade/__init__.py,sha256=2hX5zmAodsEuFeFghsQhinNobXVuc4oYcMeczY2sbsc,308
130
- investing_algorithm_framework/domain/models/trade/trade.py,sha256=lsiBYs_cJKrSCoprag6hhhL9uGmgi--hBycIPXMLGHM,12855
130
+ investing_algorithm_framework/domain/models/trade/trade.py,sha256=CAOhDEdX6Ot3PlpFWm8kJP47G4t1ceY9hNWhZK-s1D0,12960
131
131
  investing_algorithm_framework/domain/models/trade/trade_risk_type.py,sha256=f-1bOc2GkdphPL3ewPzgsZ5OLX2_fc2e1DVARDl1RRc,839
132
132
  investing_algorithm_framework/domain/models/trade/trade_status.py,sha256=9b5QDwg8vsu_iRtGWatJ1rJFubjIWslKHTG3cK0zVQ4,1004
133
133
  investing_algorithm_framework/domain/models/trade/trade_stop_loss.py,sha256=B9mBALaqOu2VI9v_PTv6C2ZrP6afTEi7seBD8kZi7bw,10366
@@ -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=wT2FqRCnv9HUREvTV6b9sHAZRlJ3go3FtAqfwHTwxB8,23427
205
+ investing_algorithm_framework/services/backtesting/backtest_service.py,sha256=cH_LOvDxkPI9rp8ic1eqGqtWYo7EW60nZEfBYwJ50jI,24112
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
@@ -230,7 +230,7 @@ investing_algorithm_framework/services/metrics/treynor_ratio.py,sha256=47DEQpj8H
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
232
232
  investing_algorithm_framework/services/metrics/volatility.py,sha256=LzeNEkjXrUzzYSWlO8MffJKgFAXY3aaxIH9w4QQKYsc,3275
233
- investing_algorithm_framework/services/metrics/win_rate.py,sha256=9SXI6E7JS7XQY3qVwARhr-Wti2ZKfd1n3yNXxGL1hIY,5794
233
+ investing_algorithm_framework/services/metrics/win_rate.py,sha256=38QK0fFPKs_93PBpdXy48W03Z6eidh_FqTiW9WmAH8g,5817
234
234
  investing_algorithm_framework/services/order_service/__init__.py,sha256=B-9kb7AWnMHCYkT3C7lvUADPWC8uP8cg6ymj3Ngabf0,242
235
235
  investing_algorithm_framework/services/order_service/order_backtest_service.py,sha256=20rVRGSX1IRVRrjCgnM3H7gg4MGZdQconJ9tEE_pZzg,6534
236
236
  investing_algorithm_framework/services/order_service/order_executor_lookup.py,sha256=QNZr-EiKofPGgYHHBESfxdMXGuLOAT8BlufHx92LkoM,3601
@@ -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.10.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
256
- investing_algorithm_framework-7.16.10.dist-info/METADATA,sha256=Wz5Zrf7mgMTWQWmll1ll1RrU1rTiBvhzRnXfIQuIpaI,19636
257
- investing_algorithm_framework-7.16.10.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
258
- investing_algorithm_framework-7.16.10.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
259
- investing_algorithm_framework-7.16.10.dist-info/RECORD,,
255
+ investing_algorithm_framework-7.16.12.dist-info/LICENSE,sha256=wbVEDvoZiMPHufRY3sLEffvAr7GH5hOIngHF8y4HFQg,11343
256
+ investing_algorithm_framework-7.16.12.dist-info/METADATA,sha256=eV3a_dZKKHOgbjHf3JY8Mz-qEP14NvvqBY3Fio5eO6c,19636
257
+ investing_algorithm_framework-7.16.12.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
258
+ investing_algorithm_framework-7.16.12.dist-info/entry_points.txt,sha256=jrPF0YksDs27vYzEvj3tXLe3OGWU24EJA05z5xHqmq8,91
259
+ investing_algorithm_framework-7.16.12.dist-info/RECORD,,