Category Archives: back testing

Whither Apple?

OK, first off a true confession.  I hate it when some wise acre analyst acts like they are so smart and that everyone else is an idiot.  Its offensive and off-putting – not to mention arrogant.  And still in this case, all I can say is “Hi, my name is Jay.”

A lot of attention has been paid lately to the fact that AAPL is essentially swallowing up the whole world in terms of market capitalization.  As you can see in Figure 1, no single S&P 500 Index stock has ever had a higher market cap relative to the market cap of the entire Russell 2000 small-cap index. 

Figure 1 – Largest S&P 500 Index stock as a % of entire Russell 200 Index (Courtesy Sentimentrader.com)

So of course, the easiest thing in the world to do is to be an offensive, off-putting and arrogant wise acre and say “Well, this can’t last.”  There, I said it.  With the caveat that I have no idea how far AAPL can run “before the deluge”, as a student of (more) market history (than I care to admit) I cannot ignore this gnawing feeling that this eventually “ends badly.”  Of course, I have been wrong plenty of times before and maybe things (Offensive, Off-Putting and Arrogant Trigger Warning!) “really will be different this time around.”  To get a sense of why I bring this all up, please keep reading.

In Figure 1 we also see some previous instances of a stock becoming “really large” in terms of market cap.  Let’s take a closer look at these instances.

IBM – 1979

Figure 2 – IBM (Courtesy AIQ TradingExpert)

MSFT – 1999

Figure 3 – MSFT (Courtesy AIQ TradingExpert)

XOM – 2008

Figure 4 – XOM (Courtesy AIQ TradingExpert)

AAPL – 2012

Figure 5 – AAPL (Courtesy AIQ TradingExpert)

AAPL – 2020

Figure 6 – AAPL (Courtesy AIQ TradingExpert)

Summary

Small sample size? Yes.

Could AAPL continue to run to much higher levels? Absolutely

Do I still have that offensive, off-putting and slightly arrogant gut feeling that somewhere along the way AAPL takes a huge whack?

Sorry.  It’s just my nature.

Jay Kaeppel

Disclaimer: The information, opinions and ideas expressed herein are for informational and educational purposes only and are based on research conducted and presented solely by the author.  The information presented represents the views of the author only and does not constitute a complete description of any investment service.  In addition, nothing presented herein should be construed as investment advice, as an advertisement or offering of investment advisory services, or as an offer to sell or a solicitation to buy any security.  The data presented herein were obtained from various third-party sources.  While the data is believed to be reliable, no representation is made as to, and no responsibility, warranty or liability is accepted for the accuracy or completeness of such information.  International investments are subject to additional risks such as currency fluctuations, political instability and the potential for illiquid markets.  Past performance is no guarantee of future results.  There is risk of loss in all trading.  Back tested performance does not represent actual performance and should not be interpreted as an indication of such performance.  Also, back tested performance results have certain inherent limitations and differs from actual performance because it is achieved with the benefit of hindsight.

The Rally in “Stuff” Rolls On

In this article, dated 7/10/2020, I noted that my “Stuff” Index was coming on strong and that its performance may be a “shot across the bow” that some changes may be coming to the financial markets.  Since then, the trend has accelerated.

STUFF vs. FANG vs. QQQ

Figure 1 displays the performance of STUFF components since 7/10

Figure 2 displays the performance of FANG components since 7/10

Figure 1 – Price performance of Jay’s STUFF Index components since 7/10

Figure 2 – Price performance of FANG stocks since 7/10

For the record, the “high-flying” Nasdaq 100 Index (using ticker QQQ as a proxy investment) is up +4.0% during the same time.

Is this a trend – or a blip?  Unfortunately, I can’t answer that question. But it certainly appears that there is something afoot in “Stuff”, particularly the metals.  Figure 3 displays the weekly charts for ETFs tracking Silver, Gold, Palladium and Platinum (clockwise from upper left). 

Figure 3 – The metals components of the Stuff Index (Courtesy AIQ TradingExpert)

When it comes bull markets in metals, the typical pattern historically goes something like this:

*Gold leads the way (check)

*Eventually silver comes on strong and often ends up outperforming gold (check)

*The other metals rise significantly “under the radar” as everyone focus on – literally in this case, ironically – the “shiny objects” (gold and silver)

Again, while I had inklings that a bull market in metals was forming (and have held positions in them for several years, and still hold them), I certainly did not “predict” the recent explosion in gold and silver prices. 

Two things to note:

*Gold and silver are obviously very “overbought”, so buying a large position here entails significant risk

*Still it should be noted that both SLV and PPLT would have to double in price from their current levels just to get back to their previous all-time highs of 2011

So, don’t be surprised if “Stuff” enjoys a continued resurgence.  Note in Figure 4 that a number of commodity related ETFs are way, way beaten down and could have a lot of upside potential if a resurgence actually does unfold.

Figure 4 – Four commodity ETFs weekly (Courtesy AIQ TradingExpert)

What is interesting – and almost not visible to the naked eye – is the action in the lower right hand corner of these four charts. To highlight what is “hiding in plain sight”, Figure 5 “zooms in” on the recent action of same four tickers as Figure 4, but in a daily price format rather than a monthly price format.

Figure 5 – Four commodity ETFs daily (Courtesy AIQ TradingExpert)

Despite the ugly pictures painted in Figure 4, it is interesting to note in Figure 5 that all four of these commodity related ETFs have rallied sharply of late.  There is of course, no guarantee this will continue.  But if the rally in “Stuff” – currently led by metals – spreads to the commodity sector as a whole, another glance in Figures 3 and 4 reveals a lot of potential upside opportunity.

Time will tell.  In the meantime, keep an eye on the “shiny objects” (gold and silver) for clues as to whether or not the rally in “Stuff” has staying power.

See also Jay Kaeppel Interviewin July 2020 issue of Technical Analysis of Stocks and Commodities magazine

See also Jay’s “A Strategy You Probably Haven’t Considered” Video

See also Video – The Long-Term…Now More Important Than Ever

Jay Kaeppel

Disclaimer: The information, opinions and ideas expressed herein are for informational and educational purposes only and are based on research conducted and presented solely by the author.  The information presented represents the views of the author only and does not constitute a complete description of any investment service.  In addition, nothing presented herein should be construed as investment advice, as an advertisement or offering of investment advisory services, or as an offer to sell or a solicitation to buy any security.  The data presented herein were obtained from various third-party sources.  While the data is believed to be reliable, no representation is made as to, and no responsibility, warranty or liability is accepted for the accuracy or completeness of such information.  International investments are subject to additional risks such as currency fluctuations, political instability and the potential for illiquid markets.  Past performance is no guarantee of future results.  There is risk of loss in all trading.  Back tested performance does not represent actual performance and should not be interpreted as an indication of such performance.  Also, back tested performance results have certain inherent limitations and differs from actual performance because it is achieved with the benefit of hindsight.

A Simple Way To Trade Seasonality


In “A Simple Way To Trade Seasonality” in the September 2019 Stocks & Commodities, author Perry Kaufman describes methods he uses for measuring the seasonality in markets and approaches he uses for trading these patterns

Editors note: The full article can be obtained from Stocks & Commodities magazine at
http://technical.traders.com/sub/sublog2.asp#Sep the system rules are from the article and are based on these rules

1. Average the monthly frequency of the past 4 years.

2. Find the last occurrence of the highest frequency and the last occurrence of the lowest frequency using the average frequency in step 1. That is, if both March and April have a frequency of 70, we use April.

3. Only trade if the high frequency is 75% or greater and the low frequency is 25% or lower.

4. If the high frequency comes first, sell short at the end of the month with the high frequency. Cover the short at the end of the month with the low frequency.

5. If the low frequency comes first, buy at the end of the month with the low frequency. Sell to exit at the end of the month with the high frequency

The importable AIQ EDS file and Excel spreadsheet for Perry Kaufman’s article can be obtained on request via email to info@TradersEdgeSystems.com. The code is also shown below

!A Simple Way to Trade Seasonality
!Author: Perry Kaufman, TASC September 2019
!Coded by: Richard Denning, 07/21/2019
!www.TradersEdgeSystem.com

C is [close].
year is 2019.
len is 4000.
OSD is offsettodate(month(),day(),year()).
FirstDate is firstdatadate().

EOM1 if Month()=2 and valresult(month(),1)=1 and year()=year.
EOMos1 is scanany(EOM1,len) then OSD+1.
EOMc1 is valresult(C,^EOMos1).
EOM2 if Month()=3 and valresult(month(),1)=2 and year()=year.
EOMos2 is scanany(EOM2,len) then OSD+1.
EOMc2 is valresult(C,^EOMos2).
EOM3 if Month()=4 and valresult(month(),1)=3 and year()=year.
EOMos3 is scanany(EOM3,len) then OSD+1.
EOMc3 is valresult(C,^EOMos3).
EOM4 if Month()=5 and valresult(month(),1)=4 and year()=year.
EOMos4 is scanany(EOM4,len) then OSD+1.
EOMc4 is valresult(C,^EOMos4).
EOM5 if Month()=6 and valresult(month(),1)=5 and year()=year.
EOMos5 is scanany(EOM5,len) then OSD+1.
EOMc5 is valresult(C,^EOMos5).
EOM6 if Month()=7 and valresult(month(),1)=6 and year()=year.
EOMos6 is scanany(EOM6,len) then OSD+1.
EOMc6 is valresult(C,^EOMos6).
EOM7 if Month()=8 and valresult(month(),1)=7 and year()=year.
EOMos7 is scanany(EOM7,len) then OSD+1.
EOMc7 is valresult(C,^EOMos7).
EOM8 if Month()=9 and valresult(month(),1)=8 and year()=year.
EOMos8 is scanany(EOM8,len) then OSD+1.
EOMc8 is valresult(C,^EOMos8).
EOM9 if Month()=10 and valresult(month(),1)=9 and year()=year.
EOMos9 is scanany(EOM9,len) then OSD+1.
EOMc9 is valresult(C,^EOMos9).
EOM10 if Month()=11 and valresult(month(),1)=10 and year()=year.
EOMos10 is scanany(EOM10,len) then OSD+1.
EOMc10 is valresult(C,^EOMos10).
EOM11 if Month()=12 and valresult(month(),1)=11 and year()=year.
EOMos11 is scanany(EOM11,len) then OSD+1.
EOMc11 is valresult(C,^EOMos11).
EOM12 if Month()=1 and valresult(month(),1)=12 and valresult(year(),1)=year.
EOMos12 is scanany(EOM12,len) then OSD+1.
EOMc12 is valresult(C,^EOMos12).
YEARavg is (EOMc1+EOMc2+EOMc3+EOMc4+EOMc5+EOMc6+EOMc7+EOMc8+EOMc9+EOMc10+EOMc11+EOMc12)/12.

AR1 is (EOMc1 / YEARavg-1)*100.
AR2 is (EOMc2 / YEARavg-1)*100.
AR3 is (EOMc3 / YEARavg-1)*100.
AR4 is (EOMc4 / YEARavg-1)*100.
AR5 is (EOMc5 / YEARavg-1)*100.
AR6 is (EOMc6 / YEARavg-1)*100.
AR7 is (EOMc7 / YEARavg-1)*100.
AR8 is (EOMc8 / YEARavg-1)*100.
AR9 is (EOMc9 / YEARavg-1)*100.
AR10 is (EOMc10 / YEARavg-1)*100.
AR11 is (EOMc11 / YEARavg-1)*100.
AR12 is (EOMc12 / YEARavg-1)*100.

EOMc if firstdate < makedate(1,20,2019-20).
AR if EOMc.

The EDS code is not a trading system but a way to get the data needed into an Excel spreadsheet to enable you to make the seasonal calculations. The EDS file should be run on a date after the end of the year being calculated. Each year for which data is needed must be run separately by setting the “year” variable. Multiple symbols can be run at the same time by using a list of the desired symbols. Each time a year is run, the “AR” report must be saved as a “.csv” file. Once all the years needed have been run and saved to separate “.csv” files, they all should be cut and pasted to a single Excel sheet. They then can be sorted by symbol and each symbol can be copied and pasted to a tab for that symbol.

Figure 6 shows the rolling four-year frequency for the S&P 500 ETF (SPY) and Figure 7 shows the annual trades resulting from applying the seasonal rules to the frequency data.

Sample Chart

FIGURE 6: AIQ. Shown here is the rolling four-year frequency for the SPY.

Sample Chart

FIGURE 7: AIQ. Shown here are the annual trades resulting from applying the seasonal rules to the frequency data for SPY.

—Richard Denning
info@TradersEdgeSystems.com
for AIQ Systems

Backtesting A Mean-Reversion Strategy In Python

The importable AIQ EDS file based on Anthony Garner’s article in May 2019 Stocks & Commodities “Backtesting A Mean-Reversion Strategy In Python,” can be obtained on request via email to info@TradersEdgeSystems.com. The code is also shown below.

I backtested the author’s mean-reversion system (MeanRev.eds) using both the EDS module, which tests every trade on a one-share basis, and also via the Portfolio Manager, which performs a trading simulation.

The short side strategy showed a loss overall in the EDS test so I tested only the long side in the Portfolio Manager. I selected trades using the z-score, taking the lowest values.

For capitalization, I used max of three trades per day with a max total of 10 open trades at one time, 10% allocated to each position. I did not deduct slippage but did deduct commissions. I used a recent list of the NASDAQ 100 stocks to run the test. The equity curve and account statistics report are shown in Figure 7.

Sample Chart

FIGURE 7: AIQ. This shows the equity curve (blue line) from long-only trading the NASDAQ 100 list of stocks from 1999 to March 15, 2019. The red line is the NDX index.

!Backtesting a Mean-Reversion Strategy In Python !Author: Anthony Garner, TASC May 2019 !Coded by: Richard Denning 3/14/19 !www.TradersEdgeSystems.com 

!ABBREVIATIONS:
C is [close].

!INPUTS:
meanLen is 10.
longZmult is -1.
shortZmult is 1.
meanMult is 10.

!FORMULAS:

SMA is simpleavg(C,meanLen).
LMA is simpleavg(C,meanLen*meanMult).
STD is sqrt(variance(C,meanLen)).
zScore is (C - SMA) / STD.

!TRADING SIGNALS & EXITS:

buyLong if zScore < longZmult and SMA > LMA.
sellShort if zScore > shortZmult and SMA < LMA.
exitLong if valresult(zScore,1) < -0.5 and zScore > 0.5.
exitShort if valresult(zScore,1) > 0.5 and zScore < -0.5.

showValues if 1.

—Richard Denning
info@TradersEdgeSystems.com
for AIQ Systems

The Agony and Ecstasy of Trend-Following

Let’s face it, many investors have a problem with riding a trend.  When things are going well they fret and worry about every blip in interest rates, housing starts, earnings estimates and the price of tea in China, which often keeps them from maximizing their profitability.  Alternatively, when things really do fall apart they suddenly become “long-term investors” (in this case “long-term” is defined roughly as the time between the current time and the time they “puke” their portfolio – just before the bottom).

Which reminds me to invoke:

Jay’s Trading Maxim #6: Human nature is a detriment to investment success and should be avoided as much as, well, humanly possible.

So, it can help to have a few “go to” indicators, to help one objectively tilt to the bullish or bearish side.  And we are NOT talking about “pinpoint precision timing” types of things here. Just simple, objective clues.  Like this one.

Monthly MACD

1

Figure 1 displays the S&P 500 index monthly chart with the monthly MACD Indicator at the bottom.Figure 1 – Monthly S&P 500 Index with MACD (Courtesy AIQ TradingExpert)

The “trading rules” we will use are pretty simple:

*If the Monthly MACD closes a month above 0, then hold the S&P 500 Index the next month

*If the Monthly MACD closes a month below 0, then hold the Barclays Treasury Intermediate Index the next month

*We start our test on 11/30/1970.

*For the record, data for the Barclays Treasury Intermediate Index begins in January 1973 so prior to that we simply used an annual interest rate of 1% as a proxy.

Figure 2 displays the equity curves for:

*The strategy just explained (blue line)

*Buying and holding the S&P 500 Index (orange) line

2

Figure 2 – Growth of $1,000 using MACD System versus Buy-and-Hold

Figure 3 displays some “Facts and Figure” regarding relative performance.

3

Figures 3 – Comparative Results

For the record:

*$1,000 invested using the “System” grew to $143,739 by 6/30/2019

*$1,000 invested using buy-and-hold grew to $102,569 by 6/30/2019

*The “System” experienced a maximum drawdown (month-end) of -23.3% and the Worst 5-year % return was +7.3% (versus a maximum drawdown of -50.9% and a Worst 5-year % return of -29.1% for Buy-and-Hold)

So, from the chart in Figure 2 and the data in Figure 3 it is “obvious” that using MACD to decide when to be in or out of the market is clearly “better” than buy-and-hold.  Right?  Here is where it “gets interesting” for a couple of reasons.

First off, the MACD Method outperforms in the long run by virtue of missing a large part of severe bear markets every now and then.  It also gets “whipsawed” more often than it “saves your sorry assets” during a big bear market.  So, in reality it requires ALOT of discipline (and self-awareness) to actually follow over time.

Consider this: if you were actually using just this one method to decide when to be in or out of the market (which is NOT what I am recommending by the way) you would have gotten out at the end of October 2018 with the S&P 500 Index at 2,711.74.  Now nine months later you would be sitting here with the S&P 500 Index flirting with 3,000 going “what the heck was I thinking about!?!?!?”  In other words, while you would have missed the December 2018 meltdown, you also would have been sitting in treasuries throughout the entire 2019 rally to date.

Like I said, human nature, it’s a pain.

To fully appreciate what makes this strategy “tick”, consider Figures 4 and 5. Figure 4 displays the growth of equity when MACD is > 0 (during these times the S&P 500 Index is held).

4

Figure 4 – Growth of $1,000 invested in S&P 500 Index when MACD > 0.

Sort of the “When things are swell, things are great” scenario.

Figure 5 displays the growth of $1,000 for both intermediate-term treasuries AND the S&P 500 Index during those times when MACD > 0.

5

Figure 5 – Growth of $1,000 invested in Intermediate-term treasuries (blue) and the S&P 500 (orange) when MACD < 0.

Essentially a “Tortoise and the Hare” type of scenario.

Summary

Simple trend-following methods – whether they involve moving average using price, trend lines drawn on charts or the MACD type of approach detailed herein – can be very useful over time.

*They can help an investor to reduce that “Is this the top?” angst and sort of force them to just go with the flowing while the flowing is good.

*They can also help an investor avoid riding a major bear market all the way to the bottom – which is a good thing both financially and emotionally.

But everything comes with a cost.  Trend-following methods will never get you in at the bottom nor out at the top, and you WILL experience whipsaws – i.e., times when you sell at one price and then are later forced to buy back at a higher price.

Consider it a “cost of doing business.”

Jay Kaeppel

Disclaimer:  The data presented herein were obtained from various third-party sources.  While I believe the data to be reliable, no representation is made as to, and no responsibility, warranty or liability is accepted for the accuracy or completeness of such information.  The information, opinions and ideas expressed herein are for informational and educational purposes only and do not constitute and should not be construed as investment advice, an advertisement or offering of investment advisory services, or an offer to sell or a solicitation to buy any security.