The Analyst's Path

Low-volatility anomaly

Standard asset-pricing logic says riskier assets should earn more, on average, to compensate investors for bearing more risk. Ang, Hodrick, Xing, and Zhang (2006) documented a genuine puzzle running the other way: stocks with high idiosyncratic volatility have historically earned lower, not higher, average returns, the low-volatility anomaly. Baker, Bradley, and Wurgler (2011) offered one leading explanation: benchmark-relative mandates and leverage constraints push many real-world investors away from calm, "boring" names and toward volatile, lottery-like ones, bidding the volatile ones up (and their subsequent returns down) beyond what their true risk warrants.

4 min readPart of Signal & Factor Construction and EvaluationOpen in course mode

Advertisement

Standard asset-pricing logic says riskier assets should earn more, on average, to compensate investors for bearing more risk. Ang, Hodrick, Xing, and Zhang (2006) documented a genuine puzzle running the other way: stocks with high idiosyncratic volatility have historically earned lower, not higher, average returns, the low-volatility anomaly. Baker, Bradley, and Wurgler (2011) offered one leading explanation: benchmark-relative mandates and leverage constraints push many real-world investors away from calm, "boring" names and toward volatile, lottery-like ones, bidding the volatile ones up (and their subsequent returns down) beyond what their true risk warrants.

How is the low-volatility factor built?

The construction here is a trailing 60-trading-day annualized realized volatility of daily returns (the population standard deviation of the last 60 daily returns, scaled by √252 to annualize) with the sign flipped so that a low-volatility name earns a high score (a low-vol factor, not a raw volatility measure). Same four names, same as-of date: BRPEAK's trailing 60-day volatility is 34.4% annualized (low-vol score −0.3444, the calmest of this module's four running names is actually CRSTNE at 29.3%, so BRPEAK ranks as the more turbulent of the pair); NILAM sits at 25.7% (score −0.2574), calmer than CHANDANI's 25.8% by a hair. QD1.02-e04 grades realized_vol against the same real 61-close slices used for momentum (R6).

Advertisement

{
  "skill": "Drafting a signal-construction function (a ratio, a rolling statistic, a composite) with an AI coding assistant, without absorbing a hallucinated column or a silently backwards sign",
  "use": "Once you can state, in your own words, exactly which raw fields a signal needs and the precise formula that combines them (as sections 2-5 of this module do for each of the four), use an AI assistant to draft the function's implementation -- vectorized pandas, a clean loop, whatever the target runtime allows -- and treat the draft exactly as unverified as any other plausible-sounding claim.",
  "tools": ["AI coding assistants -- Claude, ChatGPT, GitHub Copilot, Cursor", "This module's code pack's own hidden tests, as the actual arbiter", "A tiny hand-built example (4-5 names) you can check with a calculator, before trusting the assistant's output on a real cross-section"],
  "prompt": "Write a Python function `<NAME>(<ARGS>)` that computes <PRECISE FORMULA IN YOUR OWN WORDS, e.g. 'the cross-sectional z-score of each value in the dict raw, using the population standard deviation (ddof=0), then clip each z-score to +/- winsor_limit'>. Use only the stdlib (no numpy/pandas) unless I say otherwise. Do not invent a library function I have not named.",
  "verify": "Run the draft against a tiny, hand-built input (3-5 names) whose correct answer you compute yourself with a calculator first -- an assistant can confidently use the WRONG standard deviation convention (sample ddof=1 instead of population ddof=0), silently invert a sign (leverage or volatility, where lower is supposed to be better), or reach for a library function that does not exist in the target runtime. Only after the tiny case matches exactly do you run it against this module's real hidden tests.",
  "diy": "You must already be able to state the formula precisely enough to write the prompt above without the assistant guessing at it for you -- that is exactly what sections 2-5 build. If you cannot say 'z-score with population standard deviation, sign-flipped for leverage and stability' out loud, you are not ready to accelerate this step yet.",
  "market": "US"
}

Advertisement

Part of the course

This page is part of Signal & Factor Construction and Evaluation (QD1.02), in Phase 12: Finance Plus, AI and the quant-code track. The module's flashcards and its quiz are in the app.