Skip to content

Commit f516ac4

Browse files
committed
Revert backtest manager
1 parent b6f2806 commit f516ac4

File tree

1 file changed

+31
-86
lines changed

1 file changed

+31
-86
lines changed

neurons/backtest_manager.py

Lines changed: 31 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
end_time_ms = 1736035200000
2424
test_single_hotkey = '5HDmzyhrEco9w6Jv8eE3hDMcXSE4AGg1MuezPR4u2covxKwZ'
2525
"""
26-
import copy
2726
import os
2827
import time
2928

@@ -46,11 +45,9 @@
4645
from vali_objects.utils.position_manager import PositionManager # noqa: E402
4746
from vali_objects.utils.price_slippage_model import PriceSlippageModel # noqa: E402
4847
from vali_objects.utils.subtensor_weight_setter import SubtensorWeightSetter # noqa: E402
49-
from vali_objects.utils.validator_contract_manager import ValidatorContractManager # noqa: E402
5048
from vali_objects.utils.vali_utils import ValiUtils # noqa: E402
5149
from vali_objects.vali_config import ValiConfig # noqa: E402
52-
from vali_objects.vali_dataclasses.perf_ledger import ParallelizationMode, PerfLedgerManager, \
53-
TP_ID_PORTFOLIO # noqa: E402
50+
from vali_objects.vali_dataclasses.perf_ledger import ParallelizationMode, PerfLedgerManager # noqa: E402
5451

5552
def initialize_components(hotkeys, parallel_mode, build_portfolio_ledgers_only):
5653
"""
@@ -89,6 +86,8 @@ def save_positions_to_manager(position_manager, hk_to_positions):
8986
position_manager: The position manager instance
9087
hk_to_positions: Dictionary mapping hotkeys to Position objects
9188
"""
89+
import bittensor as bt
90+
9291
position_count = 0
9392
for hk, positions in hk_to_positions.items():
9493
for p in positions:
@@ -100,7 +99,7 @@ def save_positions_to_manager(position_manager, hk_to_positions):
10099
class BacktestManager:
101100

102101
def __init__(self, positions_at_t_f, start_time_ms, secrets, scoring_func,
103-
capital=ValiConfig.DEFAULT_CAPITAL, use_slippage=None,
102+
capital=ValiConfig.CAPITAL, use_slippage=None,
104103
fetch_slippage_data=False, recalculate_slippage=False, rebuild_all_positions=False,
105104
parallel_mode: ParallelizationMode=ParallelizationMode.PYSPARK, build_portfolio_ledgers_only=False,
106105
pool_size=0, target_ledger_window_ms=ValiConfig.TARGET_LEDGER_WINDOW_MS):
@@ -132,8 +131,6 @@ def __init__(self, positions_at_t_f, start_time_ms, secrets, scoring_func,
132131

133132
self.live_price_fetcher = LivePriceFetcher(secrets=self.secrets, disable_ws=True, is_backtesting=True)
134133

135-
self.contract_manager = ValidatorContractManager(is_backtesting=True)
136-
137134
self.perf_ledger_manager = PerfLedgerManager(self.metagraph,
138135
shutdown_dict=shutdown_dict,
139136
live_price_fetcher=None, # Don't want SSL objects to be pickled
@@ -144,8 +141,7 @@ def __init__(self, positions_at_t_f, start_time_ms, secrets, scoring_func,
144141
secrets=self.secrets,
145142
use_slippage=use_slippage,
146143
build_portfolio_ledgers_only=build_portfolio_ledgers_only,
147-
target_ledger_window_ms=target_ledger_window_ms,
148-
contract_manager=self.contract_manager)
144+
target_ledger_window_ms=target_ledger_window_ms)
149145

150146

151147
self.position_manager = PositionManager(metagraph=self.metagraph,
@@ -158,8 +154,7 @@ def __init__(self, positions_at_t_f, start_time_ms, secrets, scoring_func,
158154
self.challengeperiod_manager = ChallengePeriodManager(self.metagraph,
159155
perf_ledger_manager=self.perf_ledger_manager,
160156
position_manager=self.position_manager,
161-
is_backtesting=True,
162-
contract_manager=self.contract_manager)
157+
is_backtesting=True)
163158

164159
# Attach the position manager to the other objects that need it
165160
for idx, obj in enumerate([self.perf_ledger_manager, self.position_manager, self.elimination_manager]):
@@ -170,14 +165,13 @@ def __init__(self, positions_at_t_f, start_time_ms, secrets, scoring_func,
170165
self.elimination_manager.challengeperiod_manager = self.challengeperiod_manager
171166
self.position_manager.perf_ledger_manager = self.perf_ledger_manager
172167

173-
self.weight_setter = SubtensorWeightSetter(self.metagraph, position_manager=self.position_manager, is_backtesting=True, contract_manager=self.contract_manager)
168+
self.weight_setter = SubtensorWeightSetter(self.metagraph, position_manager=self.position_manager, is_backtesting=True)
174169
self.position_locks = PositionLocks(hotkey_to_positions=positions_at_t_f, is_backtesting=True)
175170
self.plagiarism_detector = PlagiarismDetector(self.metagraph)
176171
self.miner_statistics_manager = MinerStatisticsManager(
177172
position_manager=self.position_manager,
178173
subtensor_weight_setter=self.weight_setter,
179-
plagiarism_detector=self.plagiarism_detector,
180-
contract_manager=self.contract_manager,
174+
plagiarism_detector=self.plagiarism_detector
181175
)
182176
self.psm = PriceSlippageModel(self.live_price_fetcher, is_backtesting=True, fetch_slippage_data=fetch_slippage_data,
183177
recalculate_slippage=recalculate_slippage, capital=capital)
@@ -201,14 +195,12 @@ def update_current_hk_to_positions(self, cutoff_ms):
201195
assert len(existing_positions) <= 1, f"Found multiple positions with the same UUID: {existing_positions}"
202196
existing_position = existing_positions[0] if existing_positions else None
203197
if existing_position:
204-
print(f'OQU: Added order to existing position ({position.position_uuid}) with tp {position.trade_pair.trade_pair_id} at {time_formatted}')
205-
assert all(o.order_uuid != order.order_uuid for o in existing_position.orders), \
206-
f"Order {order.order_uuid} already exists in position {existing_position.position_uuid}"
198+
print(f'OQU: Added order to existing position {position.trade_pair.trade_pair_id} at {time_formatted}')
207199
existing_position.orders.append(order)
208200
existing_position.rebuild_position_with_updated_orders()
209201
self.position_manager.save_miner_position(existing_position)
210202
else: # first order. position must be inserted into list
211-
print(f'OQU: Created new position ({position.position_uuid}) with tp {position.trade_pair.trade_pair_id} at {time_formatted} for hk {position.miner_hotkey}')
203+
print(f'OQU: Created new position {position.trade_pair.trade_pair_id} at {time_formatted} for hk {position.miner_hotkey}')
212204
position.orders = [order]
213205
position.rebuild_position_with_updated_orders()
214206
self.position_manager.save_miner_position(position)
@@ -217,7 +209,7 @@ def init_order_queue_and_current_positions(self, cutoff_ms, positions_at_t_f, re
217209
self.order_queue = [] # (order, position)
218210
for hk, positions in positions_at_t_f.items():
219211
for position in positions:
220-
if position.orders[-1].processed_ms <= cutoff_ms:
212+
if all(o.processed_ms <= cutoff_ms for o in position.orders):
221213
if rebuild_all_positions:
222214
position.rebuild_position_with_updated_orders()
223215
self.position_manager.save_miner_position(position)
@@ -254,30 +246,14 @@ def update(self, current_time_ms:int, run_challenge=True, run_elimination=True):
254246
updated_perf_ledgers = self.perf_ledger_manager.update_perf_ledgers_parallel(self.spark, self.pool,
255247
hotkey_to_positions, existing_perf_ledgers, parallel_mode=self.parallel_mode, now_ms=current_time_ms, is_backtesting=True)
256248

257-
#PerfLedgerManager.print_bundles(updated_perf_ledgers)
249+
PerfLedgerManager.print_bundles(updated_perf_ledgers)
258250
if run_challenge:
259251
self.challengeperiod_manager.refresh(current_time=current_time_ms)
260252
else:
261253
self.challengeperiod_manager.add_all_miners_to_success(current_time_ms=current_time_ms, run_elimination=run_elimination)
262254
if run_elimination:
263255
self.elimination_manager.process_eliminations(self.position_locks)
264-
self.weight_setter.set_weights(current_time=current_time_ms)
265-
266-
def validate_last_update_ms(self, prev_end_time_ms):
267-
perf_ledger_bundles = self.perf_ledger_manager.get_perf_ledgers(portfolio_only=False)
268-
for hk, bundles in perf_ledger_bundles.items():
269-
if prev_end_time_ms:
270-
for tp_id, b in bundles.items():
271-
assert b.last_update_ms == prev_end_time_ms, (f"Ledger for {hk} in {tp_id} was not updated. "
272-
f"last_update_ms={b.last_update_ms}, expected={prev_end_time_ms}, delta={prev_end_time_ms - b.last_update_ms}")
273-
274-
def debug_print_ledgers(self, perf_ledger_bundles):
275-
for hk, v in perf_ledger_bundles.items():
276-
for tp_id, bundle in v.items():
277-
if tp_id != TP_ID_PORTFOLIO:
278-
continue
279-
PerfLedgerManager.print_bundle(hk, v)
280-
256+
self.weight_setter.set_weights(None, None, None, current_time=current_time_ms)
281257

282258

283259
if __name__ == '__main__':
@@ -287,8 +263,7 @@ def debug_print_ledgers(self, perf_ledger_bundles):
287263
use_database_positions = True # NEW: Use positions from database via taoshi.ts.ptn
288264
run_challenge = False # Run challenge period logic
289265
run_elimination = False # Run elimination logic
290-
use_slippage = None # Apply slippage modeling
291-
crypto_only = True # Only include crypto trade pairs
266+
use_slippage = False # Apply slippage modeling
292267
build_portfolio_ledgers_only = True # Whether to build only the portfolio ledgers or per trade pair
293268
parallel_mode = ParallelizationMode.SERIAL # 1 for pyspark, 2 for multiprocessing
294269

@@ -301,9 +276,9 @@ def debug_print_ledgers(self, perf_ledger_bundles):
301276
if use_test_positions and use_database_positions:
302277
raise ValueError("Cannot use both test positions and database positions. Choose one.")
303278

304-
start_time_ms = 1740842786000
305-
end_time_ms = 1757517988000
306-
test_single_hotkey ='5D4gJ9QfbcMg338813wz3MKuRofTKfE6zR3iPaGHaWEnNKoo'
279+
start_time_ms = 1735689600000
280+
end_time_ms = 1736035200000
281+
test_single_hotkey ='5FmqXG5YBU1Hke9jHD5FT41CUM9gVod7nFgYvbd7PmpqcUJm'
307282

308283
# Determine position source
309284
if use_test_positions:
@@ -312,17 +287,17 @@ def debug_print_ledgers(self, perf_ledger_bundles):
312287
position_source = PositionSource.DATABASE
313288
else:
314289
position_source = PositionSource.DISK
315-
290+
316291
# Create position source manager
317292
position_source_manager = PositionSourceManager(position_source)
318-
293+
319294
# Load positions based on source
320295
if position_source == PositionSource.DISK:
321296
# For disk-based positions, use existing logic
322297
# Initialize components with specified hotkey
323298
mmg, elimination_manager, position_manager, perf_ledger_manager = initialize_components(
324299
test_single_hotkey, parallel_mode, build_portfolio_ledgers_only)
325-
300+
326301
# Get positions from disk via perf ledger manager
327302
hk_to_positions, _ = perf_ledger_manager.get_positions_perf_ledger(testing_one_hotkey=test_single_hotkey)
328303
else:
@@ -331,7 +306,7 @@ def debug_print_ledgers(self, perf_ledger_bundles):
331306
end_time_ms=end_time_ms,
332307
hotkeys=[test_single_hotkey] if test_single_hotkey and position_source == PositionSource.DATABASE else None
333308
)
334-
309+
335310
# For test positions, update time range based on loaded data
336311
if position_source == PositionSource.TEST and hk_to_positions:
337312
# Calculate time range from test data
@@ -342,17 +317,13 @@ def debug_print_ledgers(self, perf_ledger_bundles):
342317
if all_order_times:
343318
start_time_ms = min(all_order_times)
344319
end_time_ms = max(all_order_times) + 1
345-
320+
346321
# Initialize components with loaded hotkeys
347322
hotkeys_list = list(hk_to_positions.keys()) if hk_to_positions else [test_single_hotkey]
348323
mmg, elimination_manager, position_manager, perf_ledger_manager = initialize_components(
349324
hotkeys_list, parallel_mode, build_portfolio_ledgers_only)
350-
325+
351326
# Save loaded positions to position manager
352-
for hk, positions in hk_to_positions.items():
353-
if crypto_only:
354-
crypto_positions = [p for p in positions if p.trade_pair.is_crypto]
355-
hk_to_positions[hk] = crypto_positions
356327
save_positions_to_manager(position_manager, hk_to_positions)
357328

358329

@@ -363,42 +334,16 @@ def debug_print_ledgers(self, perf_ledger_bundles):
363334
use_slippage=use_slippage, fetch_slippage_data=False, recalculate_slippage=False,
364335
parallel_mode=parallel_mode,
365336
build_portfolio_ledgers_only=build_portfolio_ledgers_only)
366-
perf_ledger_bundles = {}
367-
interval_ms = 1000 * 60 * 60 * 24
368-
prev_end_time_ms = None
369-
print(f"DEBUG: Starting backtest loop from {start_time_ms} to {end_time_ms}")
370-
for t_ms in range(start_time_ms, end_time_ms, interval_ms):
371-
btm.validate_last_update_ms(prev_end_time_ms)
337+
for t_ms in range(start_time_ms, end_time_ms, 1000 * 60 * 60 * 24):
372338
btm.update(t_ms, run_challenge=run_challenge, run_elimination=run_elimination)
373339
perf_ledger_bundles = btm.perf_ledger_manager.get_perf_ledgers(portfolio_only=False)
374-
#hk_to_perf_ledger_tps = {}
375-
#for k, v in perf_ledger_bundles.items():
376-
# hk_to_perf_ledger_tps[k] = list(v.keys())
377-
#print('hk_to_perf_ledger_tps', hk_to_perf_ledger_tps)
378-
#print('formatted weights', btm.weight_setter.checkpoint_results)
379-
prev_end_time_ms = t_ms
380-
#btm.debug_print_ledgers(perf_ledger_bundles)
381-
btm.perf_ledger_manager.debug_pl_plot(test_single_hotkey)
382-
383-
print("DEBUG: About to generate miner statistics...")
384-
385-
# Generate miner statistics and ZK proofs
386-
print("\n" + "="*80)
387-
print("GENERATING MINER STATISTICS & ZK PROOFS")
388-
print("="*80)
389-
390-
try:
391-
bt.logging.info("Calling generate_miner_statistics_data...")
392-
result = btm.miner_statistics_manager.generate_miner_statistics_data(
393-
bypass_confidence=True
394-
)
395-
bt.logging.success("✅ Miner statistics and ZK proofs generated successfully!")
396-
bt.logging.info(f"Generated statistics for {len(result.get('main', {}))} miners")
397-
except Exception as e:
398-
bt.logging.error(f"❌ Error generating miner statistics: {e}")
399-
import traceback
400-
traceback.print_exc()
340+
hk_to_perf_ledger_tps = {}
341+
for k, v in perf_ledger_bundles.items():
342+
hk_to_perf_ledger_tps[k] = list(v.keys())
343+
print('hk_to_perf_ledger_tps', hk_to_perf_ledger_tps)
344+
print('formatted weights', btm.weight_setter.checkpoint_results)
345+
for k, v in perf_ledger_bundles.items():
346+
PerfLedgerManager.print_bundle(k, v)
401347

402348
tf = time.time()
403349
bt.logging.success(f'Finished backtesting in {tf - t0} seconds')
404-
print("DEBUG: Script completed!")

0 commit comments

Comments
 (0)