Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
Test whether a trading signal actually predicts the next move. Real quant factor research — information coefficient, decay and quintile analysis — on live Yahoo Finance data.
翻訳待ち
金融TypeScript · CSSGitHub @hoshsmith244-opsオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
A quant factor research tool. Pick a stock, pick a factor, and find out whether
it actually predicts the next move — measured the way a quant fund measures it,
using real market data.
An introduction to quant research, built as a runnable Next.js app.
Then open.
Node runtime. This machine had no Node installation, so a portable build
(Node 24.21.0) was extracted to %LOCALAPPDATA%\nodejs-portable and added to
your user PATH. A new terminal picks it up automatically. If a shell still
cannot find node, run dev.cmd in this folder — it pins the path first.Read the full README ↗A quant factor research tool. Pick a stock, pick a factor, and find out whether it actually predicts the next move — measured the way a quant fund measures it, using real market data.
An introduction to quant research, built as a runnable Next.js app.
npm run dev
Then open http://localhost:3000.
Node runtime. This machine had no Node installation, so a portable build (Node 24.21.0) was extracted to
%LOCALAPPDATA%\nodejs-portableand added to your userPATH. A new terminal picks it up automatically. If a shell still cannot findnode, rundev.cmdin this folder — it pins the path first.
| Command | What it does |
|---|---|
npm run dev | Dev server on port 3000 |
npm run build | Production build |
npm run start | Serve the production build |
npm run test | Bar hygiene, pre-close window, sync merge, edge model, trade record and options-maths suites |
npm run check | typecheck + lint + test + build |
npm run deploy | Pre-deploy gate, then commit and push (Git Bash) |
| Route | Purpose |
|---|---|
/ | Landing page |
/dashboard | The tool. Opens in Simple mode; Advanced holds the statistics |
/screener | Every strategy against every ticker, filtered by strategy, company and risk |
/watchlist | Saved ticker + strategy pairs, scanned in one pass |
/notifications | Entry and exit changes across the watchlist |
/settings | Appearance — accent, direction colours, background, grid |
/guide | How to use it, and how to read every statistic |
/membership | Account area and tiers (UI only — see below) |
/api/history | Daily OHLCV for one ticker (GET) |
Prices come from Yahoo Finance via yahoo-finance2
— the same endpoints the Python yfinance package reads, in TypeScript so the
app stays on one runtime and deploys to Vercel without a Python function.
Any ticker Yahoo carries works: AAPL, BRK-B, BTC-USD, ^GSPC, VOD.L,
EURUSD=X. Three years of daily bars, fetched once per symbol and cached at the
edge for an hour.
src/lib/market.ts is server-only (yahoo-finance2 needs node:module and
cannot be bundled for the browser). Anything the client needs — the ticker list,
shared types — lives in src/lib/symbols.ts.
The hero panel on / is not a screenshot. It runs the real engine on AAPL at
request time and prints the current signal, dated. The page is prerendered with
revalidate = 3600, so it refreshes hourly and costs one Yahoo call an hour no
matter how much traffic it gets. If the provider is unreachable at build or
revalidate time it falls back to describing the tool rather than showing numbers
that were never true.
The terminal also shows the extended-hours price and recent headlines, because a signal computed on the daily close cannot see an earnings release at 16:05. When the after-hours move exceeds 2%, the signal is flagged as possibly out of date.
None of it touches the maths, for two reasons:
Headlines are labelled as context, not cause. A story published near a price move is a hypothesis; the interface says so rather than asserting a reason. Building a real news factor would need point-in-time historical news with timestamps and sentiment — a different data provider, not Yahoo.
/screener answers the question the terminal cannot: which ticker should I
even be looking at? It runs all five price factors against the universe at
their default settings and lets you filter the results three ways:
| Group | Filters |
|---|---|
| The strategy | verdict, factor, signal now, minimum trades, beat holding out of sample, survives the stress test, hide strategies that still lost money |
| The company | sector, industry, market cap, P/E, dividend, profitable or not, revenue growing or shrinking |
| Risk and tradeability | liquidity (daily dollar volume), volatility, beta, short interest |
Simple mode shows four of these; the rest live behind More filters in
advanced mode. Every bucket carries its ticker count (Mid · $2–10B (46)) so an
empty slice announces itself rather than silently returning nothing.
Liquidity is the one that matters most and the one a conventional screener never has. Every backtest here charges a flat 10 bps round trip, which is only honest on a name that actually trades; below roughly $10M a day the real spread is wider than the modelled cost and the edge shown is partly fiction.
Analyst ratings and price targets are deliberately absent. They are opinions, not measurements, and nothing else on this page is an opinion.
It is precomputed, not live. The scan is a thousand backtests and takes
about three minutes — far too slow per request, and pointless, because daily
bars only move once a day. scripts/build-screen.mts writes
public/screen.json (399 KB, ~62 KB gzipped) and the page fetches that static
file. No Yahoo traffic, no function timeout, nothing added to the JS bundle.
Rebuild it after the close:
node scripts/build-screen.mts
Two rules the script enforces, both of which a conventional screener breaks:
This is the beginning of the README. Read the rest at the original. Read the full README ↗