Methodology
How a filing becomes a signal
The governing rule: no LLM sets any number. Every score, action and confidence value is a deterministic function of facts a filing states and market data that already happened. An LLM integration exists in this system, off by default, and it does exactly one thing when enabled - phrase an explanation of a fact already extracted and scored. It cannot originate one.
The pipeline
EVENT
An adapter polls a source's own published feed - NSE and BSE's corporate-announcement APIs, SEBI's and RBI's press releases, 20+ ministries and regulators - at a paced interval that respects robots.txt. Nothing is scraped from a press aggregator; the filing is captured byte-exact, SHA-256 hashed, and archived before anything else touches it.
EVIDENCE
The filing is classified into one of 100+ rule-based event types (weighted regex rules, ties resolved by rule order - never a model's judgment call), then structured facts (amounts, dates, counterparties, rating direction) are pulled only from words the filing itself contains, each retained alongside the verbatim snippet it came from.
MATERIALITY
A 0-100 score from deterministic rules over those extracted facts: deal size against the company's own revenue/EBITDA/market cap, how novel the disclosure is, and the security's liquidity. A fact the filing does not state contributes zero and is listed as an input the score could not use - never filled in with a plausible guess.
IMPACT
A signed -100..+100 score. The direction comes from the filing's own language (a rating downgrade, a beat vs. a miss, an order won vs. an order served against the company) - not from a sentiment model's read of the tone.
PRICE CONFIRMATION
Checked against what the security's price has actually done since. A story the market has already priced in is flagged as such, and whether price is confirming or contradicting the news direction feeds the confidence score.
RECOMMENDATION
13 NO-TRADE gates run first and are absolute: an unconfirmed source, a conflict between sources, a duplicate, an unverifiable timestamp, low company-mapping confidence, impact too small to cover execution cost, confidence below the actionable floor, materiality below the material threshold, illiquidity, insufficient data quality, an ambiguous event, information already priced in, or a human reviewer's override. Any single gate blocks the call. A screen full of NO-TRADE on a quiet day is the system working, not a bug.
The 13 NO-TRADE gates
Run before an action is ever chosen. Any one of them is enough to block a call:
- ·Source not primary/authenticated
- ·Event not confirmed by a Tier-1/Tier-2 source
- ·Unconfirmed - not independently verified
- ·Sources conflict on the substance of the event
- ·Duplicate of an already-published event
- ·Routine disclosure with no new information
- ·Source timestamp could not be verified
- ·Company mapping confidence too low
- ·Expected impact too small to cover execution cost
- ·Confidence below the actionable floor
- ·Materiality below the material threshold
- ·Liquidity too low (average daily turnover)
- ·Data quality insufficient to assess the event
What the engine will not do
- Invent a figure. An amount the filing does not state is UNKNOWN in the API and on screen - never estimated.
- Trade automatically. Order placement is reachable from exactly one function in the codebase, gated by three independent checks and a single-use, five-minute token burned before transmission. A test suite fails the build if that ever changes.
- Delete a correction.Corrections are additive - nothing is hard-deleted, so the full history of what a signal said and when is always reconstructable.