ifieryarrows commited on
Commit
192e963
·
verified ·
1 Parent(s): 3eb79b7

Sync from GitHub (tests passed)

Browse files
Files changed (1) hide show
  1. backtest/runner.py +10 -3
backtest/runner.py CHANGED
@@ -260,7 +260,7 @@ class BacktestRunner:
260
  train_data = features.loc[train_mask].copy()
261
 
262
  if len(train_data) < 100:
263
- logger.warning(f"Insufficient training data: {len(train_data)} rows")
264
  return []
265
 
266
  # Prepare X, y
@@ -310,10 +310,14 @@ class BacktestRunner:
310
  all_symbols = list(set(symbols + [target]))
311
  prices = self.fetch_prices(all_symbols, self.config.oos_start, self.config.oos_end)
312
 
 
 
313
  # Prepare features
314
  features = self.prepare_features(prices, target)
315
 
316
- # Get trading days and retrain dates
 
 
317
  trading_days = get_trading_days(self.config.oos_start, self.config.oos_end)
318
  retrain_dates = get_retrain_dates(trading_days)
319
 
@@ -326,11 +330,14 @@ class BacktestRunner:
326
  for i, retrain_date in enumerate(retrain_dates[:-1]):
327
  next_retrain = retrain_dates[i + 1] if i + 1 < len(retrain_dates) else pd.Timestamp(self.config.oos_end)
328
 
 
 
 
329
  # Predict for days between retrains
330
  predict_dates = [d for d in trading_days if retrain_date <= d < next_retrain]
331
 
332
  if predict_dates:
333
- preds = self.train_and_predict(features, retrain_date, predict_dates)
334
  all_predictions.extend(preds)
335
 
336
  if not all_predictions:
 
260
  train_data = features.loc[train_mask].copy()
261
 
262
  if len(train_data) < 100:
263
+ logger.warning(f"Insufficient training data: {len(train_data)} rows (train_start={train_start.date()}, train_end={train_end.date()}, features range: {features.index.min().date()} to {features.index.max().date()})")
264
  return []
265
 
266
  # Prepare X, y
 
310
  all_symbols = list(set(symbols + [target]))
311
  prices = self.fetch_prices(all_symbols, self.config.oos_start, self.config.oos_end)
312
 
313
+ logger.info(f"Fetched prices: {len(prices)} rows, date range: {prices['date'].min()} to {prices['date'].max()}")
314
+
315
  # Prepare features
316
  features = self.prepare_features(prices, target)
317
 
318
+ logger.info(f"Features prepared: {len(features)} rows, date range: {features.index.min()} to {features.index.max()}")
319
+
320
+ # Get trading days and retrain dates for OOS period
321
  trading_days = get_trading_days(self.config.oos_start, self.config.oos_end)
322
  retrain_dates = get_retrain_dates(trading_days)
323
 
 
330
  for i, retrain_date in enumerate(retrain_dates[:-1]):
331
  next_retrain = retrain_dates[i + 1] if i + 1 < len(retrain_dates) else pd.Timestamp(self.config.oos_end)
332
 
333
+ # Train end is the day BEFORE retrain (no lookahead)
334
+ train_end = retrain_date - pd.Timedelta(days=1)
335
+
336
  # Predict for days between retrains
337
  predict_dates = [d for d in trading_days if retrain_date <= d < next_retrain]
338
 
339
  if predict_dates:
340
+ preds = self.train_and_predict(features, train_end, predict_dates)
341
  all_predictions.extend(preds)
342
 
343
  if not all_predictions: