Spaces:
Running
Running
Sync from GitHub (tests passed)
Browse files- 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 |
-
|
|
|
|
|
|
|
| 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,
|
| 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:
|