Problem
Zerodha Kite shows a retail trader holdings, day P&L and a simple chart, and stops there. It does not say how a position looks across timeframes, how much the portfolio could lose, how it would have behaved through a crash, or where a forecast puts it with an honest error bar.
Those answers usually mean a paid terminal or a folder of fragmented Python scripts.
Users
One user: me. KiteEdge is a personal tool in a private repository (all rights reserved), run against my own Kite account, with no public link and no user base to report.
Before building I did desk research on what portfolio analytics tools track and compared Smallcase, Tickertape and Screener.in on technical depth, risk quantification and forecasting. That set three requirements: multi-timeframe technical analysis, not just daily; portfolio-level risk with scenario stress tests as a core module rather than a chart; and forecasts that always ship with their error. It also set one constraint: no free source covers Indian small-cap fundamentals completely.
Decision
Trade-offs
Run it where the data already is. KiteEdge runs in Docker Desktop on my own laptop with my own Kite Connect credentials. Kite OAuth tokens are held in Redis with a fixed TTL rather than written to the app's database. It is not a zero-egress system: it calls the Kite Connect API for market and account data, and alert emails leave the machine through an SMTP provider.
Free data sources. No terminal budget, so fundamentals are best-effort and nullable by design, and every derived number carries its methodology.
What shipped
Shipped between May and Sep 2026, organised around the questions I actually ask of my portfolio:
- What have I actually earned? Multi-year XIRR per holding and for the portfolio, dividend tracking, and breakdowns by sector, asset class and market cap.
- What is this position doing? 43+ technical indicators across trend, momentum, volatility and volume, on timeframes from one minute to daily, rolled into a single summary score.
- How much could I lose? Value at Risk by four methods (historical, parametric, Monte Carlo and conditional VaR), drawdown analysis, and stress tests against COVID-19, the GFC, Demonetisation and the Taper Tantrum.
- Where might it go? An ARIMA/SARIMA and Prophet ensemble, with walk-forward error metrics attached to every forecast.
- Am I any good, and are the models? A FIFO-matched trade journal, and an append-only suggestion journal that records what the models recommended and how those calls aged.
- Alerts. Price and percentage-change alerts, in-app and by email.
Under the hoodArchitecture and implementation
Services
Elixir/OTP for streaming (Phoenix Channels, Broadway for Kafka consumers), Python/FastAPI for the quantitative work (pandas, NumPy, SciPy, statsmodels, Prophet, QuantStats), and a React/TypeScript dashboard. Docker Compose runs the stack locally, with Postgres, Redis and Kafka alongside.
Streaming path
Market Data connects to Kite's WebSocket feed, decodes ticks and publishes to Kafka. The data pipeline builds candles from one minute to daily, computes indicators and evaluates alert rules; the notification service sends alert emails, and Phoenix Channels push live updates to the dashboard.
Risk and forecasting
VaR via historical, parametric Gaussian and Monte Carlo (10,000 simulated paths), plus conditional VaR. ARIMA/SARIMA is auto-fitted by information criteria; Prophet runs on the NSE trading calendar; the two are combined by an inverse-error weighted ensemble.
Validation
Forecasts report their walk-forward error, Monte Carlo VaR states its simulation count and assumptions, stress tests cite the event and date range, and the suggestion journal records every model call and how it aged. The Elixir apps and the Python engine have automated tests, but no test count or dated run is quoted on this page because none was re-run for it; synthetic data appears only in those tests and in demo renders like the tear sheet above. This is evidence about method, not outcome.
Limits and next
- One user, no pilot. I have not recorded how long I have run it or on how many positions, and there is no headline accuracy figure; the walk-forward metrics live in the tool.
- Private by design. The repository is private and all rights are reserved; there is nothing to link.
- Next bet: replace direct Kafka consumers with an event store, so any analysis can be re-run against historical market conditions.
- Open question: whether the suggestion journal, once its calls have aged, shows the models earning their place or argues for fewer of them.
- What I'd do differently: record my own usage from day one: run time, positions, and what it changed about my decisions. Without that, the evidence here is method, not outcome.
Credits
Solo, personal project: product boundary, architecture and every service are mine. Market data and account access come from Zerodha's Kite Connect API under my own credentials.



