2323 end_time_ms = 1736035200000
2424 test_single_hotkey = '5HDmzyhrEco9w6Jv8eE3hDMcXSE4AGg1MuezPR4u2covxKwZ'
2525"""
26- import copy
2726import os
2827import time
2928
4645from vali_objects .utils .position_manager import PositionManager # noqa: E402
4746from vali_objects .utils .price_slippage_model import PriceSlippageModel # noqa: E402
4847from vali_objects .utils .subtensor_weight_setter import SubtensorWeightSetter # noqa: E402
49- from vali_objects .utils .validator_contract_manager import ValidatorContractManager # noqa: E402
5048from vali_objects .utils .vali_utils import ValiUtils # noqa: E402
5149from 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
5552def 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):
10099class 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
283259if __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