Verdict

52-week-high anchoring

By Thomas Jamais (Backtestd) · Published · Updated

Not proven
832versions tested
1%lost money after costs
+0.34typical version, R per trade
+2.76best version, R per trade

Does 52-week-high anchoring work?

Not proven: it passed some checks, not all of them. We coded the rule, tested 832 versions of it on 24 markets from 2022 to 2025, fees, slippage and funding included. 1% of the versions lost money. The best version still beat the market on older data (2020–2022), but one good period is not proof.

Key facts

Versions tested832
Markets24
Period2022-11-10 → 2025-07-09
Candles1h
Costsfees, slippage and funding on every trade
Versions that lost money1%
VerdictNot proven

In short

We coded the rule, tested 832 versions of it on 24 markets from 2022 to 2025, fees, slippage and funding included. 1% of the versions lost money. The best version still beat the market on older data (2020–2022), but one good period is not proof.

The rule people share

As it is usually explained:

Buy coins trading close to their yearly high: traders anchor on it and under-react to the breakout.

Explained: the terms

  1. The 52-week high — This line is the highest price of the past twelve months.
  2. Traders anchor on it — Many traders anchor on it and wait. The theory: they react late.
  3. Close to it: buy — So when a coin trades close to its yearly high, you buy, before the breakout.

How we tested it

Read the full method →

Data

1h candles of 24 markets (APR, ARB, BAT, BTC, BZ, DOGE, ETH, FIL, HYPE, NEAR, PEPE, PUMP, QQQ, SOL, SPY, STRK, SUI, TIA, UNI, WLD, XAG, XAU, XRP, ZEC), from 2022-11-10 to 2025-07-09. Crypto prices come from OKX perpetual futures; the 2020–2022 check uses Binance's public archive (median price gap to OKX: 0.06%). US index data comes from HistData.

Costs

Every trade pays a 0.05% taker fee per side, 2–5 basis points of slippage per side, and funding every 8 hours at each market's measured average rate. Results are in R: 1 R is the amount risked on one trade (entry to stop), so strategies with different stops compare fairly.

Versions

A rule shared online is never fully specified (which stop? which holding time? which timeframe?). So we test every reasonable reading: each combination of the settings below is one version.

Two halves

The data is split in two halves (a rising market, then a flatter one). A real edge should work in both.

Against the market

A long trade in a rising market makes money without any skill. We subtract what simply holding the crypto market (an equal-weight basket) on the same side over the same days would have made: what remains is what the rule adds.

Older data, never seen

The best version is then run, unchanged, on 2020–2022 data that played no part in choosing it (a crash, a bull market and a bear market).

Results

All 832 versions

−1 R0+1 R

Each bar counts versions by their average result per trade after costs (clipped to ±1 R). Green: made money; red: lost money.

The best of 832 versions

65 trades, 42% winners, +2.760 R per trade on average, +179.4 R in total, worst drawdown −16.5 R.

Cumulative result after costs, trade after trade (dashed line: start of the second half).

Why “the best version” misleads

With 832 versions, some look good by luck alone. The typical version made +0.339 R per trade; the best made +2.760. If the rule had no edge at all, the spread of results would look like this anyway: the best of many random tries always looks impressive. That is why we never trust the best version until it works on data it was not chosen on.

Verify it yourself

  1. Write the rule exactly (below: our specification and every setting we tried).
  2. Get free data: Binance's public archive (data.binance.vision) has years of candles; OKX and most exchanges offer an API.
  3. Include costs: fees on both sides, slippage, and funding for perpetual futures.
  4. Count results in R (risk per trade), not in %, and look at the typical version, not the best one.
  5. Split your data in two and keep a part you never look at until the end.
  6. Compare with simply holding the market over the same days.

Our exact specification (the lab's own words, in English)

52-week-high anchoring: long coins that come close to their yearly high, short coins far below it.

What it does: once a day (on the 15m candle that closes at 00:00 UTC) it computes "nearness" =
close / highest high of the past `lookback` bars (52 weeks). When nearness freshly rises to
`near_thr` or above (the coin has climbed back to within 10% of its yearly high) it goes long;
when it freshly falls to `far_thr` or below (the coin is at half its yearly high or less) it goes
short. far_thr = 0 switches the short leg off. Stop at stop_mult x the average daily range (14
days), no target, time stop after hold_bars (1 week = the paper's weekly rebalance).

Source: Jia, Simkins, Yan, Zhang & Zhao, "Psychological Anchoring Effect and Cross Section of
Cryptocurrency Returns", SSRN 5386180 (https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5386180),
summarised by Quantpedia. Nearness to the 52-week high is positively related to next-week crypto
returns; a weekly long-high/short-low portfolio earned ~130 bps a week. Economic reason (George &
Hwang 2004 for stocks): traders anchor on the old high and are slow to price good news near it, so
coins near the high under-react and keep drifting up, and coins far below it keep lagging.

Adaptation: the paper ranks coins against each other each week; we trade one coin at a time, so
fixed nearness thresholds replace the cross-sectional sort. The rolling high needs only 60 days of
history to start (min_periods), so new listings and the synthetic check get signals; until a year
of data exists the "52-week" high is the high of all available history. Entries are fresh threshold
crosses, evaluated daily. Different from breakout_20d / donchian_breakout: no new high is needed
(entry is up to 10% below a one-year high, not a cross of a 4- or 20-day channel), and the short
leg trades distance from the high, not a channel low - so shorts get their own test (open question
in KNOWLEDGE.md).

Settings tried

SettingValues
lookback17280, 35040, 8640
near_thr0.8, 0.85, 0.9, 0.95
far_thr0.0, 0.4, 0.6
stop_mult2.0, 3.0
hold_bars1343, 2687, 671
timeframe1d, 1h, 4h
entry_modeat_stop, market, pullback
entry_stop0.25, 0.5, 1
entry_wait3
exit_scale—, 1:0.33,2:0.33, 1:0.5
exit_scale_be0, 1
entry_pull0.25, 0.5
avg_down0, 2
avg_stop0.5, 1, 2
avg_exitbreakeven, strategy
sent_weight0, 0.5, 1
sent_modecontrarian, follow
sent_block0, 0.5
sessionany, asia, london, london_ny, ny, outside

Settings of the version shown

lookback17280
near_thr0.8
far_thr0.0
stop_mult2.0
hold_bars2687
sent_block0.5
sent_modefollow
sent_weight1
sessionoutside
timeframe1h

Download every trade of the version shown (CSV, 65 rows)

Limitations

Questions

Did you include fees?

Yes: fees, slippage and funding on every trade, from real exchange schedules.

Maybe it works on another timeframe?

We tested several timeframes and holding times: see “Settings tried”. The result does not depend on one choice.

Maybe it works with better risk management?

We tried stops of different widths, targets, trailing stops and partial exits. Risk management changes the shape of the results, not the sign of the edge.

Why should I trust you?

You should not: verify. The rule, every setting and every trade are on this page.

Does this mean nobody makes money with it?

Some traders will, by skill elsewhere or by luck. This test only says the rule itself does not give an edge after costs.

Disclaimer

Educational content based on historical backtests. Not financial advice. Past results do not predict future results. Trading leveraged products can lose more than you invest.

More tests

Fair value gap (FVG)
772 · No edge after costs
→
Moving-average trend following
1249 · No edge after costs
→
New York open · 12 EMA on Nasdaq
28 · No edge after costs
→

← All tests