microsoft/qlib · error · ValueError

Empty data from dataset, please check your dataset config.

Error message

Empty data from dataset, please check your dataset config.

What it means

LOCALTransformerModel.fit() prepares the 'train' and 'valid' segments (col_set=['feature','label'], data_key=DK_L) and immediately checks emptiness. If either prepared handler is empty it raises ValueError('Empty data from dataset, please check your dataset config.') before building DataLoaders — training cannot proceed on zero rows.

Source

Thrown at qlib/contrib/model/pytorch_localformer_ts.py:149

                pred = self.model(feature.float())  # .float()
                loss = self.loss_fn(pred, label)
                losses.append(loss.item())

                score = self.metric_fn(pred, label)
                scores.append(score.item())

        return np.mean(losses), np.mean(scores)

    def fit(
        self,
        dataset: DatasetH,
        evals_result=dict(),
        save_path=None,
    ):
        dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        if dl_train.empty or dl_valid.empty:
            raise ValueError("Empty data from dataset, please check your dataset config.")

        dl_train.config(fillna_type="ffill+bfill")  # process nan brought by dataloader
        dl_valid.config(fillna_type="ffill+bfill")  # process nan brought by dataloader

        train_loader = DataLoader(
            dl_train, batch_size=self.batch_size, shuffle=True, num_workers=self.n_jobs, drop_last=True
        )
        valid_loader = DataLoader(
            dl_valid, batch_size=self.batch_size, shuffle=False, num_workers=self.n_jobs, drop_last=True
        )

        save_path = get_or_create_path(save_path)

        stop_steps = 0
        train_loss = 0
        best_score = -np.inf
        best_epoch = 0
        evals_result["train"] = []

View on GitHub (pinned to 79633dd950)

Solutions

  1. Inspect dataset.prepare('train', col_set=['feature','label'], data_key='learn') and the 'valid' equivalent directly — confirm which one is empty and check its index length.
  2. Fix the segment date ranges in your DatasetH/handler config so they overlap the actual data calendar.
  3. Verify the underlying data handler actually loaded data: check the raw dataframe (data_handler.fetch) is non-empty and your instrument list survives filtering.
  4. If a processor dropped all rows (e.g. dropna-style processing), loosen it or extend the segment window.

Example fix

# before
handler = Alpha158(instruments=instruments, start_time='2025-01-01', end_time='2025-01-31')
dataset = DatasetH(handler, segments={'train': ('2024-01-01','2024-12-31'), ...})  # no data in range
model.fit(dataset)  # ValueError: Empty data from dataset

# after
dataset = DatasetH(handler, segments={'train': ('2025-01-01','2025-01-15'), 'valid': ('2025-01-16','2025-01-31')})
model.fit(dataset)
Defensive patterns

Strategy: validation

Validate before calling

for seg in ("train", "valid"):
    df = dataset.prepare(seg, col_set=["feature", "label"], data_key="learn")
    if df.empty:
        raise ValueError(f"segment '{seg}' prepared empty; fix segment/handler config before fit")

Try / catch

try:
    model.fit(dataset)
except ValueError as e:
    if "Empty data" in str(e):
        # inspect dataset.prepare('train'/'valid') emptiness and fix segments/handler
        raise
    raise

Prevention

When it happens

Trigger: model.fit(dataset) where dataset.prepare('train') or dataset.prepare('valid') returns an empty handler: segments whose date ranges select no data, a data handler with no instruments/dates loaded, or a learned/processed handler whose filters removed everything.

Common situations: Segments (train/valid) whose start/end dates fall outside the calibrated data range; handler created with instruments that were all dropped; DK_L (learned) data key empty because a prior processor consumed all rows; timezone/date-format mistakes in segment definitions.

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/50c569f2097c7fc3. Report an issue: GitHub.