sigma-terminal 2.0.2__py3-none-any.whl → 3.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sigma/data/models.py ADDED
@@ -0,0 +1,130 @@
1
+ """Data models for the data module."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from datetime import datetime, date
5
+ from enum import Enum
6
+ from typing import Any, Dict, List, Optional, Tuple
7
+
8
+
9
+ class AssetClass(Enum):
10
+ """Asset class types."""
11
+ EQUITY = "equity"
12
+ ETF = "etf"
13
+ CRYPTO = "crypto"
14
+ FOREX = "forex"
15
+ INDEX = "index"
16
+ COMMODITY = "commodity"
17
+ BOND = "bond"
18
+ OPTION = "option"
19
+ FUTURE = "future"
20
+ UNKNOWN = "unknown"
21
+
22
+
23
+ class DataSource(Enum):
24
+ """Data source providers."""
25
+ YFINANCE = "yfinance"
26
+ ALPHA_VANTAGE = "alpha_vantage"
27
+ POLYGON = "polygon"
28
+ QUANDL = "quandl"
29
+ FRED = "fred"
30
+ CACHE = "cache"
31
+ COMPUTED = "computed"
32
+
33
+
34
+ @dataclass
35
+ class DataLineage:
36
+ """Track data provenance."""
37
+ source: DataSource
38
+ symbol: str
39
+ timestamp: datetime = field(default_factory=datetime.now)
40
+ version: str = "1.0"
41
+ transformations: List[str] = field(default_factory=list)
42
+ quality_score: float = 1.0
43
+ metadata: Dict[str, Any] = field(default_factory=dict)
44
+
45
+
46
+ @dataclass
47
+ class DataQualityReport:
48
+ """Quality assessment for data."""
49
+ completeness: float = 1.0 # % of non-null values
50
+ accuracy: float = 1.0 # estimated accuracy
51
+ timeliness: float = 1.0 # freshness score
52
+ consistency: float = 1.0 # internal consistency
53
+ issues: List[str] = field(default_factory=list)
54
+ warnings: List[str] = field(default_factory=list)
55
+ total_records: int = 0
56
+ missing_count: int = 0
57
+ missing_pct: float = 0.0
58
+ stale_ticks: int = 0
59
+ outliers_detected: int = 0
60
+ timezone_issues: int = 0
61
+ date_range: Optional[Tuple[Any, Any]] = None
62
+ gaps: List[Any] = field(default_factory=list)
63
+ passed: bool = True
64
+
65
+ @property
66
+ def overall_score(self) -> float:
67
+ """Calculate overall quality score."""
68
+ return (self.completeness + self.accuracy + self.timeliness + self.consistency) / 4
69
+
70
+
71
+ @dataclass
72
+ class CorporateAction:
73
+ """Corporate action event."""
74
+ action_type: str # split, dividend, merger, spinoff
75
+ date: date
76
+ symbol: str
77
+ ratio: Optional[float] = None # for splits
78
+ amount: Optional[float] = None # for dividends
79
+ adjustment_factor: Optional[float] = None # adjustment multiplier
80
+ details: Dict[str, Any] = field(default_factory=dict)
81
+
82
+
83
+ @dataclass
84
+ class PriceBar:
85
+ """Single price bar."""
86
+ timestamp: datetime
87
+ open: float
88
+ high: float
89
+ low: float
90
+ close: float
91
+ volume: int
92
+ adjusted_close: Optional[float] = None
93
+
94
+
95
+ @dataclass
96
+ class Fundamental:
97
+ """Fundamental data point."""
98
+ symbol: str
99
+ period: str # quarterly, annual
100
+ date: date
101
+ metrics: Dict[str, Any] = field(default_factory=dict)
102
+
103
+
104
+ def detect_asset_class(symbol: str) -> AssetClass:
105
+ """Detect asset class from symbol."""
106
+ symbol = symbol.upper()
107
+
108
+ # Crypto patterns
109
+ if symbol.endswith("-USD") or symbol.endswith("USD"):
110
+ return AssetClass.CRYPTO
111
+ if symbol in ["BTC", "ETH", "DOGE", "SOL", "ADA"]:
112
+ return AssetClass.CRYPTO
113
+
114
+ # Forex patterns
115
+ if len(symbol) == 6 and symbol.isalpha():
116
+ major_currencies = ["USD", "EUR", "GBP", "JPY", "CHF", "CAD", "AUD", "NZD"]
117
+ if symbol[:3] in major_currencies and symbol[3:] in major_currencies:
118
+ return AssetClass.FOREX
119
+
120
+ # Index patterns
121
+ if symbol.startswith("^") or symbol in ["SPY", "QQQ", "DIA", "IWM", "VTI"]:
122
+ return AssetClass.INDEX if symbol.startswith("^") else AssetClass.ETF
123
+
124
+ # Common ETFs
125
+ etfs = ["SPY", "QQQ", "IWM", "VTI", "VOO", "VEA", "VWO", "BND", "GLD", "SLV", "USO"]
126
+ if symbol in etfs:
127
+ return AssetClass.ETF
128
+
129
+ # Default to equity
130
+ return AssetClass.EQUITY