Idea in brief
Perry Kaufman trades stocks and futures with one trend model. It has seven indicators: five trends of different lengths and two confirmations. In stocks Kaufman enters only long and only when all seven point up.
Kaufman picks stocks for the portfolio in an unusual way. The strategy is run across a list of about 500 stocks, and for each one Kaufman records how much the strategy made on it over recent months. All stocks are ranked by this profit, not by price gains. Then the stocks where the strategy currently has no open position are removed from the ranking, and the top 10-20 of the remaining ones go into the portfolio.
The ranking is recalculated every day. A stock leaves the portfolio when it falls a few places below the top boundary. Kaufman calls this latitude, four places in the example. There is no stop-loss, the ranking plays its role. A stock can be sold even at a profit if another one is working better.
The difference from the "Dual momentum" card and from ROC rotations lies in what gets ranked. There, the ranking is built on the asset's return. Here, it is built on how much a specific strategy managed to extract from the asset. According to Kaufman, ranking by the stocks' own returns did not work.
Why it might work
Kaufman relies on the persistence of moves. If a market is already going well and all seven indicators are long, it tends to continue for some time. Stocks like Nvidia and Apple from Kaufman's example make most of the portfolio's profit.
The host puts forward an idea that Kaufman agrees with: price by itself says little about whether a stock is suitable. What matters is how the strategy interacts with that price. The strategy's profit on a stock captures both the strength of the trend and how well the trend suits the specific entry and exit rules.
Ranking as an exit solves a known problem of long-term trend following. A trend system on a single stock exits late and gives back a noticeable part of the profit. Here a stock only has to drop out of the top, and a stronger one takes its place. According to the author, the holding period is cut roughly in half, while long trends remain the basis of selection.
All of this is the author's explanation. The interview has no final return figures for the method.
Rules
Base strategy on each stock
// author: five trends and two confirmations, in stocks entry when all seven are long
// the author did not disclose the indicators; trend periods are chosen in the 30-120 day range
// Finetiq: a substitute to test the ranking idea itself
T(n) = Close > SMA(Close, n) for n in [30, 45, 60, 90, 120] // Finetiq
Confirm1 = SMA(Close, 30) > SMA(Close, 30)[5] // Finetiq: the short average is rising
Confirm2 = SMA(Close, 60) > SMA(Close, 120) // Finetiq
AllLong = all five T(n) AND Confirm1 AND Confirm2
// the shadow strategy is always calculated on every stock,
// regardless of whether the stock is in the portfolio
IF AllLong AND no shadow position THEN shadow buy AT NEXT BAR OPEN
IF Close < SMA(Close, 60) AND shadow position THEN shadow sell AT NEXT BAR OPEN // Finetiq: exit not named
ShadowShares = 10000 / Close at entry // author: $10 000 per stock
ShadowEquity = profit of closed shadow trades + open profit at the current price
W = 63 bars // author: 3-6 months, elsewhere 30-60 days; Finetiq: 63
ShadowPnL = ShadowEquity - ShadowEquity[W] // Finetiq: profit over the window
Selection, ranking and exit (author)
Universe = about 500 stocks, Close >= 10 // author: no stocks cheaper than $10
N = 10 // author: 10-20
Latitude = 4 // author: "say, four" places
// every day after the close (author)
Eligible = [x in Universe : the shadow strategy has an open position on x] // author
Rank(x) = place of x in Eligible by ShadowPnL(x), descending // author: absolute profit
// author: ranks all stocks and removes those without a position.
// Finetiq: place and latitude are counted after the removal, so the top always holds N stocks with a position
FOR each x in Portfolio
IF x NOT in Eligible // Finetiq: the base strategy exited on its own
SELL x AT NEXT BAR OPEN
ELSE IF Rank(x) > N + Latitude // author: dropped out of the top, with latitude
SELL x AT NEXT BAR OPEN
WHILE the portfolio holds fewer than N stocks
BUY the best-ranked stock from Eligible that is not in the portfolio, AT NEXT BAR OPEN
// Shares = 10000 / Close (author)
// no stop-loss (author)
Overheating of a stock and of the whole portfolio (partly author)
Vol20(x) = StdDev(ln(Close / Close[1]), 20) * sqrt(252) // author: annualized 20-day volatility
IF Vol20(x) > 50% // author: threshold for a typical stock
wait for a sign of a top, then SELL x AT NEXT BAR OPEN // author: do not sell right away
// Finetiq: sign of a top = a close below the low of the last 5 bars
// author: when losses hit the whole portfolio at once, the author exits the entire portfolio
// and returns after volatility declines and daily results stabilize.
// The author called the rule a secret. The number 0.32 was mentioned without units, so it cannot be formalized
Futures (author)
// the same ranking by strategy profit, positions in both directions
// author: indices and interest rates long only, other markets in both directions
Sectors = number of distinct sectors among the selected markets
IF Sectors = 1 THEN leverage × 0.50 // author
IF Sectors = 2 THEN leverage × 0.75 // author: a 25% reduction
IF Sectors >= 3 THEN leverage × 1.00 // author
Version for one or two symbols (Finetiq)
Ranking cannot be tested on a single symbol. A weaker form can be tested: take the strategy's signal only when the strategy itself has recently made money on this symbol.
IF AllLong AND ShadowPnL > 0 AND no position
BUY AT NEXT BAR OPEN
IF (no shadow position OR ShadowPnL <= 0) AND position open
SELL AT NEXT BAR OPEN
// two symbols: the real position is opened where ShadowPnL is higher
Parameters
| Parameter | Value | Source |
|---|---|---|
| Base model | five trends and two confirmations, all long | author |
| Model indicators | five SMAs of 30-120 and two confirmations | Finetiq |
| Base model exit | close below SMA 60 | Finetiq |
| Candidates | about 500 stocks | author |
| Minimum price | $10 | author |
| Size | $10,000 per stock, divided by price | author |
| Ranking measure | absolute strategy profit over the window | author |
| Ranking window | 3-6 months or 30-60 days | author (two versions) |
| Window in bars | 63 | Finetiq |
| Selection condition | the strategy has an open position | author |
| Number of stocks | 10-20 | author |
| Latitude | 4 places | author (example) |
| Recalculation | every day | author |
| Stop-loss | none | author |
| Volatility threshold | 50% annualized over 20 days | author |
| Sign of a top | close below the 5-bar low | Finetiq |
| Futures: leverage | 1 sector −50%, 2 sectors −25% | author |
What to test
- What to rank. One universe and one base strategy, five rankings: strategy profit, the stock's own return over the same window, the Sharpe ratio of shadow trades, the return-to-risk ratio (Finetiq: profit over the window divided by the maximum drawdown of the shadow equity curve), and days to recover from a drawdown. Kaufman claims only the first one works. This is the card's main test.
- Window. 30, 60, 90 and 126 days. The author named two ranges in the same interview, so test both.
- Latitude and turnover. A latitude of 0, 2, 4 and 8 places. Look at the average holding period (the author cites 16-17 days), trades per year and the result after commissions and spread.
- Number of stocks. 10, 20 and 50 versus the S&P 500 with dividends. The author expects 50 stocks to deliver the index result.
- Ranking versus a stop. The same entries, but exit only on the base strategy's signal and a 3 ATR stop. If the ranking is not better, its benefit lies in selection, not in the exit.
- A different base strategy. Replace the seven indicators with an SMA 50 and 200 crossover or a 100-day breakout. The author says ranking helps almost any strategy.
- Candidate selection. Run the method on the whole index with historical constituents and on a list selected for trendiness over the whole history. The difference shows how much of the result comes from lookahead when building the list.
Platform notes
TradingView (Pine Script)
- Ranking across hundreds of stocks cannot be tested as a strategy: only the chart symbol is traded, and
request.securitycalls are limited. - The single-symbol version can be tested. Shadow trades have to be calculated manually in
varvariables:strategy.netprofitand otherstrategy.*fields reflect only executed trades, that is, trades that are already filtered. - The second symbol is read via
request.security, inside which the same shadow profit function is called. The strategy will not be able to trade that symbol. - A size of $10,000 per trade:
default_qty_type = strategy.cash,default_qty_value = 10000.
MultiCharts and TradeStation (EasyLanguage)
- Rotation across hundreds of stocks is done in a portfolio module. In MultiCharts Portfolio Trader the selection is written as a separate portfolio money management signal that sees the values of all strategies. In TradeStation Portfolio Maestro, check in advance whether your version can rank by a value calculated by the strategy.
- The main pitfall:
NetProfit,PositionProfitandOpenPositionProfitcount only executed trades. If the portfolio did not take a stock, its profit will be zero, and the stock will never make it into the ranking. Each copy of the strategy has to calculate the shadow profit itself. - Size in shares:
Buy IntPortion(10000 / Close) shares next bar at market. - Daily recalculation across 500 symbols makes a heavy portfolio test. The futures version on 20-40 markets is noticeably lighter.
MetaTrader 5 (MQL5)
- A typical broker has no universe of 500 stocks with history, only CFDs on some US stocks, without companies removed from the index. For stocks, the idea is effectively untestable here.
- The futures version is more realistic: many brokers offer CFDs on indices, commodities, bonds and currencies, which is enough for 20-40 symbols in a multi-symbol EA.
- The terminal's trade history cannot be used for the ranking, since it contains only real trades. Store shadow positions and profit in the EA's arrays for each symbol.
- Sectors for the leverage rule are not labeled in MT5, so they have to be set manually as a list.
Where the idea can break
- The author's seven indicators are not disclosed. The base strategy here is ours, and Kaufman's statements about results do not apply to it.
- The ranking window is given in two ways: 3-6 months and 30-60 days. The extreme windows differ by more than four times (126 days versus 30), and the interview does not make clear which version is the author's main one.
- The author built the candidate list manually: volatile stocks with low debt, and new ones were checked for trendiness using 30-120 day averages. If the test selects the list over the whole history, knowledge of the future gets into it.
- Without stops the portfolio is vulnerable to a sector-wide decline. The host pointed out such a risk (four semiconductor stocks at once), and Kaufman agreed that it is possible, although it has not happened to Kaufman.
- The author did not disclose the portfolio-wide exit for a broad decline. Without it, in a sharp bear market, the only protection is the base strategy's exits and the ranking.
- The statement about beating the S&P 500 every year came from the host, not from Kaufman, and without figures.
- Daily recalculation and a latitude of four places give a holding period of about two to three weeks. With a $10,000 position, spread and commissions are noticeable, especially on the volatile stocks the author prefers.