Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d643fad
docs: design experimental analytics tab
zifanzhou1024 Apr 29, 2026
73daf89
docs: add experimental analytics implementation plan
zifanzhou1024 Apr 29, 2026
0e14e3b
feat: add experimental analytics contract
zifanzhou1024 Apr 29, 2026
33e3429
fix: close experimental generated panel contracts
zifanzhou1024 Apr 29, 2026
438d082
fix: restore experimental panel label constraints
zifanzhou1024 Apr 29, 2026
f8be210
feat: add experimental quote quality and forward summary
zifanzhou1024 Apr 29, 2026
70d53aa
fix: harden experimental forward quality core
zifanzhou1024 Apr 29, 2026
6c1e6d1
feat: add experimental iv smile methods
zifanzhou1024 Apr 29, 2026
99973f4
fix: harden experimental iv diagnostics
zifanzhou1024 Apr 29, 2026
6efe437
feat: add experimental distribution and trade maps
zifanzhou1024 Apr 29, 2026
3049456
fix: harden experimental distribution trade maps
zifanzhou1024 Apr 29, 2026
8464995
fix: reject nonfinite experimental panel inputs
zifanzhou1024 Apr 29, 2026
38333ff
fix: guard experimental panel container inputs
zifanzhou1024 Apr 29, 2026
1365eef
fix: harden experimental trade map density math
zifanzhou1024 Apr 29, 2026
2217797
Add experimental analytics API routes
zifanzhou1024 Apr 29, 2026
7ac88fb
feat: add experimental analytics web loaders
zifanzhou1024 Apr 29, 2026
6fedbcf
fix: enforce experimental api response safety
zifanzhou1024 Apr 29, 2026
ecb9f39
fix: forward admin token for experimental latest proxy
zifanzhou1024 Apr 29, 2026
ff73646
feat: add experimental analytics dashboard
zifanzhou1024 Apr 29, 2026
8f5a96b
fix: preserve experimental chart gaps
zifanzhou1024 Apr 29, 2026
5763b8f
fix: refine experimental dashboard accessibility
zifanzhou1024 Apr 29, 2026
8d77cbe
Add experimental 0DTE analytics tab
zifanzhou1024 Apr 29, 2026
9a9671a
Add focused OTM IV comparison chart
zifanzhou1024 Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
243 changes: 243 additions & 0 deletions apps/api/gammascope_api/contracts/generated/experimental_analytics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
# generated by datamodel-codegen:
# filename: experimental-analytics.schema.json

from __future__ import annotations

from enum import Enum
from typing import Literal

from pydantic import AwareDatetime, BaseModel, ConfigDict, confloat, conint, constr


class Mode(Enum):
latest = 'latest'
replay = 'replay'


class Meta(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
generatedAt: AwareDatetime
mode: Mode
sourceSessionId: constr(min_length=1)
sourceSnapshotTime: AwareDatetime
symbol: Literal['SPX']
expiry: constr(pattern=r'^\d{4}-\d{2}-\d{2}$')


class SourceSnapshot(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
spot: float
forward: float
rowCount: conint(ge=0)
strikeCount: conint(ge=0)
timeToExpiryYears: confloat(ge=0.0)


class ExpectedRange(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
lower: float
upper: float


class Level(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
strike: float
closeAbove: float | None
closeBelow: float | None


class Right(Enum):
call = 'call'
put = 'put'
pair = 'pair'


class Flag(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
strike: float
right: Right
code: constr(min_length=1)
message: constr(min_length=1)


class PanelStatus(Enum):
ok = 'ok'
preview = 'preview'
insufficient_data = 'insufficient_data'
error = 'error'


class Severity(Enum):
info = 'info'
warning = 'warning'
error = 'error'


class Diagnostic(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
code: constr(min_length=1)
message: constr(min_length=1)
severity: Severity


class Point(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
x: float
y: float | None


class StrikeValue(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
strike: float | None
value: float | None
label: str | None


class Row(BaseModel):
model_config = ConfigDict(
extra='allow',
)
strike: float


class PanelWithRows(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
rows: list[Row]


class ForwardSummary(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
parityForward: float | None
forwardMinusSpot: float | None
atmStrike: float | None
atmStraddle: float | None
expectedRange: ExpectedRange | None
expectedMovePercent: float | None


class Method(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
key: constr(min_length=1)
label: constr(min_length=1)
status: PanelStatus
points: list[Point]


class IvSmiles(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
methods: list[Method]


class SmileDiagnostics(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
ivValley: StrikeValue
atmForwardIv: float | None
skewSlope: float | None
curvature: float | None
methodDisagreement: float | None


class Probabilities(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
levels: list[Level]


class TerminalDistribution(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
density: list[Point]
highestDensityZone: str | None
range68: str | None
range95: str | None
leftTailProbability: float | None
rightTailProbability: float | None


class SkewTail(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
tailBias: str | None
leftTailRichness: float | None
rightTailRichness: float | None


class QuoteQuality(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
status: PanelStatus
label: constr(min_length=1)
diagnostics: list[Diagnostic]
score: confloat(ge=0.0, le=1.0)
flags: list[Flag]


class ExperimentalAnalytics(BaseModel):
model_config = ConfigDict(
extra='forbid',
)
schema_version: Literal['1.0.0']
meta: Meta
sourceSnapshot: SourceSnapshot
forwardSummary: ForwardSummary
ivSmiles: IvSmiles
smileDiagnostics: SmileDiagnostics
probabilities: Probabilities
terminalDistribution: TerminalDistribution
skewTail: SkewTail
moveNeeded: PanelWithRows
decayPressure: PanelWithRows
richCheap: PanelWithRows
quoteQuality: QuoteQuality
historyPreview: PanelWithRows
Empty file.
Loading
Loading