For One retail trader: me · Personal Portfolio-Analytics Desk

KiteEdge

A personal portfolio-analytics desk for one Zerodha account.

DecisionAnalytics only: the tool reads the Kite account and never writes to it, so there is no order placement.

Instead of trade execution through the platform.Cost: it can analyse a position but never act on it: it reads the account and writes nothing back.

Personal tool
Status
Private
Ownership
Solo · personal tool, product and architecture
Evidence
Built: works locally, lightly tested
Checked
Last verified

A private, personal analytics desk for one retail Zerodha trader (me): risk, forecasting and technical analysis on my own holdings. It reads the account and never places a trade.

Role
Solo builder · Product & Engineering (personal tool)
Timeline
May 2026 – Sep 2026 (last commit 24 Sep 2026)
Team
Solo
My part
Solo. The product boundary (analytics only), the architecture and every service.
Stack and tools8

Elixir · Phoenix · Python · FastAPI · React · TypeScript · PostgreSQL · Kafka

QuantStats tear sheet from KiteEdge's report module, rendered on seeded synthetic returns, not account data.

Tear sheet rendered on seeded synthetic returns, not account data.

TL;DR

A personal tool in a private repo, built solo, for one retail Zerodha trader who wanted more than holdings and day P&L. KiteEdge runs in Docker Desktop on my own laptop with my own Kite Connect credentials and adds risk, forecasting and technical analysis on top of the account. The defining call: analytics only, it never places an order.

Analytics onlyNever places an order · synthetic data in tests
Chapters

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.

OptionStatusWhy
Analytics only, no order placementChosenNo order-execution risk; I never trust it with a trade.
Trade execution through the platformRejectedAdds order risk and a much higher bar for correctness.
Best-effort free dataChosenHonest gaps beat false precision.
Paid terminal-grade data feedRejectedNo budget for a personal tool.
Ensemble forecast with walk-forward validationChosenEvery forecast carries its own error metrics.
Single-model point forecastRejectedA number without an error bar is a black box.
Event-sourced analytics pipelineDeferredKafka consumers shipped first; replay is harder.

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
The analytics engine serving its own OpenAPI docs locally. The tear sheet at the top of this page comes from the report module, rendered on seeded synthetic returns over 248 trading days; synthetic data is used only for tests and demos.

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.

  • Technical

    TCS NQT Prep Hub

    Free, offline-capable TCS NQT prep with 404 practice questions.

    Decision: Offline-first before anything else: cache the app shell and question bank on first load so it works with the network off.

    Built the web app · question bank started by three other contributors

    LiveEvidence: Built

    404Practice questions (repo README)

  • Technical

    This Portfolio

    A portfolio treated as a product, decision trail included.

    Decision: Treat case studies as content, not pages: one MDX file per study, so adding or correcting one is a one-file change.

    Solo · product, content and build

    LiveEvidence: Tested

    6Versions, Jan to Sept 2026

  • AI

    Aarchid

    Photograph a sick plant, get a diagnosis you can act on.

    Decision: Require a source link on every recommendation, and judge prompt changes against a fixed golden set, not by feel.

    Co-built with Dilpreet Grover · product, eval, orchestration

    LiveEvidence: Self-reported

    SourcedA source link required on every recommendation · offline eval result withheld; field accuracy not measured