सामग्री पर जाएं
लाइब्रेरी के सभी दस्तावेज़

अनुक्रमिक ट्रेडिंग मॉडल प्रशिक्षण और अनुमान के लिए विंडो-आधारित डेटासेट

कोड Machine Learning for Trading

सारांश

यह दस्तावेज़ मॉडल प्रशिक्षण और रोलिंग अनुमान के लिए समय-श्रृंखला पैनल तैयार करने वाली डेटासेट उपयोगिताओं का वर्णन करता है। प्रशिक्षण डेटासेट विन्यस्त अनुक्रम लंबाई, तारीख सीमाओं और स्ट्राइड के अनुसार विशेषताओं, आगे के रिटर्न, अस्थिरता पैमाने और मास्क के स्लाइडिंग अनुक्रम लौटाता है। तारीख सीमाएँ उपलब्ध पैनल तारीखों से जोड़ी जाती हैं और पूर्ण अनुक्रम न दे सकने वाली सीमाओं को कंस्ट्रक्टर अस्वीकार करता है।

अनुमान डेटासेट इसके बजाय चुने गए समय सूचकांकों पर समाप्त होने वाली विंडो बनाता है और हर पूर्वानुमान चरण के लिए विशेषताएँ, मास्क तथा संबंधित सूचकांक लौटाता है। स्थिर मेटाडेटा उपयोगिताएँ परिसंपत्ति पहचानकर्ताओं को पूर्णांक देती हैं और वैकल्पिक रूप से परिसंपत्ति समूहों तथा लेनदेन लागत को टेंसर के रूप में एन्कोड कर सकती हैं। ये इंटरफ़ेस आगे के मॉडलों के लिए समय-संबंधी इनपुट और परिसंपत्ति संदर्भ स्पष्ट करते हैं। अंश कार्यान्वयन व्यवहार और इनपुट आकार बताता है, लेकिन मॉडल, ट्रेडिंग परिणाम, सत्यापन प्रक्रिया या डेटा लीकेज और ओवरलैपिंग विंडो निर्भरता पर चर्चा नहीं करता; ये गुण इस पर निर्भर करते हैं कि उपयोगकर्ता पैनल कैसे बनाते और उपयोग करते हैं।

मुख्य विचार

  • प्रशिक्षण नमूनों में विशेषता, रिटर्न, अस्थिरता-पैमाने और मास्क के अनुक्रम वाली स्लाइडिंग विंडो होती हैं।
  • तारीख सीमाएँ और स्ट्राइड तय करते हैं कि कौन-सी प्रशिक्षण विंडो शामिल होंगी।
  • अनुमान विंडो तय समय सूचकांकों पर समाप्त होती हैं और इनपुट के साथ वे सूचकांक भी लौटाती हैं।
  • स्थिर मेटाडेटा परिसंपत्ति पहचान, समूह और लेनदेन लागत एन्कोड कर सकता है।
  • डेटासेट उपयोगिताएँ डेटा आकार परिभाषित करती हैं, लेकिन ट्रेडिंग मॉडल के प्रदर्शन या वैधता को स्थापित नहीं करतीं।

टैग

पूरा पाठ
# dataset.py


```py
"""Torch datasets for DeePM-style windowed training and inference."""

from __future__ import annotations

from collections.abc import Sequence
from dataclasses import dataclass

import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset

from .features import FeaturePanel


@dataclass(frozen=True, slots=True)
class StaticAssetMetadata:
    """Static per-asset metadata used as context."""

    assets: list[str]
    asset_ids: torch.Tensor  # (N,)
    group_ids: torch.Tensor | None  # (N,)
    costs: torch.Tensor | None  # (N, 1)


def build_static_metadata(
    assets: Sequence[str],
    *,
    asset_to_group: dict[str, str] | None = None,
    asset_to_cost_bps: dict[str, float] | None = None,
) -> StaticAssetMetadata:
    """Create tensors for asset id, group id, and costs."""
    assets_list = [str(a) for a in assets]
    n = len(assets_list)

    asset_ids = torch.arange(n, dtype=torch.long)

    group_ids: torch.Tensor | None = None
    if asset_to_group is not None:
        groups = [str(asset_to_group.get(a, "UNKNOWN")) for a in assets_list]
        unique_groups = {g: i for i, g in enumerate(sorted(set(groups)))}
        group_ids = torch.tensor([unique_groups[g] for g in groups], dtype=torch.long)

    costs: torch.Tensor | None = None
    if asset_to_cost_bps is not None:
        cost_vals = [float(asset_to_cost_bps.get(a, 0.0)) / 10000.0 for a in assets_list]
        costs = torch.tensor(cost_vals, dtype=torch.float32).unsqueeze(-1)

    return StaticAssetMetadata(
        assets=assets_list, asset_ids=asset_ids, group_ids=group_ids, costs=costs
    )


class DeepmWindowDataset(Dataset[tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]]):
    """Sliding-window dataset for training.

    Each item returns (x_seq, y_seq, v_seq, m_seq) of shapes
    (L, N, F), (L, N), (L, N), (L, N).
    """

    def __init__(
        self,
        panel: FeaturePanel,
        *,
        seq_len: int,
        start_date: pd.Timestamp | None = None,
        end_date: pd.Timestamp | None = None,
        stride: int = 1,
    ) -> None:
        if seq_len <= 1:
            raise ValueError("seq_len must be > 1")

        self._panel = panel
        self.seq_len = int(seq_len)

        dates = panel.dates
        start_idx = 0
        end_idx_exclusive = len(dates)
        if start_date is not None:
            start_idx = int(dates.get_indexer([pd.Timestamp(start_date)], method="bfill")[0])
        if end_date is not None:
            end_idx_exclusive = (
                int(dates.get_indexer([pd.Timestamp(end_date)], method="ffill")[0]) + 1
            )

        t_max_start = (end_idx_exclusive - 1) - self.seq_len
        t_min_start = start_idx
        if t_max_start < t_min_start:
            raise ValueError("Date range too small for given seq_len")

        self.start_indices = np.arange(t_min_start, t_max_start + 1, stride, dtype=np.int64)

    def __len__(self) -> int:
        return int(self.start_indices.shape[0])

    def __getitem__(
        self, idx: int
    ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
        s = int(self.start_indices[idx])
        e = s + self.seq_len
        return (
            torch.from_numpy(self._panel.x[s:e]),
            torch.from_numpy(self._panel.y_fwd1[s:e]),
            torch.from_numpy(self._panel.vol_scale[s:e]),
            torch.from_numpy(self._panel.mask[s:e]),
        )


class RollingWindowInferenceDataset(Dataset[tuple[torch.Tensor, torch.Tensor, int]]):
    """Dataset for batched rolling-window inference."""

    def __init__(self, panel: FeaturePanel, *, seq_len: int, start_t: int) -> None:
        if seq_len <= 1:
            raise ValueError("seq_len must be > 1")
        if start_t < seq_len - 1:
            raise ValueError("start_t must be >= seq_len - 1")

        self._panel = panel
        self.seq_len = int(seq_len)
        self.times = np.arange(start_t, len(panel.dates) - 1, dtype=np.int64)

    def __len__(self) -> int:
        return int(self.times.shape[0])

    def __getitem__(self, idx: int) -> tuple[torch.Tensor, torch.Tensor, int]:
        t = int(self.times[idx])
        s = t - self.seq_len + 1
        e = t + 1
        return (
            torch.from_numpy(self._panel.x[s:e]),
            torch.from_numpy(self._panel.mask[s:e]),
            t,
        )

```

स्रोत के लाइसेंस के तहत श्रेय सहित पूरा पाठ दिखाया गया है। लाइसेंस: MIT

यह सारांश मूल स्रोत के आधार पर Stratmill के शोध एजेंट ने लिखा है; यह स्रोत की प्रति नहीं है।