An automated stock screening system which isolates and ranks top-tier growth companies based on relative strength, liquidity, trend, revenue growth, and institutional demand.
- Five distinct screen iterations based on time-tested criteria for predicting stock super-performance.
- RS Ratings calculated using methodology from William O'Neil Securities.
- Stage-2 uptrend criteria derived from strategies of U.S. investing champions Mark Minervini and Oliver Kell.
- Revenue growth sourced directly from the SEC's EDGAR XBRL data APIs.
- Customizable screen settings for fine-tuning.
- Rapid web scraping using asynchronous requests.
- Parsable JSON outfiles for evaluation of screen criteria.
- Colorful logging in the terminal.
- Easy-to-access .csv outfiles storing screen results.
- Support for Linux, Mac, and Windows.
- Tested on Ubuntu 22.04.3, macOS Sonoma 14.5 (23F79), and Windows 11 22H2.
First, ensure that you have Python 3.11+ and Firefox installed.
Note for Mac users: Python now includes its own private copy of OpenSSL and no longer uses Apple-supplied OpenSSL libraries. After installing Python, navigate to your
Applications/Python X.XX/
folder and double-clickInstall Certificates.command
.
Note for Linux users: the 'snap' version of Firefox that comes pre-installed may cause issues when running Selenium. To troubleshoot, follow these instructions to install Firefox via 'apt' (not snap).
Next, navigate to the directory where you would like to install the screener, and run the following commands in a terminal application:
git clone https://github.com/starboi-63/growth-stock-screener.git
cd growth-stock-screener
pip3 install -r requirements.txt
python3 growth_stock_screener/run_screen.py
To customize screen settings, modify values in settings.py.
Screen results are saved in .csv format in the project root directory, and can be opened with software like Excel.
By default, the screener attempts to calculate an ideal number of concurrent broswer instances to create based on the number of CPU cores present on your machine. In rare cases, this number may be too high. If you notice failed stock symbols with errors such as Browsing context has been discarded
, Tried to run command without establishing a connection
, WebDriver session does not exist
, or Failed to decode response from marionette
during the trend or institutional accumulation iterations, you are likely creating too many browser instances at once.
Consider decreasing the value of threads
in settings.py to 1-3 if you are experiencing this.
An initial list of stocks from which to screen is sourced from NASDAQ.
Then, the following screen iterations are executed sequentially:
The market's strongest stocks are determined by calculating a raw weighted average percentage price change over the last
These raw values are then assigned a percentile rank from
All micro-cap companies and thinly traded stocks are filtered out based on the following criteria:
All stocks which are not in a stage-two uptrend are filtered out. A stage-two uptrend is defined as follows:
Only the most rapidly growing companies with high revenue growth are allowed to pass this iteration of the screen. Specifically,
the percent increase in the most recent reported quarterly revenue versus a year ago must be at least
The current market often factors in future revenue growth; historically, this means certain exceptional stocks have exhibited super-performance without having strong on-paper revenue growth (examples include NVDA, UPST, PLTR, AI, etc.). To ensure that these stocks aren't needlessly filtered out, a small exception to revenue criteria is added: stocks with an
Any stocks with a net-increase in institutional-ownership are marked as being under accumulation. Institutional-ownership is measured by the difference in total inflows and outflows in the most recently reported financial quarter. Since this information lags behind the current market by a few months, no stocks are outright eliminated based on this screen iteration.