| name | stock-screener |
| description | Filter and screen stocks by financial metrics like P/E ratio, market cap, dividend yield, and growth rates. Analyze and compare stocks from CSV data. |
Stock Screener
Filter stocks by financial metrics and perform comparative analysis.
Features
- Multi-Metric Filtering: P/E, P/B, market cap, dividend yield, etc.
- Custom Screens: Save and reuse filter combinations
- Comparative Analysis: Side-by-side stock comparison
- Sector Analysis: Group and analyze by sector
- Ranking: Score and rank stocks by criteria
- Export: CSV, JSON, formatted reports
Quick Start
from stock_screener import StockScreener
screener = StockScreener()
screener.load_csv("stocks.csv")
results = screener.filter(
pe_ratio=(0, 20),
market_cap_min=1e9,
dividend_yield_min=2.0
)
print(results)
CLI Usage
python stock_screener.py --input stocks.csv --pe-max 20 --div-min 2.0
python stock_screener.py --input stocks.csv --pe 5 25 --pb-max 3 --cap-min 1B
python stock_screener.py --input stocks.csv --sector Technology --pe-max 30
python stock_screener.py --input stocks.csv --rank-by dividend_yield --top 20
python stock_screener.py --input stocks.csv --compare AAPL MSFT GOOGL
python stock_screener.py --input stocks.csv --pe-max 15 --output screened.csv
Input Format
Stock CSV
symbol,name,sector,price,pe_ratio,pb_ratio,market_cap,dividend_yield,eps,revenue_growth,profit_margin
AAPL,Apple Inc,Technology,175.50,28.5,45.2,2.8e12,0.5,6.16,8.5,25.3
MSFT,Microsoft,Technology,380.00,35.2,12.8,2.8e12,0.8,10.79,12.3,36.7
JNJ,Johnson & Johnson,Healthcare,155.00,15.2,5.8,3.8e11,2.9,10.20,5.2,22.1
API Reference
StockScreener Class
class StockScreener:
def __init__(self)
def load_csv(self, filepath: str) -> 'StockScreener'
def load_dataframe(self, df: pd.DataFrame) -> 'StockScreener'
def filter(self, **criteria) -> pd.DataFrame
def filter_by_sector(self, sectors: List[str]) -> 'StockScreener'
def filter_by_metric(self, metric: str, min_val: float = None,
max_val: float = None) -> 'StockScreener'
def value_screen(self) -> pd.DataFrame
def growth_screen(self) -> pd.DataFrame
def dividend_screen(self) -> pd.DataFrame
def quality_screen(self) -> pd.DataFrame
def custom_screen(self, criteria: ) -> pd.DataFrame
() -> pd.DataFrame
() -> pd.DataFrame
() -> pd.DataFrame
() ->
() -> pd.DataFrame
() -> pd.DataFrame
() ->
() ->
() ->
Filtering Criteria
Valuation Metrics
screener.filter(
pe_ratio=(5, 20),
pb_ratio_max=3.0,
ps_ratio_max=5.0,
peg_ratio_max=1.5
)
Size Metrics
screener.filter(
market_cap_min=1e9,
market_cap_max=10e9,
revenue_min=500e6
)
Income Metrics
screener.filter(
dividend_yield_min=2.0,
dividend_yield_max=8.0,
payout_ratio_max=75
)
Growth Metrics
screener.filter(
revenue_growth_min=10,
earnings_growth_min=15,
eps_growth_min=10
)
Quality Metrics
screener.filter(
profit_margin_min=15,
roe_min=15,
debt_to_equity_max=1.0,
current_ratio_min=1.5
)
Preset Screens
Value Screen
results = screener.value_screen()
Growth Screen
results = screener.growth_screen()
Dividend Screen
results = screener.dividend_screen()
Quality Screen
results = screener.quality_screen()
Stock Comparison
comparison = screener.compare(["AAPL", "MSFT", "GOOGL"])
Ranking and Scoring
Rank by Single Metric
top_dividend = screener.rank_by("dividend_yield", ascending=False).head(20)
Composite Scoring
scores = screener.score_stocks({
"pe_ratio": -0.2,
"dividend_yield": 0.3,
"profit_margin": 0.3,
"revenue_growth": 0.2
})
Percentile Ranking
ranked = screener.percentile_rank(["pe_ratio", "dividend_yield", "profit_margin"])
Sector Analysis
sector_stats = screener.sector_summary()
Example Workflows
Find Undervalued Dividend Stocks
screener = StockScreener()
screener.load_csv("sp500.csv")
results = screener.filter(
pe_ratio=(5, 15),
dividend_yield_min=3.0,
payout_ratio_max=70,
profit_margin_min=10
)
top = results.sort_values("dividend_yield", ascending=False).head(10)
print(top[["symbol", "name", "pe_ratio", "dividend_yield", "payout_ratio"]])
Growth at Reasonable Price (GARP)
results = screener.filter(
revenue_growth_min=15,
earnings_growth_min=15,
peg_ratio_max=1.5,
pe_ratio_max=25
)
Sector Comparison
tech = screener.filter_by_sector(["Technology"]).filter(
market_cap_min=10e9,
profit_margin_min=15
)
comparison = screener.compare(tech["symbol"].head(5).tolist())
Output Format
CSV Export
screener.filter(pe_ratio_max=20).to_csv("value_stocks.csv")
JSON Export
screener.filter(dividend_yield_min=3).to_json("dividend_stocks.json")
Summary Report
report = screener.summary_report()
Dependencies
- pandas>=2.0.0
- numpy>=1.24.0