Lamda Terminal rebuilds the record of Indian listed companies from original regulatory filings. Every number is as-reported, every revision is kept, and every figure carries the second it became public.
When a company restates a quarter, most data vendors overwrite the old figure. When a company delists, it drops out of the universe. When a filing goes public at 4:12 pm, the database records only the date, or the end of the quarter it describes.
Each of these looks harmless. Together they make every backtest a little too good. A strategy tested on today's numbers trades on figures nobody could have seen at the time, on a universe that leaves out the companies that failed. For Indian equities the gaps are wider still. Global vendors cover small caps and delisted names thinly, and the original disclosures are scattered across exchange portals in XBRL, HTML and scanned PDF.
The figure you backtest on is often not the figure the market saw. Once a vendor overwrites a restatement, the original can't be recovered by any query.
A universe built from today's listed names and filled in backwards leaves out every company that failed, merged or delisted.
Results are often announced hours before the formal filing. Without the exact second, signals leak forward in time.
Each fact in Lamda carries two times: valid time, the period it describes, and knowledge time, the second it became knowable. Nothing is ever updated or deleted. A restatement is stored as a new version of the fact with a later knowledge time, so you can view the whole market at any past moment, the way it looked then.
We collect results filings, shareholding patterns and corporate announcements straight from the exchange and keep every raw artifact byte for byte. Facts are parsed verbatim, with exact decimals throughout, and checked against accounting identities. Filings that fail the checks are quarantined and never served.
Pi DB is an append-only, memory-mapped Arrow store. Its asof read returns one version per fact, either the latest known at time T or the first reported. Run both and the difference between them is the restatement history.
A purpose-built language for bitemporal tables. Every row is resolved at its own point in time. It refuses operations that would give a silently wrong number, such as screening a universe that quietly drops the companies that failed, and it says why.
A keyboard-driven terminal UI for analysts, a web app with a "known as of" time slider for evaluators, and a Python and Excel SDK that pulls sealed, versioned tables. Provenance is attached to every cell.
A pipeline reads left to right. The first stage sets the time axis, and each stage after it takes a table and returns one. Every cell resolves at its own point in time, and you can drill into any cell to see the filing, the valid time and the second it became known.
Type ask "…" anywhere in a line. A language model searches the catalog and proposes series that already exist, and you tick the ones you want. The model can't name a series that isn't in the catalog, and it never computes a number.
λ quarterly since 2020 | [TCS, INFY, WIPRO].revenue | ask "balance-sheet stress"λ quarterly since 2020 | [TCS@NSE, INFY@NSE, WIPRO@NSE].revenue | TCS@NSE.[balance_sheet:AmountOfTotalFinancialIndebtedness…, balance_sheet:AmountOfDefault…Loans…, balance_sheet:BorrowingsNoncurrent]What gets stored is the approved selection, not the conversation, so replaying the table never calls the model. You can also describe a whole screen in plain English and the model drafts the sheet from the same vetted vocabulary.
λ quarterly since 2015 | [mcap > 1e11].close refused · selects members by a RULE, not a list. today's members were not yesterday's, so fanning it wide would backfill survivors into a past that never held them. enumerate the members.
"Today's large caps, back to 2015" is the most common backtest mistake. Most tools run it without a word. Lamda refuses at parse time and explains why.
| T | TCS | INFY | HCLTECH | WIPRO |
|---|---|---|---|---|
| 2025-12-31 | 23.3 | 23.3 | 25.9 | 20.4 |
| 2026-03-31 | 17.8 | 18.1 | 22.1 | 14.8 |
| 2026-06-30 | 14.9 | 13.8 | 17.5 | 13.5 |
| 2026-09-30 | 14.7 | 13.0 | 19.3 | 11.7 |
quarterly since 2025 | [TCS, INFY, HCLTECH, WIPRO].pe_ttm · trailing P/E, each row as known at its date
Seal any table under a name, then refresh, roll back or pull it into Python and Excel. The line that built it travels with it.
Systematic and discretionary investors ask different questions of the same data. Both need it to be what was actually known, when it was known.
EXPLAIN plan for every implicit choiceAny team can build a UI. A full-history, as-reported dataset can't be rebuilt from a vendor feed after the fact, because the vendor has already thrown away the versions that matter. It has to be built from the original filings, one disclosure at a time.
Our storage is append-only, so retaining versions isn't a feature we bolted on. A competitor that collapses data to the latest version can't add this later without going back to the source and re-acquiring it.
We line up each formal filing with the earlier exchange announcement and stamp each fact with when it was first actually public, often hours before the filing itself.
The whole market, not an index. Companies that have since delisted, merged or failed stay in the record, and where a value no longer exists the gap is shown and explained rather than filled.
Monetary values are exact decimals, never floats. Every fact is checked against accounting identities and linked to the raw filing, URL and timestamp it came from.
Concept mapping, ratios and price adjustments are computed when you read and versioned by table code, so improving a method never corrupts the record.
Each choice comes with a sensible default, a registry of alternatives, and a slot for your own function, and each one is recorded in provenance so the result stays auditable.
Fundamentals are where we start. The same approach (original source, every version, exact knowledge time) works for every disclosure a listed company makes and every dataset a market moves on.
NSE, BSE and regulatory registries, back to the earliest disclosures. Old scanned filings get extracted by vision models and held to the same accounting checks.
Results, shareholding, insider trades, takeovers, board meetings, credit ratings and annual reports, all on one bitemporal timeline.
Government and regulator data such as trade flows, prices, power and credit, with each revision kept, so macro signals line up with company data in time.
Data is delivered to nodes on the client's own infrastructure. Their research, their own datasets and their broker feed never leave their walls.
Every table is a sealed, versioned pipeline that you can refresh, roll back and audit, then pull straight into Python, Excel or a production system.
Built on top language models. Ask questions in plain language. The model writes the query and the engine computes the answer, with every cell traceable to its source.
The name comes from the lambda, the anonymous function. Lamda shouldn't limit what its users can do. We want an unopinionated surface over trustworthy data, not another canned screener. Guardrails exist only where a number would otherwise be silently wrong.