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/__init__.py +182 -6
- sigma/__main__.py +2 -2
- sigma/analytics/__init__.py +636 -0
- sigma/app.py +801 -892
- sigma/backtest.py +372 -0
- sigma/charts.py +407 -0
- sigma/cli.py +465 -0
- sigma/comparison.py +611 -0
- sigma/config.py +366 -0
- sigma/core/__init__.py +4 -17
- sigma/core/engine.py +493 -0
- sigma/core/intent.py +595 -0
- sigma/core/models.py +516 -125
- sigma/data/__init__.py +681 -0
- sigma/data/models.py +130 -0
- sigma/llm.py +639 -0
- sigma/monitoring.py +666 -0
- sigma/portfolio.py +697 -0
- sigma/reporting.py +658 -0
- sigma/robustness.py +675 -0
- sigma/setup.py +374 -403
- sigma/strategy.py +753 -0
- sigma/tools/backtest.py +23 -5
- sigma/tools.py +617 -0
- sigma/visualization.py +766 -0
- sigma_terminal-3.3.0.dist-info/METADATA +583 -0
- sigma_terminal-3.3.0.dist-info/RECORD +30 -0
- sigma_terminal-3.3.0.dist-info/entry_points.txt +6 -0
- sigma_terminal-3.3.0.dist-info/licenses/LICENSE +25 -0
- sigma/core/agent.py +0 -205
- sigma/core/config.py +0 -119
- sigma/core/llm.py +0 -794
- sigma/tools/__init__.py +0 -5
- sigma/tools/charts.py +0 -400
- sigma/tools/financial.py +0 -1457
- sigma/ui/__init__.py +0 -1
- sigma_terminal-2.0.2.dist-info/METADATA +0 -222
- sigma_terminal-2.0.2.dist-info/RECORD +0 -19
- sigma_terminal-2.0.2.dist-info/entry_points.txt +0 -2
- sigma_terminal-2.0.2.dist-info/licenses/LICENSE +0 -42
- {sigma_terminal-2.0.2.dist-info → sigma_terminal-3.3.0.dist-info}/WHEEL +0 -0
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
|