Quantitative research
Predicting market behaviour, and trading on it.
Our research programme has two outputs: signals that carry genuine predictive content, and the low-latency machinery that turns those signals into filled orders in equity markets.
How a signal earns its way into production.
Hypothesis before data
Every signal starts as an economic story about why an inefficiency should exist and who is on the other side of it. Data mining without a mechanism produces findings that evaporate out of sample.
Validation that tries to fail
Walk-forward testing, realistic cost and impact assumptions, and explicit accounting for multiple-comparison bias. A signal has to survive being attacked before it gets capital.
Latency as a research variable
A signal with real content still loses money if it arrives late. We treat the path from tick to order as part of the research surface, not an implementation detail.
Decay monitoring in production
Alpha erodes as others find it. Live signals are tracked against their research baseline so decay is detected and sized down deliberately rather than discovered in the P&L.
The two systems that run it.
System 01 · JARVIS
Institutional stock screening, running on free data.
Most private investors pick stocks on gut feel, tips, or a single ratio. JARVIS applies a repeatable, multi-factor fundamental framework across hundreds of stocks at once — the same discipline a desk runs, without the Bloomberg terminal.
JARVIS fetches annual fundamental data for up to 250 stocks across the US S&P 500 and Indian Nifty 50, scores each one against an 8-pillar quality framework, stores everything in a KDB+ time-series database, and surfaces the top scorers in seconds.
0
stocks, two markets, one universe.csv
0/8
the ceiling score — AAPL and MSFT both clear it today
0GB
KDB+/q engine, splayed on-disk, year-partitioned
Where the data comes from.
Financial Modeling Prep
Annual fundamentals — income, balance sheet, cash flow, ratios
Weekly rotation across the full universe, 250 free calls/day
Yahoo Finance (yfinance)
Daily OHLC price data
Every trading day, free and unlimited
Key capabilities.
- Score any stock 0–8 against the 8-pillar framework with a single call
- Screen an entire market universe and return the top scorers in milliseconds
- Incremental daily price append with full idempotency — safe to re-run
- A staleness-based scheduler that refreshes the oldest data first, every day, inside the free-tier budget
The 8-pillar scoring model.
| # | Pillar | Metric | Pass threshold |
|---|---|---|---|
| 1 | Normalised P/E | Market cap ÷ 5-yr avg net income | < 22.5× |
| 2 | ROIC | True return on invested capital | > 9% |
| 3 | Revenue growth | Latest revenue vs 5 years ago | Positive |
| 4 | Net income growth | Latest net income vs 5 years ago | Positive |
| 5 | Buybacks | Shares outstanding trend | Declining |
| 6 | Debt serviceability | Long-term debt ÷ 5-yr avg FCF | < 5× |
| 7 | FCF growth | Latest free cash flow vs 5 years ago | Positive |
| 8 | Normalised P/FCF | Market cap ÷ 5-yr avg free cash flow | < 20× |
Pillars 1 and 8 use 5-year averages to smooth out cyclical distortions. Pillar 2 uses true ROIC — NOPAT over invested capital — not ROCE, which uses a different denominator. Pillars 3, 4 and 7 are directional: is the business larger than it was five years ago? Pillar 6 stress-tests the balance sheet for manageable leverage. Scores of 6–8 are strong fundamental candidates; below 4 fails the basic quality bar.
System 02 · ULTRON
Tick to order, on a sub-millisecond budget.
ULTRON is a sub-millisecond intraday trading engine for Indian equities: live tick-by-tick data in, signals computed on a zero-garbage-collection hot path, orders out automatically, and every tick archived for JARVIS to research on overnight.
0
symbols tracked, live, every trading session
0M+
ticks ingested per day
0
slots in the lock-free ring buffer
<0ms
tick-to-order latency target
Design priorities.
Latency
Sub-millisecond tick-to-order on the signal hot path, via an LMAX Disruptor ring buffer.
Reliability
Zero data loss — a QuestDB partition is never dropped until its Parquet export is verified row-for-row.
Scalability
Nifty 500, Midcap 500 and Smallcap 500 together — roughly 1,500 symbols, ~281M ticks a day.
Hot-reload
Strategy configs are watched on disk and reloaded live. No restart, no missed ticks.
Observability
Eight Prometheus metrics on every scrape, plus a health check — nothing runs unobserved.
Tick in, order out.
NSE
Live market, via the Kite WebSocket feed
Ring buffer
65,536 pre-allocated, lock-free slots
Signal handler
EWMA, historical volatility, ADV — zero allocation
Order manager
Position tracking, notional caps, Zerodha REST
QuestDB
Intraday record, written over the ILP line protocol
JARVIS HDB
End-of-day Parquet archive for downstream research
The end-of-day roll, six safety steps.
- 01Snapshot today's row counts across all four tables as a verification baseline.
- 02Stream each table to Parquet, with up to three retries 15 minutes apart.
- 03Verify Parquet row counts match the snapshot exactly, or abort with the partition intact.
- 04Write a completion marker — JARVIS only reads a day's data once it exists.
- 05Only then drop the day's partition from the local database, reclaiming disk for tomorrow.