Quantest

Beta is not one number

The same 517 stocks, the same benchmark, the same year. Measured daily and weekly, the two betas correlate only 0.757.


the Quantest journal

A late-19th-century Japanese woodblock print of the Dōjima rice exchange in Osaka.
The Dōjima rice exchange, Osaka, by Yoshimitsu Sasaki, c.1880.Public domain

Two numbers, one name

We compute beta for every stock in our universe against a single index benchmark over a trailing year. Computed on daily returns and on weekly returns, over the same period and the same 517 symbols, the two series correlate just 0.757 and differ by 0.242 on average.

Update, 4 November 2026. The product now publishes the daily figure only, measured against the NIFTY 50. The finding below is what settled that: two numbers under one name is a choice a reader has to make, and asking it of them on a filter bar bought nothing we could measure. The frequency is still stored beside every figure, for the reason this piece gives.

The ranges are not the same either. Daily beta spans −0.14 to 1.96 over roughly 248 observations; weekly spans −0.35 to 2.78 over about 52. A screen for “high beta, above 1.2” returns a materially different list depending on which one you meant.

Beta: one stock, two frequencies517 symbols
Daily1.31
Weekly1.07
Correlation across the universe0.757
Mean absolute difference0.242
The same stock, the same benchmark, the same year. The frequency is part of the figure’s identity, not a detail.

So we store both, and key on the frequency

A stored beta with no frequency beside it does not identify a set of stocks. Our table is keyed on the symbol, the benchmark and the frequency, and both are written on every run. The screens that filter on beta make you choose, and the results table shows the figure it actually acted on.

A consequence worth stating: the minimum observation count has to be expressed in each frequency's own unit. A threshold of 200 observations is reasonable for daily returns and rejects every stock in existence on weekly ones, where it reads on screen as “no stocks qualify”.

One beta, or the app contradicts itself

Before this, beta was computed on the fly in two places against two different benchmarks. One screen used an equal-weighted basket of index constituents; another used the index itself. They correlate 0.9675, which sounds like agreement, but the index version runs about 9% higher across the board, because an equal-weighted basket is more volatile than a cap-weighted index and a larger denominator shrinks every beta.

At a 1.2 cut-off that is 204 high-beta names against the basket's 139. Two screens in the same product would have disagreed about which stocks were high beta. Everything now reads one stored table, written by one job.

Alert conditionsprice, pattern, chain, index
Price crosses levelin-app, email
Chart pattern confirmedin-app, email
Candle pattern confirmedin-app, email
Option-chain PCR thresholdin-app, email
Index moves beyond 2 sigmain-app, email
Every condition is edge-triggered, so one that stays true does not mail you on every pass.

And the filter excludes what it does not know

A symbol with no stored beta is dropped by the filter rather than passed through. Letting it through is tempting and wrong: until the beta job has run, that is every symbol, and the control would look like it was working in the one direction nobody checks.

Read next

Never draw a pattern across a missing bar