Skip to content

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

Taiwan-market variant

For the Taiwan-market version of this strategy, see the zh-tw page.

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.