Investment Strategies / Mechanical Investing
No. of Recommendations: 17
One year GTR1 backtest results for standard SIPro screens (monthly hold 5) are below. Sorted by CAGR.
(From 20230707 to 20240708, 21 day hold, 0.4% friction, 5 deep.)
The short screen results have no friction and are held long (negative results are better).
I included blends of the short screens (20% short screen combined with 80% S&P 500 market cap weight index).
Average of all 51 long screens underperformed the S&P 500 indexes, but outperformed the S&P 1500 benchmark. There was a wide range of results, with CAGR ranging from -38 to 67. (Standard deviation of CAGR for the 51 screens was 20.)
Screen CAGR GSD Sharpe Beta AT
FCF26 67 29 1.88 1.7 5
Incoming_Cash 54 22 1.78 0.9 5
VG_Horse 48 43 1.09 1.2 6
Quality_Earnings 42 31 1.20 1.3 7
Blue_Skies 41 43 0.97 0.9 8
Small_Value 40 20 1.56 0.1 6
Fried_500 37 10 2.79 0.4 2
Dipstick 36 18 1.53 0.2 12
POI 33 37 0.87 1.5 7
Rabbitt 29 25 0.96 1.0 10
Value_at_the_Top 26 20 1.00 0.3 7
BI 24 22 0.82 0.6 11
VG_Zebra 22 38 0.59 1.0 7
Steady_Growth 20 11 1.27 0.6 2
3pt_Relative_Value 18 20 0.71 0.8 12
Shrinkage 17 16 0.75 0.6 2
HighOnVolume 16 37 0.36 1.0 12
HighRelativeValue 16 20 0.49 0.8 12
YldEarnYear_SI 15 22 0.52 0.3 7
LowPSplus 15 41 0.30 1.4 11
GS_PCF 14 23 0.43 0.8 11
LowPSvol 13 20 0.43 0.8 12
POG 12 30 0.34 1.5 6
LowMult 11 25 0.29 0.8 9
GS_Mungo 11 21 0.35 0.8 12
WK_Voom 11 28 0.32 0.5 8
Silver_Parachute 11 19 0.33 0.4 6
GS_X 11 23 0.20 0.9 10
GS_Mungo_Voom 10 21 0.28 0.8 12
Bob 8 19 0.21 0.9 2
ARS 6 14 0.11 0.4 8
Zweig_26 6 16 0.05 0.5 3
CANSLIM_26 5 22 0.05 1.3 8
Gentle_Screamers 5 30 0.03 1.3 12
Money_Flow 4 28 -0.05 0.7 9
Up5X3 3 25 -0.02 0.9 12
PS_ILoveYou 1 18 -0.21 0.6 7
Z26saTA 1 17 -0.25 0.6 3
78RPM 0 32 -0.13 1.2 8
NetNetsGrahamified -1 37 -0.18 1.2 5
Up5pct -3 29 -0.27 1.2 11
AdvancedHelper -4 30 -0.28 1.0 9
Turnarounds -6 31 -0.36 0.9 11
OptiMan -6 28 -0.34 1.3 2
Advanced -8 24 -0.64 0.7 9
GS_X2 -8 22 -0.66 0.8 9
RS_100 -8 25 -0.57 0.7 11
Melange -14 33 -0.59 1.4 7
SP_Peg -16 23 -1.05 1.4 5
PIH_Naked -24 49 -0.78 1.8 12
Microcap_Momentum -38 92 -0.76 2.1 11
The_Mirror_s 9 68 0.26 2.8 11
HIAR_s 3 43 0.05 2.1 10
Negative_FCF_s -13 43 -0.49 1.6 10
Current_Ratio_s -69 66 -2.48 1.7 9
Dilution_s -85 87 -3.26 1.1 9
blend_Dilution 62 15 3.32 0.6 1
blend_Current_Ratio 51 13 2.97 0.6 1
blend_Negative_FCF 30 11 2.12 0.6 1
blend_HIAR 26 9 2.03 0.5 1
blend_The_Mirror 24 13 1.51 0.4 1
SP500MktCapWeight 29 12 1.80 1.0 0
SP500EqualWeight 13 14 0.55 1.0 0
SP1500EqualWeight 10 17 0.31 1.1 0
Averages CAGR GSD Sharpe Beta AT
avgLongScreen 12 27 0.35 0.9 8
avgShortScreen -31 61 -1.18 1.8 10
avgShortBlend 39 12 2.39 0.5 1
avgIndex 17 14 0.89 1.0 0
No. of Recommendations: 0
Hi there.....is it possible to test the same over 2022-23 period ie 1 yr lookback to understand the forward consistency?
Thanks!
No. of Recommendations: 1
This great, thank you for doing this!
No. of Recommendations: 8
No. of Recommendations: 1
THANK YOU for this nugget: What I do is download daily Portfolio Values for each screen, and build a WWL backtest in Excel.
With regard to my barely-started resurrection of WWL in Sheets, the daily Portfolio Values download does 90% of the heavy lifting.
I'd be interested to read in email or a quick call the approach you took in Excel, if you'd be up for it.
FC
No. of Recommendations: 11
is it possible to test the same over 2022-23 period ie 1 yr lookback to understand the forward consistency?
Results for the previous period: from 20220707 to 20230707
Screen CAGR GSD Sharpe Beta AT Depth
3pt_Relative_Value 19 20 0.82 0.7 11 5
78RPM -21 36 -0.87 0.8 9 5
Advanced -18 29 -0.85 0.7 10 5
AdvancedHelper -17 36 -0.68 0.7 9 5
ARS 15 27 0.54 0.9 8 5
BI 1 21 -0.12 0.7 11 5
Blue_Skies -6 32 -0.30 0.8 8 5
Bob 16 29 0.56 1.2 6 5
CANSLIM_26 1 15 -0.19 0.4 5 4
Dipstick 34 38 0.86 0.8 11 5
FCF26 7 26 0.20 0.7 7 5
Fried_500 38 22 1.50 0.9 3 5
Gentle_Screamers 5 27 0.05 0.7 11 5
GS_Mungo -6 22 -0.45 0.5 11 5
GS_Mungo_Voom -7 22 -0.49 0.5 10 5
GS_PCF -17 26 -0.97 0.7 10 5
GS_X 9 22 0.34 0.7 11 5
GS_X2 -13 29 -0.62 1.0 10 5
HighOnVolume 16 30 0.38 0.7 11 5
HighRelativeValue 10 20 0.33 0.6 12 5
Incoming_Cash -7 30 -0.37 0.9 9 5
LowMult -6 30 -0.37 0.9 9 5
LowPSplus -3 39 -0.15 1.0 12 5
LowPSvol -7 22 -0.63 0.5 12 5
Melange 7 41 0.11 1.3 7 5
Microcap_Momentum -35 65 -0.86 0.6 11 5
Money_Flow -4 20 -0.43 0.4 5 3
NetNetsGrahamified -18 55 -0.35 0.9 5 5
OptiMan -5 31 -0.21 1.1 3 7
PIH_Naked -28 40 -1.14 0.8 12 5
POG 7 28 0.18 0.8 8 5
POI 1 40 0.02 1.0 9 5
PS_ILoveYou -1 31 -0.11 0.9 8 5
Quality_Earnings 20 31 0.65 0.9 7 5
Rabbitt 7 31 0.20 0.9 11 5
RS_100 -7 25 -0.47 0.6 10 5
Shrinkage -2 39 -0.04 1.5 3 5
Silver_Parachute 10 35 0.30 0.6 7 5
Small_Value 13 34 0.41 1.0 7 5
SP_Peg 18 26 0.63 0.8 4 5
Steady_Growth 3 20 0.01 0.8 5 4
Turnarounds -7 36 -0.23 1.2 11 5
Up5pct 43 32 1.21 1.0 10 5
Up5X3 30 27 1.03 0.9 11 5
Value_at_the_Top -4 31 -0.21 0.7 9 5
VG_Horse 2 26 0.01 0.9 7 5
VG_Zebra 4 19 0.04 0.5 5 3
WK_Voom -3 35 -0.10 0.7 8 5
YldEarnYear_SI -9 38 -0.30 0.7 5 5
Z26saTA 10 15 0.42 0.5 4 2
Zweig_26 23 14 1.33 0.5 4 2
Current_Ratio_s -39 78 -0.71 2.2 7 5
Dilution_s -64 66 -2.05 0.9 8 5
HIAR_s 43 43 0.83 1.2 10 5
Negative_FCF_s -12 58 -0.27 1.8 11 5
The_Mirror_s -12 74 -0.10 1.7 11 5
blend_Current_Ratio 24 17 1.35 0.6 1 na
blend_Dilution 27 17 1.35 0.7 1 na
blend_HIAR 2 16 -0.10 0.7 1 na
blend_Negative_FCF 14 14 0.74 0.6 1 na
blend_The_Mirror 15 15 0.75 0.6 1 na
SP500MktCapWeight 15 19 0.65 1.0 0 500
SP500EqualWeight 10 21 0.39 1.0 0 500
SP1500EqualWeight 9 24 0.32 1.1 0 1499
No. of Recommendations: 3
Thanks so much!
Here's my YoY comparison ( The table is horrible format!)
But here are the takeaways :
(1) If you considered the Top 15 Ranked from 2023 ONLY 4 Screens are in the Top in the current lookback
Fried 500 : Was 2 , Current 7
Dipstick : Was 3 , Current 8
I would presume - very similar screens
Quality Earnings : Was 6 Current 4
Small Value : Was 12 , Current 6
The TOP one ie FCF26 ( ie Free Cash Flow based) : Was 17, Current 1 ( This is the one I guess picks NVDA as a top stock)
(2) The BEST one from 2023 the Ups types had a TERRIBLE forward performance
UP5pct : Was 1, Current :41
Up5X3 : Was 4, Current : 36
These are just Momentum based ( price performance) I would guess and perform not upto par.
NET TAKEAWAY: Earnings stability seems to be mattering - at least in this window of performance
Best
Screen Prior CAGR 2022-23 Rank 2023-24 Rank Difference Current CAGR
Up5pct 43 1 41 -40 -3
Fried_500 38 2 7 -5 37
Dipstick 34 3 8 -5 36
Up5X3 30 4 36 -32 3
Zweig_26 23 5 32 -27 6
Quality_Earnings 20 6 4 2 42
3pt_Relative_Value 19 7 15 -8 18
SP_Peg 18 8 49 -41 -16
Bob 16 9 30 -21 8
HighOnVolume 16 10 17 -7 16
ARS 15 11 31 -20 6
Small_Value 13 12 6 6 40
HighRelativeValue 10 13 18 -5 16
Silver_Parachute 10 14 27 -13 11
Z26saTA 10 15 38 -23 1
GS_X 9 16 28 -12 11
FCF26 7 17 1 16 67
Melange 7 18 48 -30 -14
POG 7 19 23 -4 12
Rabbitt 7 20 10 10 29
Gentle_Screamers 5 21 34 -13 5
VG_Zebra 4 22 13 9 22
Steady_Growth 3 23 14 9 20
VG_Horse 2 24 3 21 48
BI 1 25 12 13 24
CANSLIM_26 1 26 33 -7 5
POI 1 27 9 18 33
PS_ILoveYou -1 28 37 -9 1
Shrinkage -2 29 16 13 17
LowPSplus -3 30 20 10 15
WK_Voom -3 31 26 5 11
Money_Flow -4 32 35 -3 4
Value_at_the_Top -4 33 11 22 26
OptiMan -5 34 44 -10 -6
Blue_Skies -6 35 5 30 41
GS_Mungo -6 36 25 11 11
LowMult -6 37 24 13 11
GS_Mungo_Voom -7 38 29 9 10
Incoming_Cash -7 39 2 37 54
LowPSvol -7 40 22 18 13
RS_100 -7 41 47 -6 -8
Turnarounds -7 42 43 -1 -6
YldEarnYear_SI -9 43 19 24 15
GS_X2 -13 44 46 -2 -8
AdvancedHelper -17 45 42 3 -4
GS_PCF -17 46 21 25 14
Advanced -18 47 45 2 -8
NetNetsGrahamified -18 48 40 8 -1
78RPM -21 49 39 10 0
PIH_Naked -28 50 50 0 -24
Microcap_Momentum -35 51 51 0 -38
No. of Recommendations: 3
No. of Recommendations: 10
I'd be interested to read in email or a quick call the approach you took in Excel, if you'd be up for it.GTR1 Universe Builder could be used:
http://www.datahelper.com/mi/search.phtml?nofool=y...I am using a more manual approach for now, because I am still developing the methods, and so want to see the intermediate results and be able to adjust parameters on a local computer. I will post links to some of these spreadsheets when I get a chance. There's nothing particularly special in these methods, they are just lots of straightforward calculations. (I hope to switch over to python at some point. The Excel files are about 30MB for 60 screens over 30 years, and so a reasonable computer setup is needed.)
My current workflow:
1. Use GTR1_Journal_2024.xlsm to generate results. Download portfolio values using the macro OpenURLs. (Journal old version is at
http://www.datahelper.com/mi/search.phtml?nofool=y... )
2. Use python code to average the cycles. (Averaging the monthly returns would be better.) (based on Volition's code at
http://www.datahelper.com/mi/search.phtml?nofool=y... )
3. Copy and paste the averaged portfolio results into Results.xlsb. Run a macro to generate look-back metrics and look-forward results.
4. Copy and paste the look-back metrics and look-forward results into BacktestWWL.xlsb with sheets:
LB: the look-back metric with a column "knownOn" and a column for each screen.
SR: the subsequent return with a column "buyDate" and a column for each screen.
picks: the SR for the top 10 screens.
sum: summary statistics
Chart1: a chart of the average SR and the top 10 picks SR.
No. of Recommendations: 11
I'd be interested to read in email or a quick call the approach you took in Excel, if you'd be up for it. Here is the Excel spreadsheet I use to backtest WWL (about 30MB). There are no macros. The formulas use the EXCEL function IFERROR to deal with missing data.
Look-back is 1 year. Look-forward is 21 market days. I chart excess return (monthly return minus benchmark return). This collection of screens worked until 2008, and WWL boosted the monthly returns even higher, but this collection has not worked since 2008.
This WWL backtest does not include the switching costs when moving from one screen to another.
Excel file MIscreenBacktest20240108.xlsb:
https://www.dropbox.com/scl/fi/1j9b8lagsm1zy2q2zyg...Chart image MIscreensWWLbacktest20240108.png:
https://www.dropbox.com/scl/fi/pjrlhusc34qlzztzjw0...The worksheet includes summary statistics on each screen: number of times picked (out of 9015 market days from 19880229 to 20231206), and average subsequent monthly excess return (compared to the Benchmark: S&P 1500 equal weight).
screen count avgER
VG_Horse 2942 2.3%
LowPSplus 2558 1.3%
NetNetsGrahamified 2240 1.4%
AdvancedHelper 2224 2.4%
HighOnVolume 1918 2.3%
YldEarnYear_SI 1895 1.3%
WK_Voom 1882 1.7%
Blue_Skies 1810 2.1%
Advanced 1600 1.2%
Silver_Parachute 1443 0.8%
78RPM 1430 2.3%
Fried_500 1408 0.2%
PSLove_You 1349 0.7%
POI 1289 0.4%
VG_Zebra 1218 0.2%
Microcap_Momentum 1214 0.0%
Shrinkage 1112 -0.3%
Low_Mult 1033 1.6%
3pt_Relative_Value 935 0.6%
POG 812 3.3%
RS_100 753 1.5%
FCF26 750 0.1%
OptiMan 664 -0.8%
Up5X3 649 0.1%
SP500MktCapWeight 644 0.4%
Dipstick 639 0.2%
Melange 634 -0.3%
Bob 606 -0.2%
Up_5pct 599 -0.7%
Gentle_Screamers 581 0.1%
GS_PCF 560 -1.0%
PIH_Naked 544 2.8%
Incoming_Cash 499 1.0%
Quality_Earnings 493 0.9%
High_Relative_Value 468 0.7%
Zweig_26 448 -2.4%
Rabbitt 415 -0.2%
SP500EqualWeight 396 0.1%
Steady_Growth 379 -0.4%
Small_Value 329 0.2%
CANSLIM_26 245 -0.8%
LowPSvol 202 0.3%
Z26saTA 192 -1.1%
Turnarounds 191 -0.5%
GS_Mungo 182 0.1%
GS_Mungo_Voom 170 -1.6%
ARS 158 -3.0%
Value_at_the_Top 143 -2.3%
Money_Flow 117 0.1%
GSX2 111 1.5%
GSX 97 0.9%
BI 57 -2.1%
SP_Peg 10 -0.2%
No. of Recommendations: 0
I know that what works lately is a very valid approach, but I would think what would be more helpful is a bunch of screens that have continued to work, post discovery and are fairly consistent in their returns. Maybe they don't exist?
No. of Recommendations: 5
I don't think they exist. Any screen producing consistent outperformance will fail at some point, as the trade gets discovered and crowded out.
The market is an adaptive system, changing every year, and so the collection of screens also needs to adapt. New screens are needed, but adding new screens shortens the post discovery period. A collection of screens cannot have both a long post discovery period and consistent outperformance.
A collection of screens has more statistical support than a single screen, and so underperformance is easier to identify. I suggest updating the collection once a year as needed to keep the average performance above some value. Each screen is a story, and so the collection changes will also tell a story. The story might be interesting even if the screen selection method is flawed.
No. of Recommendations: 5
Lizgdal - phenomenal spreadsheet and effort you've put into this! Well done!
I like the "forward excess return" approach and the S&P1500 benchmark, seems to all make sense.
To generate the daily values per screen, which of the cycle (start date) columns from GTR1 did you pick, or did you just average all of the 20? In looking at a few 5-deep screens over the last 10 years, there's some significant variance in results across all daily starts (aware that your sheet is 10 deep).
I think I'll take a stab at a version generating a couple of different lookbacks (6 months, 3 months) and focused on trailing 10-15 years results only, under the theory that what was happening prior to 08, esp pre-2000 bubble, has little relevance to current era.
Of note to your point about post-08 relative returns: in the 10 years 10-19, smallcaps lost to largecaps 7 times. The last time they beat large caps was 2016, and the underperformance has gotten worse the last 5 years.
Not to say a smallcap focused screen could beat the benchmark and beat largecaps, making it worth using, but with that kind of money tide flowing against the class it's more difficult. Which is why digging into what factors may be driving the results of the few stars is interesting, at least to me.
No. of Recommendations: 1
To generate the daily values per screen, which of the cycle (start date) columns from GTR1 did you pick, or did you just average all of the 20?
I averaged the 21 cycles (I used 21 day holds) using a python script. Using average 21-bar returns would be a better approach, and so need to update the python code.
No. of Recommendations: 6
Lizgdal Adding on to FlyingCircus’s praise, you certainly did a phenomenal job putting together
your spreadsheet!
When I did my WWL spreadsheet more than 15 years ago I did all my calculations using excel.
But more recently I’ve been using a python program “bt – Flexible Backtesting for Python”
It starts off by downloading either stock or ETF data from yahoo into a data frame but as you are
already using Python you probably already have the data in a data frame.
I have found it easier to put together various momentum schemes with bt than trying to use excel
and you have access no nice graphical tools to visualize the data.
Documentation
Flexible Backtesting for Python — bt 0.2.10 documentation (pmorissette.github.io)
http://pmorissette.github.io/btProgram
https://github.com/pmorissette/bt?tab=readme-ov-fi...
No. of Recommendations: 8
WWL can also be backtested using GTR1 Universe Builder, as discussed in this post:
http://www.datahelper.com/mi/search.phtml?nofool=y...I built a GTR1 Universe using the 51 MI long screens (10 deep, 0.4% friction, 21 day hold). (I started the universe with the latest starting date among all screens 20011231.) I ran these gtr1 WWL screens, downloaded portfolio values, averaged across the 21 cycles, and calculated excess 21-bar returns. I charted the results, and the results were almost identical to the Excel spreadsheet.
There are 51 base screens * 21 cycles = 1071 possible investments
{SIPscreens10deep20240716_ALL} picks all 1071 investments.
ScreenCAGR: avg(cagr(1,252),screen,step0)
ScreenCAGR >= -100
dspo(1) >= 252
{SIPscreens10deep20240716_cagr1yr_PICK5} picks 5 base screens * 21 cycles = 105 investments.
ScreenCAGR: avg(cagr(1,252),screen,step0)
ScreenCAGR >= -100
dspo(1) >= 252
ScreenCAGR top 105
SIPscreens10deep20240716_ALL
http://gtr1.net/2013/?!!QlpoMTFBWSZTWWTZomUAdcJfgH...SIPscreens10deep20240716_cagr1yr_PICK5
http://gtr1.net/2013/?!!QlpoMTFBWSZTWfS2UGMAdcvfgH...