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.