October 2024 Performance Report

Industry Benchmark Performance                                                                                            

October has a history of volatile moves, but this month it was a back-and-forth, going nowhere, month. While the Fed signaled lower rates, and the data supported that, it was already in the market. I have no idea what traders were expecting – lowering rates by a full point?

            Then there is the election and a lot of apprehension. Does buying or selling indicate who you think will be elected? If so, no one knows.

            Most funds are trend followers, or have a trend hidden somewhere in their rules. October was not a good month for trends.

Source: BarclayHedge Indices.

Kaufman’sMost Popular Books (available on Amazon)

Trading Systems and Methods, 6th Edition. The complete guide to trading systems, with more than 250 programs and spreadsheets. The most important book for a system developer.

Kaufman Constructs Trading Systems. A step-by-step manual on how to develop, test, and trade an algorithmic system.

Learn To Trade. Written for both serious beginners and practiced traders, this book includes chart formations, trends, indicators, trading rules, risk, and portfolio management. You can find it in color on Amazon.

You can also find these books on our website, www.kaufmansignals.com.

Blogs and Recent Publications

Find Mr. Kaufman’s other recent publications and seminars at the end of this report. We post new interviews, seminars, and reference new articles by Mr. Kaufman each month.

October Performance in Brief

Our programs had mixed results, much like the industry. We expected the interest rates to drive the market, but that hasn’t happened. Still, rates will go lower and the market will respond. Trying to figure out when is going to happen will be the problem.

Major Equity ETFs

A small decline in October index markets forms a double top in NASDAQ (QQQ), but the S&P continues higher. Given that interest rates will continue to fall, stocks should do better in both sales and refinancing. QQQ is a different story. Driven by the AI (artificial intelligence) stocks, the glamour seems to be fading. While we expect the chips to still be in demand, investors expected more innovation by now. Investors can be very demanding.

Insert Major Index

CLOSE-UP: Trading the Right Shoulder

Every trader should know a head & shoulders formation. Figure 1 is how Investopedia shows it. It’s a top formation where the head is higher than the previous top, followed by a right should that is lower than the head. The trade sells when the “neckline” (the line connecting the two pullbacks) is broken. You are stopped out if price go above the head.

Figure 1. The head & shoulders formation.

The price target is found by measuring the top of the head to the neckline, then extending that from the break of the neckline (on the right) downward. This is a bearish formation.

Because the stock market goes up, I find that the opposition pattern, the bullish head & shoulders, is more likely to be profitable. I think that any pattern in the stock market that favors the long side is likely to be a winner (over time).

The Right Shoulder

I recently saw a podcast that focused on the right shoulder. That seemed intriguing. Looking at Figure 2, we see the right shoulder marked in a more realistic pattern. I still don’t know why chartists keep showing this as a bearish formation. In fact, the neckline of the chart is not quite right. if we were doing this live, we would have drawn the neckline using the first low after the head formation. Then there was a small rally (a double top on the right) before testing the neckline again. Drawing a chart line afterwards allows us to use more “creativity.”

Figure 2. Another head & shoulders formation.

Coding the Pattern

Coding a trendline strategy is much simpler than coding a pattern. I’m going to make my excuses early, because I’m not sure that I’ve got this right. On the other hand, it performs quite well. If you’re good at this, you can figure out what I did. If not, you can simply copy the code at the bottom and see what it brings.

Using the Swing Highs and Lows

I have a program that identifies the swing highs and lows, given a minimum swing expressed as a percentage. That program is also at the bottom of this report. In Figure 3, the red dots are the highs of the swing, and the blue dots are the lows. From those dots we should be able to identify the pattern. Figure 3 is the ETF QQQ with the swing threshold of 5%.

Figure 3. QQQ with a swing threshold of 5%.

Buying Rules

These rules for the right shoulder are the same as the normal head & shoulders bullish signal (the opposite of Figures 1 and 2.

  1. Find the head & shoulder bullish pattern using the swing points
  2. Buy the break of the neckline
  3. Set the target as the neckline plus the distance of the head to the neckline (a measure of volatility).
  4. Exit if prices fall below the low of the right shoulder or the inverted head.

Selling Rules

  1. Find the head & shoulder bearish pattern using the swing points.
  2. Sell the break of the neckline
  3. Set the target as the neckline minus the distance of the head to the neckline (a measure of volatility).
  4. Exit if prices rises rises above the right shoulder or the head formation.

Sometimes, We Find Interesting Results by Mistake

Complicated programs are “debugged” because they often have errors. In this case, I did not get the target price correct. The bullish trade keeps going until a reverse right shoulders formation occurs. That could be a long time. As it turns out, those trades seem to be highly profitable.

Taken this way, the bullish right should is an interesting pattern, resulting in higher profits and more reliability that most other systems. I’ve left it that way. If you’re good at coding, you can fix the target price.

Results

The two charts below are for NVDA and AAPL. Yes, they do well as a buy & hold but have some serious drawdowns. This strategy seems to avoid most of them.

Figure 4. NVDA Total profits.

Figure 5. AAPL Total profits.

Performance Details

Using the data from TradeStation, we can see how this strategy works in Figure 6:

Figure 6. “Right Shoulder” statistics.

What is unusual about the results is that the Profit Factor is very high. That means profits far exceed losses. You can also see that in the Maximum Drawdown compared to the Total Net Profit. While trend following has a profitable performance ratio of about 30% to 35%, this has 40% to 60%.

It’s an interesting performance profile.

TradeStation Code

Don’t worry about the formatting. Just paste the code into EasyLanguage. It will be fine.

{ PJK Right Shoulder

Swing Code

  Copyright 2024, P.J. Kaufman.  All rights reserved.

  The swing high and low points can be plotted using “TMS Swing”

                swing    = price swing in whole % (e.g., 2% = 2.0)  }

                input:    swingfactor(2.5), targetfactor(0.50), longonly(true), shortonly(false),

                                                printfile(true);

                vars:      pcswing(0), curhigh(0), curlow(0), swhigh(0), swlow(0) ,

                                                highbar(0),lowbar(0), chighbar(0), clowbar(0), lowp(0), highp(0),

                                                divide(4), par(800), prevhigh(0), prevlow(0), lastswing(0),

                                                lasthighprice(0), lastlowprice(0), prevhighprice(0), prevlowprice(0),

                                                size(0), stockinvestment(10000), exittarget(0), PL(0), equity(0),

                                                adate(” “), waitforreversal(0);                                                   

                vars:      nswing(0);

                arrays: swingprice[5000](0), swingbar[5000](0), swingHL[5000](0);

                If Currentbar = 1 then begin

                                pcswing = swingfactor / 100.;

                                end;

//            SWING LOGIC Imbedded

//            INITIALIZE MOST RECENT HIGH AND LOW

                 if currentbar = 1 then begin

                    curhigh = high;                                              { current high }

                    curlow  = low;                                                { current low }

                    end;

// SEARCH FOR A NEW HIGH — favor reversals

//   if lastswing <> 1 then begin

   if lastswing <= 0 then begin

// REVERSE FROM HIGH IF MINIMUM % SWING

                                if low < curhigh – curhigh*pcswing then begin

               lastswing = 1;                                     { last high fixed }

               swhigh   = curhigh;                                           { new verified high }

               highbar  = chighbar;

               curlow = low;                                                     { initialize new lows }

               lowp = low;                                                                         { swing low for plot }

               clowbar = currentbar;

                               nswing = nswing + 1;

                               swingHL[nswing] = -lastswing;

                                                swingbar[nswing] = lowbar;

                                                swingprice[nswing] = swlow;

                                                print(file(“c:\tradestation\PJK RightShoulder.csv”),”new DN swing,,”, swhigh:6:2, “,”, low:6:2);

               end

               else begin

                               if high > curhigh then begin

                                               curhigh = high;      { new current high }

                                               chighbar = currentbar;

                                               end;

               end;

                 end;

// SEARCH FOR A NEW LOW – favor reversal

                if lastswing >= 0 then begin

// REVERSAL FROM LOW IF MINIMUM % SWING

                                if high > curlow + curlow*pcswing then begin

                               lastswing = -1;

                               swlow   = curlow;

                               lowbar   = clowbar;

                               curhigh = high;          { initialize current high }

                               highp = high;            { swing high for plot }

                               chighbar = currentbar;

                               nswing = nswing + 1;

                               swingHL[nswing] = -lastswing;

                                                swingbar[nswing] = highbar;

                                                swingprice[nswing] = swhigh;

                                                print(file(“c:\tradestation\PJK RightShoulder.csv”),”new UP swing,,”, swlow:6:2, “,”, high:6:2);

                                end

                                else begin

                               if low < curlow then begin

                               curlow = low;

                               clowbar = currentbar;

                               end;

               end;

                end;

// Adjust stop

                if marketposition > 0 then begin

                                                sell (“ALstop”) all shares next bar at prevlowprice stop;

                                                end

                                else if marketposition < 0 then begin

                                                buy to cover (“ASstop”) all shares next bar at prevhighprice stop;

                                end;

// wait for reversal (last position)

                if waitforreversal = 1 and lastswing = -1 then waitforreversal = 0

                                else if waitforreversal = -1 and lastswing = 1 then waitforreversal = 0;

// test for right shoulder on a declining bar – last swing must be a high

                if nswing >= 4 and lastswing < 0 and marketposition >= 0 and waitforreversal = 0 then begin

                                                lasthighprice = swingprice[nswing];

                                                lastlowprice = swingprice[nswing – 1];

                                                prevhighprice = swingprice[nswing – 2];

                                                prevlowprice = swingprice[nswing – 3];

// is the current high less than the previous high? How much % lower?

// sell when curent low breaks previous low swing

                                                if close < lastlowprice then begin

                                                                                sell all shares this bar on close;

                                                                                if longonly = false then begin

                                                                                                size = stockinvestment/close;

                                                                                                sell short size shares this bar on close;

                                                                                                exittarget = close – targetfactor*absvalue(lasthighprice – lastlowprice);

                                                                                                buy to cover (“Target”) all shares next bar at exittarget limit;

                                                                                                buy to cover (“Stop”) all shares next bar at lasthighprice stop;

                                                                                                waitforreversal = -1;

                                                                                                end;

                                                                                end;

//                                                            end;

//                                            end;

                                end;

// test for rising right shoulder on a rising bar, last high must be a low

                if nswing >= 4 and lastswing > 0 and marketposition <= 0 and waitforreversal = 0 then begin

                                                lastlowprice = swingprice[nswing];

                                                lasthighprice = swingprice[nswing – 1];

                                                prevlowprice = swingprice[nswing – 2];

                                                prevhighprice = swingprice[nswing – 3];

// is the current high less than the previous high? How much % lower?

//                                            if lastlowprice < prevlowprice then begin

// buy when close > prevhighprice

                                                                if close > lasthighprice then begin

                                                                                buy to cover all shares this bar on close;

                                                                                if shortonly = false then begin

                                                                                                size = stockinvestment/close;

                                                                                                buy size shares this bar on close;

                                                                                                exittarget = close + targetfactor*(prevhighprice – lastlowprice);

                                                                                                sell (“LTarget”) all shares next bar at exittarget limit;

//                                                                                            sell (“LStop”) all shares next bar at lastlowprice stop;

                                                                                                sell (“LStop”) all shares next bar at prevlowprice stop;

//                                                                                            sell (“LStop”) all shares next bar at close – 0.50*targetfactor*(prevhighprice – lastlowprice) stop;

                                                                                                end;

                                                                                waitforreversal = 1;

                                                                                end;

//                                            end;

                                end;

                equity = netprofit + openpositionprofit;

                PL = equity – equity[1];

                if printfile and nswing > 2 then begin

                                adate = ELdatetostring(date);

                                once begin

                                                print(file(“c:\tradestation\PJK RightShoulder.csv”),

                                                                “date,high,low,close,nswing,curdir,lasthigh,prevhigh,lastlow,prevlow,swingbar,”,

                                                                “prevbar,pos,size,target,PL,CumPL”);

                                                end;

                                print(file(“c:\tradestation\PJK RightShoulder.csv”),adate, “,” ,high:7:4, “,”, low:7:4, “,”, close:7:4, “,”,

                                                nswing:5:0, “,”, lastswing:5:0, “,”, lasthighprice:7:4, “,”,prevhighprice:7:4, “,”,

                                                lastlowprice:7:4, “,”, prevlowprice:7:4, “,”, swingbar[nswing], “,”, swingbar[nswing-1]:5:0, “,”,

                                                marketposition:5:0, “,”, size:5:2, “,”, exittarget:8:2, “,”, PL:8:2, “,”, equity:8:2);

                                end;

{ TSM Swing:  Plots swing highs and lows

  Copyright 1994-1999, P.J. Kaufman.  All rights reserved.

   Plot setup:

                1. Place on same graph window as price

                2. Scale same as price

                3. In style, set both values to “point” with weight 2

  Inputs for TSM SWING:

                type       = 0, normal price

                                                = 1, 3-month rate

                                                = 2, bond price at par

     swing               = price swing in whole % (e.g., 2% = 2.0)  }

   input: type(0), swing(2.5);

   vars:  pcswing(0), lastdir(0), curhigh(0), curlow(0), swhigh(0), swlow(0) , highbar(0),

                                                lowbar(0), chighbar(0), clowbar(0), lowp(0), highp(0), xclose(0), xhigh(0),

                                                xlow(0), divide(4), factor(1), par(800);

   pcswing = swing / 100.;

                if type = 0 then begin

                                                xhigh = high;

                                                xlow = low;

                                                xclose = close;

                                                end

                                else if type = 1 then begin

                                                xhigh = 100 – low;

                                                xlow = 100 – high;

                                                xclose = 100 – close;

                                                end

                                else if type = 2 then begin

                                                xhigh = par / low;

                                                xlow = par / high;

                                                xclose = par / close;

                                                end;

{ INITIALIZE MOST RECENT HIGH AND LOW }

  if currentbar = 1 then begin

      curhigh = xclose;                                        { current high }

      curlow  = xclose;                                        { current low }

      end;

{ SEARCH FOR A NEW HIGH — favor reversals }

   if lastdir<>1 then begin

   { REVERSE FROM HIGH IF MINIMUM % SWING }

      if xlow < curhigh – curhigh*pcswing then begin

         lastdir = 1;                                                                 { lastdir high fixed }

         swhigh   = curhigh;                 { new verified high }

         highbar   = chighbar;

         curlow = xlow;                                         { initialize new lows }

         lowp = xlow;                                                             { swing low for plot }

         clowbar = currentbar;

                                if type = 0 then

                                                plot1[currentbar – highbar](high[currentbar – highbar]*1.01,”swinghigh”)

                                else

                                                plot3[currentbar – highbar](low[currentbar – highbar]*.99,”swinglow”);

         end

      else begin

      if xhigh > curhigh then begin

         curhigh = xhigh;          { new current high }

         chighbar = currentbar;

         end;

      end;

   end;

{ SEARCH FOR A NEW LOW – favor reversal }

   if lastdir <> -1 then begin

{ REVERSAL FROM LOW IF MINIMUM % SWING }

   if xhigh > curlow + curlow*pcswing then begin

      lastdir = -1;

      swlow   = curlow;

      lowbar   = clowbar;

      curhigh = xhigh;          { initialize current high }

      highp = xhigh;               { swing high for plot }

      chighbar = currentbar;

      if type = 0 then

                                plot2[currentbar – lowbar](low[currentbar – lowbar]*.99,”swinglow”)

                else

                                plot4[currentbar – lowbar](high[currentbar – lowbar]*1.01,”swinghigh”);

      end

   else begin

      if xlow < curlow then begin

         curlow = xlow;

         clowbar = currentbar;

         end;

      end;

   end;

A Standing Note on Short Sales

Note that the “All Signals” reports show short sales in stocks and ETFs, even though short positions are not executed in the equity portfolios. Our work over the years shows that downturns in the stock market are most often short-lived and it is difficult to capture with a longer-term trend. The upwards bias also works against shorter-term systems unless using futures, which allows leverage. Our decision has been to take only long positions in equities and control the risk by exiting many of the portfolios when there is extreme volatility and/or an indication of a severe downturn.

PORTFOLIO METHODOLOGY IN BRIEF

Both equity and futures programs use the same basic portfolio technology. They all exploit the persistence of performance, that is, they seek those markets with good long-term and short-term returns on the specific system, rank them, then choose the best, subject to liquidity, an existing current signal, with limitations on how many can be chosen from each sector. If there are not enough stocks or futures markets that satisfy all the conditions, then the portfolio holds fewer assets. In general, these portfolios are high beta, showing higher returns and higher risk, but have had a history of consistently outperforming the broad market index in all traditional measures.

PERFORMANCE BY GROUP

NOTE that the charts show below represent performance “tracking,” that is, the oldest results since are simulated but the returns from 2013 are the systematic daily performance added day by day. Any changes to the strategies do not affect the past performance, unless noted. The system assumes 100% investment and stocks are executed on the open, futures on the close of the trading day following the signals. From time to time we make logic changes to the strategies and show how the new model performs.

Groups DE1 and WE1: Daily and Weekly Trend Program for Stocks, including Income Focus, DowHedge, Sector Rotation, and the New High-Risk Portfolio

The Trend program seeks long-term directional changes in markets and the portfolios choose stocks that have realized profitable performance over many years combined with good short-term returns. It will hold fewer stocks when they do not meet our condition and exit the entire portfolio when there is extreme risk or a significant downturn.

Equity Trend

Modest losses in all the Trend Programs, although the charts below look positive. Small gains in the Weekly Trend program, mostly because results only go though last Friday. Although the pattern is choppy, lower interest rates and the end of the election should create an upwards bias.

Income Focus and Sector Rotation

Much like the rest of our programs, Income Focus had small losses, but the chart still look positive. This program should benefit from a trend in lower rates, however, that hasn’t quite unfolded.

Weekly Sector Rotation

Fractional losses still leaves our best program higher by 25% this year. Not much to say, other than jumping from one sector to another doesn’t do as well as sticking to the same ETFs most of the year.

DowHedge Programs

Even with small losses in October, both the daily and weekly DowHedge programs are higher by 10% and look positive on the charts and similar to the Dow returns. We expect some volatility after the election, but markets most often go higher, if only out of relief.

High-Risk Portfolios

The High-Risk Portfolios took a bigger loss this month as enthusiasm for semis and AI applications seem to fade. Even with NVDA saying that sales are up and futures sales look good, investors seem to want more. Time will tell.

Group DE2: Divergence Program for Stocks

The Divergence program looks for patterns where price and momentum diverge, then takes a position in anticipation of the pattern resolving itself in a predictable direction, often the way prices had moved before the period of uncertainty.

Gains of about 2% in both of these portfolios make it one of the few strategies profitable in October. Both are near highs and a sustained trend will move it along.

Group DE3: Timing Program for Stocks

The Timing program is a relative-value arbitrage, taking advantage of undervalued stocks relative to its index. It first finds the index that correlates best with a stock, then waits for an oversold indicator within an upwards trend. It exits when the stock price normalizes relative to the index, or the trend turns down. These portfolios are long-only because the upwards bias in stocks and that they are most often used in retirement accounts.

We’re still waiting for this program to start gaining as it did in 2021, even without COVID to motivate the market. Our work shows it is a reliable strategy and can profit for many combinations of market moves. This month it gained slightly but remains sideways.

Futures Programs

Groups DF1: Daily Trend Programs for Futures

Futures allow both high leverage and true diversification. The larger portfolios, such as $1million, are diversified into both commodities and world index and interest rate markets, in addition to foreign exchange. Its performance is not expected to track the U.S. stock market and is a hedge in every sense because it is uncorrelated. As the portfolio becomes more diversified its returns are more stable.

The leverage available in futures markets allows us to manage the risk in the portfolio, something not possible to the same degree with stocks. This portfolio targets 14% volatility. Investors interested in lower leverage can simply scale down all positions equally in proportion to their volatility preference. Note that these portfolios do not trade Asian futures, which we believe are more difficult for U.S. investors to execute. The “US 250K” portfolio trades only U.S. futures.

Losses in all Futures Trend portfolios put this program in the red again. As with the other programs, interest rates play the biggest role, and at the moment they are going nowhere. The chart below confirms a sideways pattern for the last few months. At some point, lower rates should move this strategy forward.

Group DF2: Divergence Portfolio for Futures

Modest profits in all the Divergence portfolios for October. The smallest portfolio, 250K is doing well while the larger one are showing small losses for the year. That seems to be the situation for most of the Futures Funds. We’re still waiting for the program to start trending.

Blogs and Recent Publications

Perry’s books are all available on Amazon or through our website, www.kaufmansignals.com.

October 2024

“Trading a Breakout System” was published in Technical Analysis of Stocks & Commodities. It looks at whether it’s better to enter on the bullish breakout, wait for confirmation, or buy ahead of the breakout. It’s a practical look at improving breakout results.

September 2024

Two articles posted by Perry, “The N-Day or the Swing Breakout,” (Technical Analysis of Stocks & Commodities) looking to see which is better. You would be surprised.

A look at deleveraging Artificial Intelligence stocks, a shorter version of the article posted in our “Close-Up” section. It appeared in Seeking Alpha earlier in September.

August 2024

“Theory Versus Reality” was published in the August issue of Technical Analysis of Stocks & Commodities. It discusses price shocks, diversification, predicting performance, and more.

July 2024

Perry posted a new article on Seeking Alpha, “Capturing Fund Flows.” It a good strategy for someone that wants to add some diversification. It only trades 3 days each month!

June 2024

Perry was interviewed on June 27th by Simon Mansell and Richard Brennan at QuantiveAlpha (Queensland, Australia), a website heavy into technical trading. It should be posted in a week or so.

“Trading Extreme Gaps and Extreme Closes” looks at daily patterns in stocks, published in the June edition of Technical Analysis.

May 2024

In the April edition of Technical Analysis, Perry again deals with risk in “How Professional Assign Risk.” It is another chapter in how to protect yourself.

April 2024

Another article in the April edition of Technical Analysis, “Determining Risk Before It Happens.” Perry thinks this is an article everyone should read.

March 2024

In the 2024 Bonus Issue of Technical Analysis, Perry has an article, “Pros and Cons of Daily Versus Weekly Trend Following.” There is also a quote by him in the “Retrospective: Interviews” going back to April 1988.

Perry also posted an article on Seeking Alpha, “How To Exit a Trade.” A good reminder of the choices.

February 2024

Perry published an article on using the backwardation and contango in crude oil in “The Delta-Delta Strategy.” If not crude, the you might think of this for any commodity, including interest rates, that have a consistent term structure.

January 2024

A new article in February edition of Technical Analysis of Stocks & Commodities, “Crossover Trading: Arbitrating the Physical with the Stock.” A chance at diversification!

Perry posted 3 new articles on Seeking Alpha in December, “Where Do You Take Profits?”, “Is There a Better Day to Enter the Market,” and “Watching January Returns.” 

Another article in Technical Analysis of Stocks & Commodities, “Gap Momentum,” another interesting way to identify the trend.

December 2023

Perry posted 3 new articles on Seeking Alpha, “Where Do You Take Profits?”, “Is There a Better Day to Enter the Market,” and “Watching January Returns.”

This month Technical Analysis of Stocks & Commodities published “A Strategy For Trading Seasonal and Non-Seasonal Market.” Turns out that most markets are non-seasonal!

November 2023

Perry posted two articles on Seeking Alpha, “Compression Breakout: Giving a Boost to Your Entries,” and “Volatility: The Second Most Important Indicator.” In addition, he interviewed Herb Friedman in Technical Analysis of Stocks & Commodities. Herb is a interest rate specialist focusing on low risk investments.

Older Items of Interest

On April 18th, 2023, Perry gave a webinar to the Society of Technical Analysts (London) on how to develop and test a successful trading system. Check their website for more details, https://www.technicalanalysts.com..

Perry’s webinar on risk, given to the U.K. Society of Technical Analysts, can be seen using the following link: https://vimeo.com/708691362/04c8fb70ea

For older articles please scan the websites for Technical Analysis of Stocks & Commodities, Modern Trader, Seeking Alpha, ProActive Advisor Magazine, and Forbes. You will also find recorded presentations given by Mr. Kaufman at BetterSystemTrader.com, TalkingTrading.com, FXCM.com, systemtrade.pl, the website for Alex Gerchik, Michael Covel’s website, TrendFollowing.com, and Talking Trading.com.

You will also find up to six months of back copies of our “Close-Up” reports on our website, www.kaufmansignals.com. You can address any questions to perry@kaufmansignalsdaily.com.

© October 2024, Etna Publishing, LLC. All Rights Reserved.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top