परिसंपत्ति अटेंशन के लिए मैक्रो समूह आसन्नता मास्क बनाना
सारांश
यह उपयोगिता परिसंपत्ति समूह लेबल और समूहों के बीच वैकल्पिक लिंक से बूलियन परिसंपत्ति-से-परिसंपत्ति आसन्नता मैट्रिक्स बनाती है। एक ही मैक्रो समूह में रखी परिसंपत्तियाँ आपस में जुड़ती हैं, और दिया गया हर समूह-पार किनारा दोनों समूहों के सभी सदस्यों को दोनों दिशाओं में जोड़ता है। वैकल्पिक स्व-लिंक से हर परिसंपत्ति स्वयं पर भी ध्यान दे सकती है। बिना मैपिंग वाली परिसंपत्तियों को अज्ञात समूह दिया जाता है, इसलिए वे दूसरी बिना-मैपिंग वाली परिसंपत्तियों से जुड़ती हैं।
दूसरा फ़ंक्शन गैर-आसन्न जोड़ों को प्रतिबंधित चिह्नित करके आसन्नता मैट्रिक्स को अटेंशन मास्क में बदलता है। रूपांतरण से पहले कोड जाँचता है कि इनपुट मैट्रिक्स वर्गाकार है। इससे मैक्रो समूह निर्धारण की पूर्वधारणा को अटेंशन मॉडल में सरलता से दर्ज किया जा सकता है, लेकिन यह बाज़ार डेटा से समूह या संबंध का अनुमान नहीं लगाता। इसकी उपयोगिता दी गई मैपिंग और समूह-पार किनारों की गुणवत्ता तथा अद्यतन स्थिति पर निर्भर है। दस्तावेज़ अनुभवजन्य परिणाम या ट्रेडिंग मूल्यांकन के बजाय कार्यान्वयन विवरण देता है।
मुख्य विचार
- आसन्नता मैट्रिक्स में एक ही समूह की परिसंपत्तियों को परस्पर जोड़ें।
- समूह-पार लिंक एक समूह की हर परिसंपत्ति को दूसरे समूह की हर परिसंपत्ति से सममित रूप से जोड़ते हैं।
- पैरामीटर से स्व-संबंध शामिल या हटाए जा सकते हैं।
- बिना मैपिंग वाली परिसंपत्तियाँ एक अज्ञात समूह साझा करती हैं, इसलिए वे आपस में जुड़ती हैं।
- अटेंशन मास्क हर गैर-आसन्न परिसंपत्ति जोड़े को प्रतिबंधित चिह्नित करता है।
टैग
पूरा पाठ
# graph.py
```py
"""Macroeconomic graph prior utilities.
Builds an asset-level adjacency matrix from macro group labels and
cross-group edges for adjacency-masked attention in DeePM.
"""
from __future__ import annotations
from collections.abc import Iterable, Sequence
from dataclasses import dataclass
import numpy as np
@dataclass(frozen=True, slots=True)
class MacroGraph:
"""Asset-level macro graph."""
assets: list[str]
groups: list[str]
adjacency: np.ndarray # Boolean (N, N)
def build_macro_adjacency(
*,
assets: Sequence[str],
asset_to_group: dict[str, str],
cross_group_edges: Iterable[tuple[str, str]] = (),
include_self_loops: bool = True,
) -> MacroGraph:
"""Build a boolean adjacency matrix from group labels and group edges.
Parameters
----------
assets: Asset identifiers matching the price panel columns.
asset_to_group: Mapping from asset -> macro group label.
cross_group_edges: Undirected (group_a, group_b) edges.
include_self_loops: If True, sets A[i,i] = True.
"""
assets_list = [str(a) for a in assets]
groups = [str(asset_to_group.get(a, "UNKNOWN")) for a in assets_list]
n = len(assets_list)
adj = np.zeros((n, n), dtype=bool)
if include_self_loops:
np.fill_diagonal(adj, True)
group_to_indices: dict[str, list[int]] = {}
for i, g in enumerate(groups):
group_to_indices.setdefault(g, []).append(i)
for indices in group_to_indices.values():
idx = np.array(indices, dtype=int)
adj[np.ix_(idx, idx)] = True
for g1, g2 in cross_group_edges:
idx1 = group_to_indices.get(g1, [])
idx2 = group_to_indices.get(g2, [])
if not idx1 or not idx2:
continue
a = np.array(idx1, dtype=int)
b = np.array(idx2, dtype=int)
adj[np.ix_(a, b)] = True
adj[np.ix_(b, a)] = True
return MacroGraph(assets=assets_list, groups=groups, adjacency=adj)
def adjacency_to_attn_mask(adjacency: np.ndarray) -> np.ndarray:
"""Convert boolean adjacency to attention mask (True = disallowed)."""
if adjacency.ndim != 2 or adjacency.shape[0] != adjacency.shape[1]:
raise ValueError("adjacency must be square (N,N)")
return ~adjacency
```स्रोत के लाइसेंस के तहत श्रेय सहित पूरा पाठ दिखाया गया है। लाइसेंस: MIT
यह सारांश मूल स्रोत के आधार पर Stratmill के शोध एजेंट ने लिखा है; यह स्रोत की प्रति नहीं है।