Skip to content

Platform, in depth

The mechanics, in full.

For readers who want the statistics behind each step. Every section here expands a step on the Platform page, and every method named is in the code today.

Features

Plain transformations of the data, with as few assumptions baked in as possible.

Data first, assumptions last.

A feature starts as the data itself and a plain transformation of it: a level, a first difference (how fast it is changing), a second difference (whether that change is speeding up or slowing down), a z-score against its own recent history, a moving average, a ratio, a rank. Each choice is made to carry as little implied or explicit assumption as possible about what a good setup looks like.

Features, not factors.

Much of the industry calls these measurements alpha factors. We call them features and keep the word factor for common forces that move many securities at once. What gets tested is a predictor: a registered rule, often built on features, that scores every security with its direction fixed in advance, its memory declared, and nothing fitted.

Atomic, and most of the set.

These atomic features are computed on every bar of every security, whether or not anyone expects them to matter, and they make up most of what is measured. The data decides which ones predict; nothing is included because a story says it should work.

Interactions are a second tier, and state their hypothesis.

A feature that combines atomic measurements, such as a calendar position conditioned on a session event, has to say in advance why the combination should matter. A combination without a stated reason is a fitted pattern, not a feature.

Theory-laden features are a third tier, kept visible.

Some features assume a theory, such as the idea that support and resistance levels mean something. They are kept in their own tier so their assumption is visible, and they earn weight on exactly the same evidence as an atomic measure.

Time as coordinates, not turning points.

Cyclical calendar features are encoded as sine and cosine pairs over the day, week, month, quarter, and year, so no turning point in the cycle is assumed. Linear positions are fractions of their period.

Declared memory, masked warm-up.

Every feature declares how much history it reads. Until that much history exists, its value is missing, never a partial estimate that looks like a real one.

The factor model

What is left after the market, the peer group, and the common factors are taken out.

Leave one out.

Every factor a security is measured against is built from the other securities only. Its own return never sits inside the benchmark it is compared with, so a strong move cannot partly explain itself away.

Peer groups from prices, not labels.

Groups are re-formed at every refit by clustering securities on the correlation of their market-residual returns. No sector label enters, so the grouping uses only what the prices knew at the time.

Principal components of what remains.

After the market and the group are removed, the leading principal components of the remaining correlation become further factors. Each is a portfolio of the other securities' raw returns, so it is a return that could have been held.

Intraday beta by time of day.

A security's sensitivity to the market changes through the session. Intraday, market beta is estimated separately for each time-of-day slot, because one pooled beta would leave a slot-shaped market exposure in every residual that later reads as a pattern.

Loadings never see the target.

Loadings are refit on a rolling window that stops before any return still inside the forward window being predicted, so no target ever helps estimate the factors it is measured against.

Drift stays in.

Each regression estimates an intercept but never subtracts it. A security's own drift stays in its residual, so it cannot be mistaken for a factor exposure and quietly removed.

Market forces are measured, not removed.

Separately, each instrument's sensitivity to broad forces, such as equities, rates, credit, inflation, the yield curve, oil, and volatility, is measured against long-short factor series built from proxy instruments. Each loading is standardized and carries a Newey-West standard error, and the result is stored as a tag that is recalibrated as the data changes.

Pinned before the data.

The factor specification is fixed before any candidate is measured. Changing it is a methodology change, recorded as one, not a tuning step.

Measuring prediction

Rank correlation on returns that could have been traded, read as a curve, with honest intervals.

Executable returns only.

Targets run from one opening price to a later one. A close-to-close return includes the overnight gap, which nobody could have traded on the signal, and it overstates prediction. Intraday targets stay inside the session.

Dividends known or unknown, never assumed.

Where a hold crosses a session, the target is a total return. Outside the span where dividends are recorded, a dividend is unknown, not zero.

The IC term structure.

A measure is correlated with the residual return one bar ahead, two bars ahead, and onward, and the whole curve is read against a joint null band. The shape shows how long a measure stays informative and where it fades.

Intervals that respect dependence.

Market data repeats itself, so resampling single observations understates uncertainty. Confidence intervals come from a circular block bootstrap that resamples whole stretches of time.

Regimes

A label for the kind of market, assigned without looking ahead.

Walk-forward hidden Markov models.

Each security's volatility regime comes from a Gaussian hidden Markov model refit at fixed boundaries, each fit using only the observations before its boundary. The number of states is chosen by BIC, not by preference.

Forward filtering, never Viterbi.

The most likely state path (Viterbi) is computed from the whole sequence, including bars that had not happened yet. States are decoded with the forward filter alone, so each label uses only the past.

A market regime alongside.

A separate cross-sectional regime for each peer group is built from implied volatility and breadth, so a measure can be read against the state of its own security and of its market.

New axes must earn their place.

A proposed regime axis must first pass the same test on scrambled data, then sharpen IC beyond what the volatility regime already explains. Most candidates do not.

The book test

One statistic decides, and it was chosen for the way market data misbehaves.

Timing, not tilt.

For each session, the tested series is the book's profit against returns net of the average that each security and time of day earned in earlier sessions. Only sessions older than the signal's memory enter that average, so the benchmark and the signal share no inputs, and a book that merely leans one way scores zero.

A Newey-West t-test.

Each session's result depends on recent sessions, which makes an ordinary t-test overconfident. The decision is a one-sided t-test with a heteroskedasticity and autocorrelation consistent (Newey-West) standard error, Bartlett kernel, and a lag set by rule from the sample size.

Costs outside the statistic, inside the decision.

Trading costs never enter the test statistic, so a cost assumption cannot manufacture significance. Promotion separately requires a positive expected result after costs.

Testing the tests

A statistic is trusted only after it has failed to find edge where none exists, and found it where it does.

A battery of null markets.

The decision statistic is run on synthetic markets with no predictability at all: fat-tailed noise, volatility clustering, a time-of-day effect, a common factor, static per-security means, and securities that list partway through. Its false-positive rate has to hold at every threshold used.

Power before a test is spent.

Before a book is tested, a signal of the size it claims is planted in synthetic data and scored by exactly the real test. If the test would not usually find it, the test is not run, so a negative result means something.

Conditions checked, not assumed.

The null battery holds only within a range of static effects. Each family's own static effects are measured on the data it will be scored on, and a family outside the validated range is refused.

Leakage probes

Every signal is tested for looking ahead before it is allowed to produce evidence.

The future is replaced, and nothing may change.

Every row after a point is replaced, once with blanks and once with random per-cell rescaling, and the signal's output up to that point must be bit-identical. A uniform rescale would hide a leak built from a ratio of future prices, so the rescale is random.

Declared memory is checked.

Each signal declares how far back it reads. A one-bar price shock must move its output no further ahead than that declared memory.

An embargo between fit and prediction.

Wherever a model is fit walk-forward, a gap the length of the forward return separates the last training row from the first prediction, so no target the fit has seen overlaps what it predicts.

A failed probe is a verdict.

A signal that fails a probe produces no evidence, and the failure is recorded against it. A mistake in calling the probe is a separate error, so a bug in the harness never counts against an idea.

The combiner

The simplest combination that the evidence supports.

Equal weight by default.

A new book averages its members' standardized forecasts with signs fixed at registration, and nothing is fitted. At the small ICs real signals have, estimation noise in fitted weights can cost more than the weights gain.

Ridge as a separate, counted version.

A walk-forward ridge combiner pools one coefficient vector across securities, standardizes members on each fold's training data only, and leaves an embargo before every prediction. It is tested as its own book version and counted as another look.

Complete cases only.

A row enters training only when the target and every member are present, and a prediction is blank where any member is blank. Nothing is filled.

The registries

Every setting, idea, and claim about an instrument lives in a governed table, never in code.

The parameter registry.

Every threshold, weight, period, and random seed is a versioned row with its provenance: a first estimate, a convention, a root-cause analysis, or an owner's choice. Each change records who made it and why, and is read as it stood on the date being studied. A number hard-coded in the platform is an architecture violation.

The concept registry.

Every feature and research idea moves through one lifecycle: candidate, shadow, active, deprecated. A single service changes status, and only on measured evidence; no model, agent, or proposer can override it. A deprecated feature keeps being measured, so a measure that fades in one kind of market can return in another.

Instrument tags.

What an instrument is and how it behaves is stored as a tag: a claim that can be tested, with its evidence, never a hard-coded list of symbols. Measured tags are recalibrated as the data changes; tags set by a person are never overwritten by the calibrator.

A classification of our own.

Asset class, sector, industry group, and industry form one tree, assigned by us with a source for each decision. It is append-only: a reclassification closes the old record and opens a new one, so any date can be read as it stood.

One word, one meaning.

Valid codes live in a controlled vocabulary, and every domain term has exactly one definition in a glossary. A check before every commit blocks retired terms from returning.

Reproducibility

A result is a recipe, and the recipe is kept.

Bit-identical, checked.

A result is identified by the hash of its data snapshot, its code, and its specification. After any change to the research or statistics code, recorded results are rebuilt and must match bit for bit.

A methodology change ledger.

Every change to how evidence is judged, from the test statistic to how looks are counted, is written down with its reason before it applies. The rules cannot drift quietly toward a result someone wanted.