Inspiration

Blackstone's brief says investors have more information than ever, spread across sources, and that understanding what they own is still hard. We noticed the flood has a second cost: every app sends alerts, and almost none can say whether the thing it's alerting about has ever mattered for that stock. So we built the app that starts from what you own, brings the sources to one screen per holding, and refuses to worry you without precedent. That's the name.

What it does

Precedence pulls SEC filings, XBRL financials, Form 4 insider sales, two years of daily prices, the 10-year Treasury yield and fund holdings into one screen per holding, for 103 S&P 100 stocks plus the big index funds, a 401(k), a home, and Blackstone's BREIT and BCRED.

For each holding it tests three kinds of news against that stock's own history: a cluster of insider sales, a jump in rates, and a 5% gap down at the open. It counts every past case, checks what the stock did next against its own normal days, and puts a 90% range around the answer. A holding is Calm unless a signal that passed that test is firing right now; then it gets a Heads up. When the history doesn't back the worry, it says not proven out loud, which is most of the time.

Two views of the same data: Lite in plain words and dollars, Pro with the working shown (every case, the hold-out, the stricter test, the multiple-testing correction, links to the filings).

The Briefing tab reads your portfolio to you: an animated orb, a recorded voice, word-synced captions, and beside every sentence the evidence it came from, one tap from the page that proves it. It talks; it never listens. Import reads a brokerage screenshot and refuses any reading whose rows don't add up to the printed total. Paper trading lets you try a trade with pretend money; no order is ever sent.

Blackstone asked for Precedence
Understand what they own One total across stocks, ETFs, a 401(k), a home and Blackstone funds; funds opened up into the companies inside them
Information spread across sources Filings, financials, insider sales, prices, rates and fund holdings on one screen per holding, each with its source and as-of date
Turn information into insight Every kind of news is tested against that stock's own history before it may ask for attention
Analyze the existing portfolio Risk card (drawdown, beta, worst day), the "What you really own" treemap, a bad-day loss per holding
Discover trends and risks Signals: every past case, what followed, and whether it beat normal days
Summarize complex information Filing summaries with every figure checked against XBRL; a spoken briefing where every number is checked
Visualize performance Price and candle charts, dot-plot comparisons, the treemap, the home's map
Evaluate what to invest in next Paper trading at Friday's close, and the same test on any S&P 100 stock before you buy
Ask questions in natural language The Briefing answers what an investor would ask, in plain sentences, before it's typed

How we built it

  • Data. A Python pipeline (FastAPI, psycopg, Postgres 16) with one client per source, split into a cached, rate-limited fetch and pure parsers unit-tested against sample files. Every write is an upsert, so a re-run only fetches what's missing. SEC EDGAR, Alpaca (IEX feed), FRED, State Street's SPY file, SEC N-PORT for VOO, IVV and QQQ, FHFA's house price index, the Census geocoder.
  • The signal engine is pure functions with no I/O: event timing from SEC acceptance times, next-open entry, normal days, Wilson and Newcombe intervals, a split-half hold-out, Benjamini-Hochberg across the scan. Tests check it against statsmodels and SciPy to 1e-14, and a mutation script breaks one rule at a time to prove each test can fail.
  • The briefing is a panel of experts, each a tested rule over one kind of evidence, and a gate that speaks the most salient points within a line budget and lists what it held back. Every number in every sentence must round-trip to its source or the line is never spoken. The voice is Kokoro-82M, an open-weight speech model, recorded ahead of time; the orb is Three.js.
  • AI where reading is the job, checked where it counts. Gemini reads screenshots and summarizes filings; screenshot rows must reconcile to the printed total and every figure in a summary must match the filing's own XBRL. No model assigns a label, a Heads up, or a number.
  • The frontend is Next.js 16, React 19 and TypeScript, with a saved-data mode that serves real API responses from one market close so the public demo needs no server.

Challenges we ran into

  • Saying "not proven" honestly. In our scan, 11 of the 115 stock-signal pairs with enough cases came out STRONG, about 6 would by chance, and none survive the false-discovery correction. Pro says exactly that.
  • Timing. A filing "known at" the wrong minute moves a case by a day. SEC acceptance times are UTC despite the format, and the 10-year yield is published the next afternoon; we verified both against the sources.
  • Market-wide news. A rate jump hits every stock at once, so "the stock fell" is the market falling. That signal is judged against SPY over the same days, and a placebo check showed why it has to be.
  • A narrator that can't lie. The easy path was a language model writing the script. We built the check first, then found the rules could pass it and a model couldn't be made to, so the rules speak.

Accomplishments that we're proud of

  • Real data end to end, with every number carrying its source and an as-of date.
  • A statistics engine that matches the reference libraries to machine precision, with a mutation check that proves the tests bite.
  • A spoken briefing where every sentence is grounded and the evidence is one tap away.
  • Screenshot import that refuses to guess: rows must add up to the total on the picture.
  • A demo that never goes down, because it needs no server.

What we learned

Most "signals" people worry about don't hold up on a single stock's history, and an app that admits that is more useful than one that alerts. Precise timing matters more than clever models. And a language model is most valuable where reading is the job, as long as something else checks what it read.

What's next for Precedence

Trained finance models come in as Readers that can only propose cases for the same engine to test: FinBERT tone on 8-K text is already wired in behind a flag, with a placebo calibration script that keeps the false-STRONG rate near 5%. A local summarizer (Ollama) is behind a second flag. A hosted backend and a live deploy will put the full app online; brokerage connections (SnapTrade) after that.

Libraries, models and data (all of them)

FastAPI, Uvicorn, psycopg 3, python-multipart, httpx, python-dotenv, QuantStats, pandas, NumPy, SciPy, pytest, statsmodels (tests only), yfinance (saved-data build only), Pillow (one-off script), Next.js, React, TypeScript, TradingView Lightweight Charts, d3-hierarchy, driver.js, three.js (orb renderer ported from Eno, MIT), Vitest, ESLint, Google Fonts (Epilogue, Alegreya, Doto), Kokoro-82M with misaki and PyTorch (recorded voice). Optional and off by default: Hugging Face Transformers, PyTorch and ProsusAI/finbert (v2 Reader), Ollama (v2 local summarizer).

Data and APIs: SEC EDGAR, Alpaca Market Data, FRED (not endorsed by the Federal Reserve Bank of St. Louis), State Street SPY holdings file, FHFA House Price Index, US Census Geocoder, OpenStreetMap tiles, Google Gemini API, Yahoo Finance via yfinance. Research: Boudoukh, Feldman, Kogan & Richardson (NBER w18725); Wilson (1927); Newcombe (1998); Benjamini & Hochberg (1995).

Built With

Share this project:

Updates

Submission history