01What this is
An independent replication of the three-timeframe Market Trend Model that David Keller, CMT, has described in his StockCharts articles. It reads the weekly S&P 500 and says whether the short, medium and long-term trend is up or down.
This is my implementation, built from his published descriptions. It is not affiliated with or endorsed by David Keller, Sierra Alpha Research or StockCharts. Where his articles leave something open, the decision is mine and is labelled as mine below.
02The rules as published
All three use weekly bars and exponential moving averages (EMAs):
Short term. The weekly close against its 5-week EMA.
Medium term. The 5-week EMA against the 13-week EMA. Keller treats this as his main gauge, with a horizon of one to three months.
Long term. The 21-week EMA against the 34-week EMA.
Above means bullish, below means bearish. He charts each comparison as a percentage price oscillator (PPO), read against zero.
Sources: My Market Trend Model is Pretty Bulled Up (2023-11-17), Short-Term Bearish Signal as Markets Brace for News-Heavy Week (2024-11-05), Market Trend Model Turns Bearish (2023-03-17).
03What I had to decide
The articles give the averages. Making them mechanical needed these choices:
Seeding the averages. Each EMA starts from a simple average of its first bars. That is the convention StockCharts documents in ChartSchool.
Warm-up. No reading is recorded before the 250th weekly bar, so the starting value's influence is negligible.
The week. A calendar week, closing on its last trading day. When Friday is a market holiday, Thursday's close is the week's close.
Finished weeks only. A week counts once it has closed. Nothing is read from a week still in progress.
No overwriting. Each run is stored alongside earlier runs rather than over them, so a changed input shows up as a revision.
What "SAR" means in his "SAR Market Trend Model" chart list is not stated anywhere I found. I have not guessed.
04Data
The input is the S&P 500 index daily close, published by S&P Dow Jones Indices through the Federal Reserve Bank of St. Louis (FRED series SP500). It is the index itself, not an ETF that tracks it, and nothing is substituted for it.
Index levels and moving-average values are not reproduced on this page. S&P's terms require permission to republish the index.
05How it is being validated
Each weekend I read the three PPO values off StockCharts' weekly chart of the S&P 500 and compare them with this model. A week passes only when all three directions agree and all three values agree to within 0.002.
Directions alone are not enough. On the first check I read a daily chart by mistake. It showed the same three directions as the weekly model, with quite different values. A direction-only test would have passed it.
The standard is eight consecutive finished weeks. A miss restarts the count and gets investigated. The formulas are not changed to make a week match.
Progress: 1 of 8 (week ending 2026-09-25: directions and values agree).
06Checks against Keller's own articles
These are six dated statements in his articles, run against this model's history:
Match. The medium term turned slightly negative on the 2023-03-10 close (reading his "Friday's close" as the Friday before the article's date). The medium term turned bullish on the 2023-11-17 close, putting all three up. The short term turned bearish on the 2024-11-01 close, with the medium and long term still bullish. And that was the fourth short-term bearish turn of 2024.
Open. He wrote that the long-term model had been bullish "since the end of May" 2023. This model turns it bullish on 2023-04-14. He also wrote that all three were bullish "for the first time since July". This model also has all three up for one week, 2023-09-01.
The one weekly reading so far (week ending 2026-09-25) agrees with StockCharts' weekly chart. Simple moving averages were also tested, and they fit his dated statements worse than exponential ones. The two open items may come down to how the articles were worded, but that is not shown, so they stay listed as open.
07What is not here, and why
There are no index levels and no chart values, for the licensing reasons above. There are no current readings from the model either: readings stay unpublished until validation passes, and whether to publish them then is a separate decision.
This page describes a method under test. It is not a trade signal.
08Status
Validating — run on real data, being checked against an outside reference. State as of 2026-09-26.
Research, not investment advice.