Under App Store review

Learn to trade. No real money. No noise.

Finio is a stock market education app with a Python signal processing backend, a real-time demo portfolio, and AI-generated analyst verdicts — built solo, spec to submission.

Profile
Sign in
Analyst verdict
Home feed
4
Signal channels
2
Live data sources
$10k
Demo balance
Solo
Built by one engineer
Under the hood

Signal pipeline

The verdict on screen is the output of a Python signal processing backend — the same architecture as an embedded sensor pipeline, just with price data instead of sensor readings.

01
Raw input
OHLCV bars from Polygon.io + live quotes from Finnhub. Redundant sources with local cache fallback on rate-limit — no silent failures.
Polygon.io · Finnhub
02
Filter
Rolling averages, rate-of-change over 20 bars, z-score normalization against a 60-bar window. Noise removed, signal preserved.
NumPy
03
Feature extraction
Four channels computed in parallel: momentum, volume pressure, trend (EMA crossover), and volatility (rolling σ).
4 channels
04
Verdict
Signals scored, weighted, and resolved into an analyst verdict with tagged signal contributors shown in the UI.
Buy · Hold · Sell
# momentum signal — rate of change over 20 bars roc = (close - close.shift(20)) / close.shift(20) # z-score normalization against 60-bar rolling window z = (roc - roc.rolling(60).mean()) / roc.rolling(60).std()
The product

Five screens, one coherent system

From auth to analyst verdict to demo portfolio — every screen is connected to the same live data pipeline. Dark, fast, opinionated.

Stack
⚡  Expo React Native · iOS
🔥  Firebase Auth + Firestore
🐍  Python NumPy signal backend
📈  Polygon.io + Finnhub APIs
🤖  AI-generated analyst verdicts
Architecture

State machine at the core

The trading session logic is a deterministic finite state machine. Every transition is explicit, triggered by a specific event, and logged — the system always knows exactly what state it's in.

Session states
IDLE
MARKET_OPEN on_open()
POSITION_ACTIVE buy_confirmed()
ORDER_PENDING sell_request()
SETTLED settled()
No implicit state, no silent failures. Every transition is logged and recoverable — the system always knows exactly where it is. That's the design constraint.
Data sources
Polygon.io
OHLCV history · primary source
Finnhub
Live quotes · secondary source
Local cache
Rate-limit fallback · stale-data flagged to user
Real-time layer
Firestore listeners
Event-driven sync across trading rooms — fires on change, not polling
Firebase Auth
Apple Sign-In · email · session management
Try it now

Demo account

Currently under App Store review. Use the demo account for the full experience — live data, analyst verdicts, $10k simulated portfolio.

Email
demo@finio.app
Password
Demo1234!
App Store review in progress
K
Kabir Wadhwani
Electrical & Computer Engineering · Santa Clara University · Class of 2028