Know when the news turns against a company you hold.
RiskRadar reads financial headlines as they break, scores them with a finance-tuned language model, and alerts you the moment a company moves outside its own normal range. Not a fixed threshold. A baseline that learns each ticker.
No sign-up for the demo: a temporary guest account opens straight onto the dashboard.
From a breaking headline to an alert in seconds.
Every article flows through the same six stages. The web app, the stream engine and the model run in one process on a small VM, or as a Kafka and Apache Flink cluster, with the same code deciding every outcome.
Every ticker is judged against its own history.
A fixed cut can't work: replaying 672 real headlines, a 0.7 threshold fired on 13.5% of windows, while averaging sentiment fired on none. So RiskRadar keeps each company's trailing 24-hour distribution and alerts only on its top 3%.
Tesla's baseline, live
Distribution of alert scores over the last 24 hours
Loading the live distribution…
TSLA sees ~11 articles an hour and AAPL ~32. They get different bars, automatically.
Seven tickers, each with its own bar.
The line is the alert score of each 15-minute window; the rule is that ticker's current cut. Red points crossed it.
Straight off the pipeline
Headlines that name a tracked company, as they were scored
- -0.01
- +0.01
- +0.66
- +0.50
- +0.12
- +0.66
- +0.14
- -0.43
- -0.40
- +0.03
Recent alerts
Across all users, newest first
-
TSLA ▲highscore 1.32 vs baseline 1.31How Bad Would A Cash Shortfall Be For Tesla Stock?
-
MSFT ▲highscore 1.24 vs baseline 1.22EU officials dismiss ‘absolute sh*t’ alternative to Microsoft Teams imposed by Brussels
-
GOOGL ▲highscore 1.15 vs baseline 1.10NFC Bug Causes Problems with Google Wallet
-
META ▲highscore 1.43 vs baseline 1.33Meta Platforms Faces Up to $40 Billion in Penalties Following Data Privacy Trial
-
NVDA ▲highscore 1.31 vs baseline 1.12Amazon is hiking chip-rental prices and reportedly moving Nvidia processors off the balance sheet
Built like a production system, sized for a portfolio budget.
The full stack is Kafka, Apache Flink, FinBERT, Redis and PostgreSQL. This demo runs the same domain code as one sandboxed process on a shared 4 GB VM, next to another app, with room to spare.
Two interchangeable stream engines
PyFlink on a cluster, or the identical topology in plain Python. Both call one shared stage module, and the lite engine reimplements Flink's watermark, lateness and sliding-window rules, pinned by tests.
Adaptive per-ticker baselines
A trailing distribution per company in a Redis sorted set. The alert score is left uncapped so percentiles stay meaningful at the top, where a capped score made every ticker unalertable.
Hardened for the open internet
Per-IP and site-wide rate limits, CSRF and a strict CSP, http(s)-only feed links, guest accounts that can't reach Slack, and a systemd sandbox with memory and CPU ceilings.
Tested where it matters
Event-time semantics, baseline maths, abuse limits and the PostgreSQL data layer are pinned by tests. Running the two engines side by side exposed a PyFlink bug that silently discarded event time.
def evaluate_and_alert(redis, store, feats): # Judge the window against THIS ticker's trailing distribution, # before the window itself is folded into it. decision = store.evaluate(feats.ticker, feats.alert_score, feats.total_mentions) if not decision.should_alert: return None if alerting.in_cooldown(redis, feats.ticker, simulated=feats.simulated): return None # onset, not every slide after alert = alerting.build_alert(feats, decision.threshold, source="simulated" if feats.simulated else "live") alerting.fan_out(alert) # history for every subscriber, Slack for verified hooks
Inject a synthetic crisis and watch the alert land.
The demo drops you on a live dashboard. Press one button, and ten negative headlines flow through FinBERT, close a window and cross the baseline in seconds.