A small Python package that turns a US market scan workbook into a conviction-ranked shortlist, a quant CSV/JSON and an equal-weight paper portfolio. On 23 October 2026 I ranked a freshly built scan of the 300 most liquid US stocks, with prices to the 21 October 2026 session. Research and education only; not investment advice.
Open-Source Tools · How-To · Markets research
How to use us-stock-picks: a multi-screen ranking of US stocks with paper-portfolio output
Revised
· v1.0.0 · what changed
Code: github.com/herrrickshaw/us-stock-picks
Watch the walkthrough
Watch on YouTube: youtu.be/-xmjl_d2xLg
Why it is useful
- Self-directed researchers and students who want to see how Darvas breakout, Piotroski, Coffee Can, Magic Formula and momentum screens can be combined into one score get a readable, auditable implementation.
- It replaces juggling separate screens: one run gives a sector-capped shortlist, a full ranked CSV and a paper-portfolio file with transparent screen hits for each name.
- Evidence from the run: a fresh scan of the 300 most liquid US stocks was ranked end to end in under three seconds: 256 passed the liquidity gate, 181 were ranked (24 CORE, 31 QUALITY, 50 MOMENTUM, 76 WATCH).
- It also shows how fragile a rank is: an earlier attempt with fundamentals missing for 162 of the 300 names produced a different top 15 (12 CORE names, not 24). Missing data silently becomes 'screen not passed', so check coverage before reading the list.
What it is for
us-stock-picks (package us_stock_picks) reads the newest us_full_scan_*.xlsx workbook, applies a liquidity gate (price at least $5, turnover at least $2 million a day), scores ten screens with fixed weights, assigns each stock to a sleeve (CORE, QUALITY, MOMENTUM, WATCH), caps names per sector, and writes HTML, CSV and JSON outputs.
The scan workbook comes from a separate pipeline that is not in this repo. For this run I built one with the Darvas, golden-cross, five fundamental screens and machine-learning stages of the author's sibling BazaarTalks scanner, fed with cached prices (to the 21 October 2026 session) for the 300 most liquid US non-ETF stocks and live fundamentals from Yahoo Finance. A small adapter added turnover, a liquidity tier and an above-EMA50 flag, and I named the file with the session date so the as-of label is right.
Not available in my workbook: the Quality score and grade, the 'Actionable' flag, so those two screens never fire. The full 7,500-stock universe was not scanned.
Who it is for
- Students learning multi-factor screening
- Researchers who want a transparent, reproducible ranking recipe
- Developers building a screening report from tabular scan data
- Investment advice: this is not investment advice, and nothing here is a recommendation to buy or sell
- Live trading signals: the committed outputs are dated 24 July 2026
- Running as-is without an upstream scan workbook or a long --refresh data pull
What you need
| Requirement | Why | How to get it |
|---|---|---|
| Python 3 with pandas, numpy, openpyxl | Listed in requirements.txt (pandas>=2.0, openpyxl>=3.1, numpy>=1.24) | pip install -r requirements.txt |
| A us_full_scan_*.xlsx workbook with All_Stocks and All_Fundamentals sheets | The engine ranks an existing scan; none is committed. Needed columns include Symbol, LTP, Turnover_USD, Liquidity_Tier, Darvas_Signal, Piotroski_Score, CoffeeCan, MagicFormula, BullCartel | Produce one with a scan pipeline, or use --refresh (slow, network) per the README |
Get the code and an AI assistant
You do not have to be a programmer. Get the repository, give it to an AI assistant, and ask in plain language. Any of these routes works:
| Tool | What you need | Best for |
|---|---|---|
| GitHub | Free account to fork or star; git to clone, or the green Code button, then Download ZIP, or open in Codespaces | Getting the code and keeping up with updates |
| Claude Code | Claude subscription or API key; run claude inside the cloned folder | Letting the AI read and run the whole repo |
| Gemini CLI | Google account; run gemini inside the cloned folder | The same hands-on workflow with Gemini |
| Claude.ai, Gemini or ChatGPT in the browser | A chat account; upload README.md and the files you care about (or paste the output of git ls-files) | Understanding the project and asking questions without installing anything |
| Other tools (Copilot Chat, Cursor, Codex CLI) | Open the cloned folder in the tool and point it at README.md first | Editing and extending the code |
git clone https://github.com/herrrickshaw/us-stock-picks.git
cd us-stock-picks
claude # or: gemini
Install
- Clone the repository
git clone https://github.com/herrrickshaw/us-stock-picks.git cd us-stock-picks - Create an environment and install dependencies
python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt
Quick start: commands and what you should see
See all options
python -m us_stock_picks --help
Usage text listing --scan, --top, --max-per-sector, --portfolio-size, --min-price, --min-turnover, --refresh and --open.
Rank a scan workbook
python run_us_picks.py --scan path/to/us_full_scan_YYYYMMDD_HHMM.xlsx --top 15 --max-per-sector 3 --out outputs
Prints a summary (as of, universe, liquid, ranked, sleeves) and the shortlist; writes HTML, CSV, JSON and paper-portfolio files. On 23 Oct 2026: as of 2026-10-21, universe 300, liquid 256, ranked 181. Note: python -m us_stock_picks works only if the repo root is on the path.
Inspect the committed outputs without any data pull
python3 -c "import json;print(json.load(open('outputs/us_picks_latest.json'))['summary'])"
A dictionary with as_of, universe_n, liquid_n, ranked_n and sleeve_counts.
Sample outputs
Real output from a run on the date shown in the sources line; trimmed to fit.
Run summary from the 23 Oct 2026 re-run (as of 2026-10-21)
python run_us_picks.py --scan us_full_scan_20261021_0000.xlsx
as of: 2026-10-21 00:00
universe: 300
liquid: 256
ranked: 181
sleeves: {'WATCH': 76, 'MOMENTUM': 50, 'QUALITY': 31, 'CORE': 24}
Old committed run (24 Jul 2026): universe 5,814, liquid 1,623, ranked 721, CORE 103 / QUALITY 82 / MOMENTUM 330 / WATCH 206. The universes differ by design (300 versus 5,814), so the counts are not comparable.
Shortlist format sample (illustrative mechanical output, not advice)
outputs/us_investor_picks_latest.csv
rank ticker (exchange) sleeve score screens
1 GD (NYSE) CORE 62.3 4
2 TT (NYSE) CORE 61.0 4
3 TEAM (NASDAQ) CORE 60.7 5
4 ADSK (NASDAQ) CORE 60.7 5
5 INTU (NASDAQ) CORE 60.3 4
6 LLY (NYSE) CORE 55.7 4
Mechanical screen output on a 300-stock universe, shown only to illustrate the file format. Not investment advice and not a recommendation. Quality and Actionable screens were unavailable.
Screens passed per ranked stock (quant file, 100 rows)
value_counts on screens_passed
2 screens: 20
3 screens: 55
4 screens: 22
5 screens: 3
No stock passed six or more screens, versus six for the top names in the committed July file, which had the Quality and Actionable screens.
Config: conviction weights (us_stock_picks/config.py)
breakout 18 | piotroski_strong 16 | coffee_can 14 | magic_formula 10 | bull_cartel 10
golden_cross 10 | quality_ab 8 | actionable 6 | ml_bullish 5 | above_ema50 3
CORE needs score >= 48 and >= 2 screens
Weights are the author's choices and are not backtested in this repo.
Ways to use it
| Method | How it works |
|---|---|
| Command line | python -m us_stock_picks with your own scan workbook; tune filters with --min-turnover, --top and --max-per-sector. |
| Read the CSVs | Open the ranked CSV in a spreadsheet to see which screens each name passed. |
| Edit the weights | Change WEIGHTS in config.py and compare how the ranking moves. |
| Through an AI assistant | Open the clone in Claude Code or Gemini CLI, or upload README.md and a CSV to a chat assistant. |
Sample prompts for your AI assistant
Copy, paste and edit the parts in [brackets].
- Explain how conviction_score is computed in us_stock_picks/engine.py and config.py, with a worked example for one row of the ranked CSV.
- Using outputs/us_quant_ranked_latest.csv, show how many names pass each screen and which pairs of screens overlap most.
- Which names in the shortlist have a BEARISH ML_Direction but a high conviction score? What does that disagreement suggest about the weights?
- Suggest a backtest design to test whether the CORE sleeve beats an index, listing the biases to avoid.
- Draft a plain-English disclaimer and data-freshness note for sharing this output with a study group.
Limits and honest caveats
- Not investment advice. This is mechanical screen output for research and education; screens fail in regime changes.
- Data date: prices run to the 21 October 2026 session (the US panel has no 22 October bar) and fundamentals are Yahoo Finance values fetched on 23 October 2026. The cached price panel has missing sessions on many recent days, so Darvas boxes and moving averages on it are approximate.
- The scan covered only the 300 most liquid US non-ETF stocks, built by an adapter, not the author's 5,800-stock scan. Quality and Actionable screens were missing, so ranks are not comparable with the committed July outputs.
- Missing data silently counts as 'screen not passed': an earlier run with fundamentals missing for 162 names gave a different top 15. Per the README, the 'as of' date comes from the workbook filename, so I named it with the session date.
- Extreme or contradictory fields pass through uncleaned, and conviction weights are the author's choices, not validated by any backtest in this repo.
Sources: the us-stock-picks README, requirements.txt, us_stock_picks/config.py and code, run on 23 October 2026 in a scratch clone and throwaway virtual environment on a scan workbook built from cached US prices (last session 21 October 2026) and Yahoo Finance fundamentals. Only derived aggregates and format samples shown.
- v1.0.0 — 23 October 2026 — first published.
About this article: Researched, written and edited by Umashankar Triplicane Dwarakanathan, with AI research assistance; every figure is meant to trace to the primary source cited. See the Editorial Policy for how sourcing, AI use and corrections work.