Strasmore Research
Learn · Matt ConnorBy Matt Connor · · Updated 2026-07-25

Low-volatility anomaly: risk no dey pay steady

We match two years of realized volatility against return for 25 large-cap stocks. The relationship come out loose and noisy, no be the tidy line wey textbook draw.

Finance theory talk say investor wey accept more risk suppose collect more return for carrying am. The low-volatility anomaly na the long-running observation wey show say dis one no always hold. For many stretches of market history, calmer stocks don keep pace with or beat wilder ones while dem dey put their holders through far smaller swings. Dis post line up realized volatility against total return for 25 large, familiar stocks over roughly the past two years, and the relationship come out loose and noisy instead of the tidy upward line wey the textbook draw.

Wetin the low-volatility anomaly be

Volatility here mean annualized volatility: the standard deviation of a stock daily returns, scaled up to a yearly figure. A number near 16% dey calm for a stock, and a figure above 50% mark a name wey dey routinely move several percent in a day. The Capital Asset Pricing Model, the framework wey dem dey teach for every finance course, predict a straight upward line, where higher volatility dey earn higher expected return.

Decades of academic work find the opposite tilt. Low-volatility portfolios don historically deliver returns wey dey comparable to, and sometimes better than, high-volatility ones, at a fraction of the risk. That gap between the theory and the record na the anomaly. E be one of the most-studied patterns for markets, and e sit behind the "min-vol" and "low-vol" funds wey dem dey sell today.

Volatility against return, stock by stock

The chart below take 25 household large caps, compute each one annualized volatility and im total return over the same window, and sort dem from calmest to wildest. If the textbook hold, the return bars go climb in step with the volatility bars from left to right.

QueryAnnualized volatility vs total return, 25 large caps, from calmest to wildest (~2 years)
The exact SQL behind every number
WITH d AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','KO','JNJ','PG','PEP','WMT','MCD','MO','VZ','XOM','JPM','HD','COST','UNH','MRK','LLY','HON','LMT','CAT','TXN','ORCL','NVDA','TSLA','AMD','NFLX')
      AND window_start >= now() - INTERVAL 800 DAY
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
r AS (
    SELECT ticker, dt, c,
           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM d
)
SELECT ticker,
       round(stddevSamp(ret) * sqrt(252) * 100, 1) AS annual_vol_pct,
       round((exp(sum(log(1 + ret))) - 1) * 100, 1) AS total_return_pct
FROM r
WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5
GROUP BY ticker
ORDER BY annual_vol_pct

Dem no do so. The calmest name for the set na the S&P 500 imself, ticker SPY, at 16% annualized volatility for a 42.8% total return. As you dey read across, some of the calmest single stocks post strong gains while several of the most volatile names land near flat or for red. The return bars scatter. Dem no track the volatility bars for any straight-line way, wey be the anomaly for one picture: the extra volatility for right no buy a dependable step up in return.

Wetin the extra volatility actually buy

Grouping the 25 names into thirds by volatility sharpen the point. Each third get a median return and a range from im worst performer to im best, so the spread of outcomes dey visible next to the average.

QueryVolatility thirds: median return, and di range from worst to best name for each
The exact SQL behind every number
WITH d AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','KO','JNJ','PG','PEP','WMT','MCD','MO','VZ','XOM','JPM','HD','COST','UNH','MRK','LLY','HON','LMT','CAT','TXN','ORCL','NVDA','TSLA','AMD','NFLX')
      AND window_start >= now() - INTERVAL 800 DAY
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
r AS (
    SELECT ticker, dt,
           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM d
),
pername AS (
    SELECT ticker,
           stddevSamp(ret) * sqrt(252) * 100 AS vol,
           (exp(sum(log(1 + ret))) - 1) * 100 AS tr
    FROM r
    WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5
    GROUP BY ticker
),
ranked AS (
    SELECT ticker, vol, tr, ntile(3) OVER (ORDER BY vol) AS bucket FROM pername
)
SELECT multiIf(bucket = 1, '1. Calmest third', bucket = 2, '2. Middle third', '3. Wildest third') AS vol_group,
       round(median(vol), 1) AS median_vol_pct,
       round(median(tr), 1) AS median_return_pct,
       round(min(tr), 1) AS worst_return_pct,
       round(max(tr), 1) AS best_return_pct,
       round(max(tr) - min(tr), 0) AS range_pct
FROM ranked
GROUP BY bucket
ORDER BY bucket

Over dis particular window the wildest third post the highest median return, 87.1% against 20.6% for the calmest third. That one dey honest, and e matter. A two-year window dey short, and the past two years reward a handful of large, volatile technology and momentum names. Wetin the wildest third also buy na dispersion. Im returns run from -15.8% to +223.3%, a spread of 239 percentage points. The calmest third fit inside a spread of 92 points. High volatility widen the cone of outcomes far more than e lift the center of am. An investor for the wild group get a real shot at the best return for the table and an equally real shot at the worst.

The path matter as much as the endpoint

A single total-return number hide the ride. Tracking $100 wey dem invest at the start of the window through each week show wetin volatility dey feel like to hold.

QueryGrowth of $100: one calm name (KO), di market (SPY), one wild name (NVDA), weekly
The exact SQL behind every number
WITH d AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('KO','SPY','NVDA')
      AND window_start >= now() - INTERVAL 800 DAY
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
r AS (
    SELECT ticker, dt,
           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM d
),
f AS (
    SELECT ticker, dt, ret FROM r WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5
),
cum AS (
    SELECT ticker, dt,
           100 * exp(sum(log(1 + ret)) OVER (PARTITION BY ticker ORDER BY dt)) AS idx
    FROM f
),
wk AS (
    SELECT ticker, toMonday(dt) AS week, argMax(idx, dt) AS wv
    FROM cum GROUP BY ticker, week
)
SELECT week,
       round(maxIf(wv, ticker = 'KO'), 1) AS ko_calm,
       round(maxIf(wv, ticker = 'SPY'), 1) AS spy_market,
       round(maxIf(wv, ticker = 'NVDA'), 1) AS nvda_wild
FROM wk
GROUP BY week
ORDER BY week

The calm stock here na Coca-Cola (KO), the wild one na Nvidia (NVDA), and the middle line na the market. By the last week, $100 for KO don grow to $129.9, the S&P 500 to $142.8, and NVDA to $226.8. NVDA win the window and do am on a visibly jagged path, dey give back double-digit percentages more than once along the way. KO trail both other lines while e barely wobble. Neither outcome fit the textbook. The calm name no beat the market dis time, and the volatile name pay off in spite of the anomaly, no be in line with am. That na the texture of a short window. The anomaly na a tendency wey dem measure over decades, no be a promise about any two-year stretch.

Why the anomaly dey real but no be a law

The strongest version of the low-vol finding dey modest: over long horizons, buying calmer stocks no don cost investors return, and e don sharply cut their risk. E be a statement about averages across thousands of names and many years, no be a rule wey dey govern 25 stocks over 24 months. Windows like dis one, where volatile momentum names run hard, na exactly why dem dey call the pattern an anomaly instead of a law. For a fuller look at which large caps don actually be calmest, see the calmest large-cap stocks. The flip side, holding a few big volatile winners, carry im own concentration risk, and the temperament wey the anomaly reward sit close to the one behind buying when others dey fear.

FAQ

Wetin be the low-volatility anomaly?

E be the long-observed pattern wey show say low-volatility stocks don earn returns as high as, or higher than, high-volatility stocks over long horizons, at much lower risk. That one run against the textbook prediction wey talk say more risk dey earn more return.

Low-volatility stocks really dey beat high-volatility stocks?

Over multi-decade samples the research find say dem roughly match or beat dem on a risk-adjusted basis. Over any short window the result fit flip. For the two-year window wey dem measure here the most volatile third of names post the highest median return, with by far the widest range of outcomes.

Low-volatility investing be a good strategy?

Low-volatility investing don historically cut risk without sacrificing much return, na why "min-vol" funds dey exist. E no be a guarantee of outperformance for any given year, and e fit lag sharply when speculative names lead.

How dem dey measure stock volatility?

The common measure na annualized volatility: the standard deviation of daily percentage returns, multiplied by the square root of 252 (the number of trading days for a year). A higher figure mean larger typical daily moves for either direction.


Every panel above na a stored, inspectable query. Open the SQL under any chart to check the math, or run the same volatility-versus-return test on your own basket of names for the Strasmore terminal.