Introduction
GARP (Growth at a Reasonable Price) investing is a strategy that sits between value investing and growth investing, aiming to balance growth potential with reasonable valuation metrics. Popularized by legendary investor Peter Lynch, GARP seeks to identify companies where growth is undervalued rather than simply searching for cheap stocks.
In this article, I will revisit the GARP framework put forth by one of my favorite financial educator and YouTuber, Shankar Nath. He has done an excellent job of analyzing multiple frameworks already in vogue and has come forth with his own version, which, based on his back test, had yielded a whopping 115% return per year and managed to beat all other methodology.
I have built an automated python screen that will download the eligible stocks based on his framework and am hoping it will be of some use to you! In the video below, I also share my current profit/loss position of a small portfolio that I built using this method and promise to keep you posted on the progress every quarter, as part of my re-balancing ritual! Read on….
Understanding GARP Investing
Value Investing:
- Focuses on companies trading below their intrinsic value.
- Asks: “What is the stock worth today?”
- Associated with Benjamin Graham’s investment philosophy.
Growth Investing:
- Seeks companies with above-average growth potential.
- Asks: “What will the stock be worth a few years from now?”
- Linked to Philip Fisher’s investment strategy.
GARP Investing:
Focuses on companies whose growth is underpriced rather than simply cheap companies.

The PEG Ratio: A Core Component of GARP
One of the key metrics in GARP investing is the PEG ratio, calculated as:
PEG = Price-to-Earnings (PE) Ratio / EPS Growth Rate
- PEG < 1: Undervalued stock
- PEG = 1: Fairly valued stock
- PEG > 1: Overvalued stock
Traditional growth investing primarily focuses on Earnings Per Share (EPS), but this approach has flaws. A company’s growth rate changes over time, making EPS an inconsistent measure. Instead, GARP investors consider revenue growth alongside the PEG ratio for a more comprehensive valuation.
GARP Strategies Explored by Shankar Nath
Shankar Nath, a well-known YouTuber, explored multiple GARP investing methodologies. Here’s a breakdown of his analysis:
Framework | Criteria | Back Test Results |
Traditional GARP Screening Approach | (Historical PE 3 Year / EPS Growth 3 years) > 0 and (Historical PE 3 Year / EPS Growth 3 years) < 1 and (EPS last year / EPS preceding year) > 20% and Market Cap > 10000 | 83 stocks selected with 113% annual return, with no stocks delivering negative returns |
SOIC GARP Framework | Market Cap > 50000 crores and YOY Quarterly sales growth > 15% and YOY Quarterly profit growth > 20% and Price to Earning < 30 | 47 stocks selected with 110% annual return |
Economic Times Framework | Market Cap > 1000 and Sales > 1000 and Profit growth 5 years > 15% and Expected Quarterly net profit > Net profit 3 quarters back and PEG ration < 1 | 131 stocks selected with a sample analysis of 10 stocks showed a 51% annual return |
S&P 500 GARP Index Approach | Growth (EPS and sales-per-share growth rates) Quality (financial leverage, return on equity) Value (earnings-to-price ratio) | No back test was conducted for this model. |
Shankar Nath’s Optimized GARP Strategy
Based on learnings from the above methods, Shankar Nath created his own GARP methodology with the following criteria:

- Market Cap > 1,000 crores
- Sales Revenue > 1,000 crores
- PEG Ratio between 0 and 2
- Sales Growth:
- Last year > 15%
- 3-year CAGR > 15%
- 5-year CAGR > 15%
- EPS Growth:
- Last year > 15%
- 3-year CAGR > 15%
- 5-year CAGR > 15%
- EPS (Last Year / Preceding Year) > 1.15
- Expected Quarterly Net Profit > Net Profit 2 Quarters Ago
Backtest Result:
- 27 stocks selected
- 115% annual return, outperforming all previous strategies
Python Implementation of the automated Screener
I have built this automated python screener that can fetch stocks per strategy rules with a single click of a button! I have included along with it 3,6,12 month returns for each of those stocks. Depending on your investment horizon, one could choose to select the stocks that have delivered the maximum return for that time period chosen. Try this out and let me know if its useful
PS: This is not investment advice. This is just an automation script and hence should not be construed as advice. Consult your financial advisor before taking any investing decision.
""" Automated Screener for Fetching GARP Strategy Reference: Refer to Shankar Nath's GARP Investing video for detailed rules -- Dependencies to be installed -- pip install beautifulsoup4==4.11.2 pip install openpyxl pip install pandas Disclaimer: The information provided is for educational and informational purposes only and should not be construed as financial, investment, or legal advice. The content is based on publicly available information and personal opinions and may not be suitable for all investors. Investing involves risks, including the loss of principal. Credits / Courtesy : Shankar Nath Queries on feedback on the python screener can be sent to : FabTrader (fabtraderinc@gmail.com) www.fabtrader.in YouTube: @fabtraderinc X / Instagram / Telegram : @fabtraderinc """ import time import pandas as pd def fetchScreenerData(link): cache_index = None data = pd.DataFrame() current_page = 1 page_limit = 100 while current_page < page_limit: if current_page == 1: url=link else: url = f'{link}?page={current_page}' all_tables = pd.read_html(url, flavor='bs4') combined_df = pd.concat(all_tables) combined_df = combined_df.drop( combined_df[combined_df['S.No.'].isnull()].index) if len(combined_df.index) < 26: data = pd.concat([data, combined_df], axis=0) break data = pd.concat([data, combined_df], axis=0) current_page += 1 time.sleep(1) data = data.iloc[0:].drop(data[data['S.No.'] == 'S.No.'].index) return data pd.set_option("display.max_rows", None, "display.max_columns", None) # Fetch 3 month return garp3_link = 'https://www.screener.in/screens/2115435/garp3months/' garp3_df = fetchScreenerData(garp3_link) garp3_df = garp3_df[['Name', 'CMP Rs.', '3mth return %']] garp3_df['CMP Rs.'] = pd.to_numeric(garp3_df['CMP Rs.'], errors='coerce') garp3_df['3mth return %'] = pd.to_numeric(garp3_df['3mth return %'], errors='coerce') garp3_df = garp3_df[garp3_df['3mth return %'] > 0] garp3_df.dropna(inplace=True) # Fetch 6 month return garp6_link = 'https://www.screener.in/screens/2115440/garp6months/' garp6_df = fetchScreenerData(garp6_link) garp6_df = garp6_df[['Name','6mth return %']] garp6_df['6mth return %'] = pd.to_numeric(garp6_df['6mth return %'], errors='coerce') garp6_df = garp6_df[garp6_df['6mth return %'] > 0] garp6_df.dropna(inplace=True) # Fetch 1 year return garp12_link = 'https://www.screener.in/screens/2115445/garp12months/' garp12_df = fetchScreenerData(garp12_link) garp12_df = garp12_df[['Name','1Yr return %']] garp12_df['1Yr return %'] = pd.to_numeric(garp12_df['1Yr return %'], errors='coerce') garp12_df = garp12_df[garp12_df['1Yr return %'] > 0] garp12_df.dropna(inplace=True) # Merge 3 / 6 / 12 Months Returns data into a single dataset merged_df = pd.merge(garp3_df, garp6_df, on='Name', how='inner') merged_df = pd.merge(merged_df, garp12_df, on='Name', how='inner') merged_df.dropna(inplace=True) # Sort by 6 months return merged_df.to_excel('D:/garp.xlsx', index=False) merged_df = merged_df.sort_values(by=['6mth return %'], ascending=False) # Save final result in an excel merged_df.to_excel('D:/garp.xlsx', index=False) print(merged_df)
Conclusion:
GARP investing offers a powerful approach to stock selection, bridging the gap between growth and value investing. By considering the PEG ratio alongside revenue and profit growth, investors can better assess stocks with strong upside potential while avoiding overvaluation. Shankar Nath’s optimized GARP strategy demonstrated the highest backtested returns, making it a compelling methodology for investors looking for a balanced growth approach.
Support this community : FabTrader.in is a one-person initiative dedicated to helping individuals on their F.I.R.E. journey. Running and maintaining this community takes time, effort, and resources. If you’ve found value in the content, consider making a donation to support this mission.
Disclaimer: The information provided in this article is for educational and informational purposes only and should not be construed as financial, investment, or legal advice. The content is based on publicly available information and personal opinions and may not be suitable for all investors. Investing involves risks, including the loss of principal. Always conduct your own research and consult a qualified financial advisor before making any investment decisions. The author and website assume no liability for any financial losses or decisions made based on the information presented.