Markets: A Rigorous Course

4A.2 Support and resistance

Foundation about 15 min

Motivation

"Support" and "resistance" are prices where a fall or a rise has stopped before and is expected to stop again. As folklore this is unfalsifiable: any level eventually breaks and any level is sometimes respected. As a definition plus a null hypothesis it becomes testable, and there is one serious body of evidence (in foreign exchange) explaining why such levels can matter.

4A.2.1Defining a level#

Definition 4A.3swing pivots, confirmed

With half-width k≥1k\ge1, bar uu is a swing high if Hu>Hu−jH_u>H_{u-j} and Hu>Hu+jH_u>H_{u+j} for j=1,…,kj=1,\dots,k, and a swing low if Lu<Lu−jL_u<L_{u-j} and Lu<Lu+jL_u<L_{u+j} for j=1,…,kj=1,\dots,k. A swing pivot at uu is known only at bar u+ku+k, its confirmation bar. (M04 · 4.1.2 flags marking pivots at uu as the commonest look-ahead bug in pattern code.)

Definition 4A.4level

Fix a tolerance ϵ>0\epsilon>0 in price units, typically a fraction of ATR (4A.7). At bar tt, collect the prices of all pivots confirmed by tt within a look-back window. Sort them and split the sorted list wherever two neighbours differ by more than ϵ\epsilon (single-linkage clustering). Each cluster is a level; its price is the cluster mean and its strength the number of pivots in it. Variants weight pivots by the volume traded near them (a volume-at-price or volume profile level) or by recency.

This definition is computable (m04a_levels.levels_asof), has no look-ahead, and has three parameters (kk, ϵ\epsilon, look-back). Each parameter you tune is another trial in the sense of M04 · 4.6.

4A.2.2Levels under the null#

What a random walk does near a level Before asking whether levels "work", compute what they do when nothing is there.

Proposition 4A.2touches and bounces under the null

Let the log price be xt=x0+σWtx_t=x_0+\sigma W_t with σ>0\sigma>0, and let a level sit at distance δ>0\delta>0 above x0x_0.

(a) The probability that the price touches the level within time TT is 2Φ ⁣(−δ/(σT))2\Phi\!\big(-\delta/(\sigma\sqrt T)\big).

(b) Conditional on a touch at the stopping time τδ\tau_\delta, for any h>0h>0 the probability that the price next falls by hh (a "rejection") before rising by hh (a "break") is exactly 12\tfrac12.

Proof

(a) Reflection principle: for m>0m>0, P(max⁡s≤TWs≥m)=2P(WT≥m)P(\max_{s\le T}W_s\ge m)=2P(W_T\ge m). Put m=δ/σm=\delta/\sigma. (b) τδ\tau_\delta is a stopping time, so by the strong Markov property (Wτδ+s−Wτδ)s≥0(W_{\tau_\delta+s}-W_{\tau_\delta})_{s\ge0} is a standard Brownian motion independent of Fτδ\mathcal F_{\tau_\delta}. For a driftless Brownian motion started at 0, the probability of hitting −h-h before +h+h is 12\tfrac12 (Proposition 4A.6 below with a=b=ha=b=h).∎

Worked example 4A.1how often a round number gets "tested"

Nifty at 24,000, resistance claimed at the round number 24,500, daily volatility 1%. Then δ=ln⁡(24,500/24,000)=2.06%\delta=\ln(24{,}500/24{,}000)=2.06\%, and the probability of touching 24,500 within 10 trading days under a driftless random walk is 2Φ(−0.0206/(0.0110))=2Φ(−0.652)=0.5142\Phi(-0.0206/(0.01\sqrt{10}))=2\Phi(-0.652)=0.514. Half the time the level is "tested" within two weeks, and by (b), each test is a fair coin between "resistance held" and "breakout". A chart book full of levels that held is therefore no evidence: you must count the tests that failed, at levels chosen before the fact.

4A.2.3Evidence and mechanism#

The evidence

  • Osler (2000), "Support for resistance: technical analysis and intraday exchange rates", Federal Reserve Bank of New York Economic Policy Review 6(2), 53–68. She took support and resistance levels that six firms published to their customers for the major currency pairs, and compared intraday exchange-rate behaviour at those levels with behaviour at 10,000 sets of artificial levels chosen at random. Published levels predicted intraday trend interruptions better than the random levels, the effect persisted for at least five business days after publication, and it varied across currencies and firms. The design is exactly Proposition 4A.2(b) turned into a test: compare the bounce rate at claimed levels with the bounce rate at arbitrary levels.
  • Osler (2003), "Currency orders and exchange rate dynamics: an explanation for the predictive success of technical analysis", Journal of Finance 58(5), 1791–1819. Using about 9,700 stop-loss and take-profit orders at a large dealing bank (September 1999 to April 2000), she found that take-profit orders cluster at round numbers, and stop-loss orders cluster just beyond round numbers. Clustered take-profit orders are liquidity that absorbs a move, so trends tend to stall at round numbers; clustered stops are market orders that fire once a level is crossed, so moves accelerate after a break. These are the two chartist predictions, given a microstructure mechanism.
  • Kavajecz and Odders-White (2004), "Technical analysis and liquidity provision", Review of Financial Studies 17(4), 1043–1071, find on NYSE limit-order-book data that support and resistance levels coincide with peaks in book depth. Technical levels are partly a map of where resting liquidity sits.

A minimal mechanism Suppose resting sell orders of total size DD sit at level ℓ\ell, and net market buying arrives as a Brownian order flow. The price stops at ℓ\ell until the cumulative net buying since arrival exceeds DD. If net order flow is a driftless Brownian motion with variance η2\eta^2 per unit time, the time spent pinned at ℓ\ell before a break has the law of the first passage of that flow to DD, which is heavy-tailed (density ∝t−3/2\propto t^{-3/2}, mean infinite). Depth turns a level into a place where price lingers, without any predictive content about the direction of the eventual exit. That is the logic of Proposition 4A.2(b) again, and it is why the clustering evidence predicts stalling and acceleration, not reversal.

Practitioner notes

  • The Osler mechanism needs a reason for orders to cluster at a price: round numbers, the prior day's high and low, the opening range, a published level, a big option strike (M09A discusses pinning at option strikes on expiry day). Prefer levels with a mechanism to levels found by eye.
  • Stops "just beyond" an obvious level are exactly where other traders' stops sit. A stop placed at 24,495 under support at 24,500 sits in the cluster that accelerates the break. Place stops where the thesis is wrong, at a distance set by volatility (4A.7), not at the most popular price.
  • Test a level rule as Osler did: fix the level-generating algorithm in advance, compute the bounce rate at its levels and at random levels with the same distance distribution, and bootstrap the difference. Problem 4A.16 sizes such a test.

Create a free account

Reading is open to everyone. An account keeps your progress, answers, notes and code drafts, and gives you the study plan, the journals and the simulator. Running code needs an account approved for it.