Skip to content

Price Momentum: 52-Week High Breakout (US Market)

This page introduces two momentum strategies based on stocks making new price highs, applied to the US equity market.

New High Breakout Strategy

Select stocks whose closing price has reached a new 200-day high. The portfolio rebalances every two weeks, with a maximum position size of 20% per stock and a 20% stop-loss.

from finlab import data
from finlab.backtest import sim
from finlab.market import USMarket

data.set_market('us')

close = data.get('price:adj_close')
close = close[close.index.dayofweek < 5]  # remove weekends

# Stock price at 200-day high
position = (close == close.rolling(200).max())

# Biweekly rebalancing, 20% max position per stock, 20% stop-loss
report = sim(position, resample='2W', position_limit=0.2, stop_loss=0.2,
             market=USMarket(), fee_ratio=0.001, tax_ratio=0)
report.display()

Sustained New High Strategy

Building on the first strategy, this variant adds a sustain(5, 3) condition: the stock must have hit a 200-day high on at least 3 out of the last 5 trading days. This filter removes stocks that only briefly touched a new high before pulling back, retaining only those that sustain strength near the top of their range.

from finlab import data
from finlab.backtest import sim
from finlab.market import USMarket

data.set_market('us')

close = data.get('price:adj_close')
close = close[close.index.dayofweek < 5]  # remove weekends

# At least 3 of the last 5 days at a 200-day high
position = (close == close.rolling(200).max()).sustain(5, 3)

report = sim(position, resample='2W', position_limit=0.2, stop_loss=0.2,
             market=USMarket(), fee_ratio=0.001, tax_ratio=0)
report.display()

Key Parameters

  • rolling(200).max(): Computes the 200-day rolling maximum price. A stock equals this value only when it is at a new high. 200 trading days is roughly equivalent to one calendar year (52 weeks).
  • sustain(5, 3): Requires the condition to be true on at least 3 of the past 5 days. This filters out fleeting spikes and selects stocks with persistent strength.
  • resample='2W': Rebalances every two weeks. A longer holding period allows breakout trades time to develop while keeping turnover manageable.
  • position_limit=0.2: Caps each stock at 20% of the portfolio, preventing excessive concentration in a single name.
  • stop_loss=0.2: If a position drops 20% from its entry price, it is automatically sold to limit downside risk.

Expected Behavior

New-high breakout strategies exploit the empirical tendency of stocks making new highs to continue rising -- a well-documented anomaly in academic finance. The 200-day window captures roughly one year of price history, making it comparable to a 52-week high breakout. The sustained variant is more selective and tends to have fewer but higher-conviction positions. Both strategies perform best in trending markets and may underperform in range-bound or declining markets where breakouts frequently fail. The stop-loss provides a safety net against false breakouts.