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.
- investing_algorithm_framework/__init__.py +2 -1
- investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +193 -67
- investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +14 -13
- investing_algorithm_framework/domain/models/trade/trade.py +3 -3
- investing_algorithm_framework/services/backtesting/backtest_service.py +19 -3
- investing_algorithm_framework/services/metrics/win_rate.py +1 -0
- {investing_algorithm_framework-7.16.10.dist-info → investing_algorithm_framework-7.16.12.dist-info}/METADATA +1 -1
- {investing_algorithm_framework-7.16.10.dist-info → investing_algorithm_framework-7.16.12.dist-info}/RECORD +11 -11
- {investing_algorithm_framework-7.16.10.dist-info → investing_algorithm_framework-7.16.12.dist-info}/LICENSE +0 -0
- {investing_algorithm_framework-7.16.10.dist-info → investing_algorithm_framework-7.16.12.dist-info}/WHEEL +0 -0
- {investing_algorithm_framework-7.16.10.dist-info → investing_algorithm_framework-7.16.12.dist-info}/entry_points.txt +0 -0
|
@@ -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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
162
|
-
"
|
|
163
|
-
"
|
|
164
|
-
"
|
|
165
|
-
|
|
166
|
-
"
|
|
167
|
-
"
|
|
168
|
-
"
|
|
169
|
-
"
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
|
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,4 +1,4 @@
|
|
|
1
|
-
investing_algorithm_framework/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
256
|
-
investing_algorithm_framework-7.16.
|
|
257
|
-
investing_algorithm_framework-7.16.
|
|
258
|
-
investing_algorithm_framework-7.16.
|
|
259
|
-
investing_algorithm_framework-7.16.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|