The Warning study measured a fitted percentile crossing that nothing consumes. What reaches Telegram is a quadrant change: fixed 50/40 dividers, hysteresis, two-session confirmation, 3-day cooldown. Those thresholds are constants, not fits, so there is no training set to protect and all 11 detected corrections are evaluable instead of the 4 that fell in a holdout. Replaying it: 1/10 corrections, 0.9 false alarms/year. Random alarms at the same firing rate match or beat that in 65% of draws. The panel now carries ablations (does the quadrant machinery earn its place?), external baselines (does the score earn its complexity?), and that null, because a bare "2 of 4" was unreadable in either direction. Nothing in the alert path was retuned on the strength of it. Fundamentals become a third channel rather than a term in either score. v3 cut them arguing 12+8 of 100 points "could not change any published conclusion" -- true only when every technical sensor reads zero; weighted they moved the bar for the 40 divider from 40 to 25. But no fusion weight is measurable either: with ~10 events and no fundamental history, any weight is a policy preference presented as a measurement. So the read is a categorical state (supportive/neutral/adverse/ unknown) with an evidence grade, derived by fixed rules from stored facts, read by confluence. The LLM extracts and explains; it does not score. Absence stays absence throughout. `unknown` is unreachable by averaging, a stale or empty observation may display but never confirm, extraction failures map to `unknown` rather than `mixed`, and the study rows are coverage-matched and marked not-measurable until enough corrections are covered -- otherwise a fortnight of observations renders as 0/10 and reads as a failed test. Observations become a real time series (migration 033); they lived in a single overwritten settings slot, so no history existed to replay. Pre-rename snapshots are adapted rather than discarded. METHODOLOGY stays v4 -- no score changed -- so no reseed; STUDY_SCHEMA moves to 3 and discards the cached report. Post-deploy: re-run Event Study from Admin -> Jobs. The panel reads "not run yet" until then. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
from app.models.ticker import Ticker
|
|
from app.models.ohlcv import OHLCVRecord
|
|
from app.models.user import User
|
|
from app.models.sentiment import SentimentScore
|
|
from app.models.fundamental import FundamentalData
|
|
from app.models.fundamental_snapshot import FundamentalSnapshot
|
|
from app.models.earnings_event import EarningsEvent
|
|
from app.models.data_import_run import DataImportRun
|
|
from app.models.score import DimensionScore, CompositeScore
|
|
from app.models.sr_level import SRLevel
|
|
from app.models.trade_setup import TradeSetup
|
|
from app.models.watchlist import WatchlistEntry
|
|
from app.models.settings import SystemSetting, IngestionProgress
|
|
from app.models.alert import AlertLog
|
|
from app.models.paper_trade import PaperTrade
|
|
from app.models.regime_snapshot import RegimeSnapshot
|
|
from app.models.regime_fundamental_observation import RegimeFundamentalObservation
|
|
from app.models.benchmark_price import BenchmarkPrice
|
|
from app.models.signal_context_snapshot import SignalContextSnapshot
|
|
from app.models.system_event import SystemEvent
|
|
from app.models.sec_filing_gap import SecFilingGap
|
|
from app.models.job_run_state import JobRunState
|
|
|
|
__all__ = [
|
|
"Ticker",
|
|
"OHLCVRecord",
|
|
"User",
|
|
"SentimentScore",
|
|
"FundamentalData",
|
|
"FundamentalSnapshot",
|
|
"EarningsEvent",
|
|
"DataImportRun",
|
|
"DimensionScore",
|
|
"CompositeScore",
|
|
"SRLevel",
|
|
"TradeSetup",
|
|
"WatchlistEntry",
|
|
"SystemSetting",
|
|
"IngestionProgress",
|
|
"AlertLog",
|
|
"PaperTrade",
|
|
"RegimeSnapshot",
|
|
"RegimeFundamentalObservation",
|
|
"BenchmarkPrice",
|
|
"SignalContextSnapshot",
|
|
"SystemEvent",
|
|
"SecFilingGap",
|
|
"JobRunState",
|
|
]
|