FabTrader_Logo_Main
  • Home
  • Courses
    • Build Algo Trading Platform using Python Course
  • Store
  • Tools
  • Stories
  • About Me
₹0.00 0 Cart
Edit Content
FabTrader_Logo_Main
Welcome to FabTrader Community!

Course Dashboard
Store Account
Cart
Algo Trading Course
About Me
Store
Stories

Get in touch with me

hello@fabtrader.in

blog banner background shape images
  • FabTrader
  • April 4, 2025

Shankar Nath’s GARP Strategy fetched 115% return! How?

  • 7 min read
  • 493 Views
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:

FrameworkCriteriaBack 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 FrameworkMarket 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 FrameworkMarket 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 ApproachGrowth (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.

Donate

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.

FabTrader

Vivek is an algorithmic trader, Python programmer, and a passionate advocate of the F.I.R.E. (Financial Independence, Retire Early) movement. He achieved his financial independence at the age of 45 and is dedicated to helping others embark on their own journeys toward financial freedom.

Home
Store
Stories
Algo Trading Platform Using Python Course
About Me

©2024 Fabtrader.in - An unit of Rough Sketch Company. All Rights Reserved

Terms & Conditions
Privacy Policy
Shipping & Delivery
About and Contact
Refunds