关于 stock-screener
Stock Screener 是用于按财务指标筛选股票并比较结果的 Python 工具和命令行程序。它支持可复用筛选条件、行业分析、排名和导出,适合基于 CSV 文件或 dataframe 分析股票数据。
主要功能
- 01按估值、规模、收益、增长和质量指标筛选
- 02保存并复用自定义筛选条件
- 03并排比较股票
- 04按行业汇总数据
- 05按指标或综合评分排名
- 06导出 CSV、JSON 或报告
适用场景
- 01查找符合价值或增长条件的股票
- 02比较同一行业的候选股票
- 03使用加权指标为股票排名
- 04导出筛选结果以供进一步分析
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dkyazzentwatwa/ chatgpt-skills --skill stock-screener安装后在 Claude Code 中输入/stock-screener确认已加载。
附带文件scripts/requirements.txtscripts/stock_screener.py
详细介绍
股票筛选器
根据财务指标筛选股票并进行比较分析。
功能
- 多指标筛选:市盈率、市净率、市值、股息率等。
- 自定义筛选:保存并重复使用筛选条件组合
- 比较分析:并排比较股票
- 行业分析:按行业分组和分析
- 排名:根据标准对股票评分和排名
- 导出:CSV、JSON、格式化报告
快速开始
from stock_screener import StockScreener
screener = StockScreener()
# Load stock data
screener.load_csv("stocks.csv")
# Apply filters
results = screener.filter(
pe_ratio=(0, 20),
market_cap_min=1e9,
dividend_yield_min=2.0
)
print(results)
CLI 用法
# Basic screening
python stock_screener.py --input stocks.csv --pe-max 20 --div-min 2.0
# Multiple filters
python stock_screener.py --input stocks.csv --pe 5 25 --pb-max 3 --cap-min 1B
# Sector filter
python stock_screener.py --input stocks.csv --sector Technology --pe-max 30
# Rank by metric
python stock_screener.py --input stocks.csv --rank-by dividend_yield --top 20
# Compare specific stocks
python stock_screener.py --input stocks.csv --compare AAPL MSFT GOOGL
# Export results
python stock_screener.py --input stocks.csv --pe-max 15 --output screened.csv
输入格式
股票 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 参考
StockScreener 类
class StockScreener:
def __init__(self)
# Data Loading
def load_csv(self, filepath: str) -> 'StockScreener'
def load_dataframe(self, df: pd.DataFrame) -> 'StockScreener'
# Filtering
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'
# Screening Presets
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: Dict) -> pd.DataFrame
# Analysis
def compare(self, symbols: List[str]) -> pd.DataFrame
def rank_by(self, metric: str, ascending: bool = True) -> pd.DataFrame
def sector_summary(self) -> pd.DataFrame
def metric_distribution(self, metric: str) -> Dict
# Scoring
def score_stocks(self, weights: Dict[str, float] = None) -> pd.DataFrame
def percentile_rank(self, metrics: List[str]) -> pd.DataFrame
# Export
def to_csv(self, filepath: str) -> str
def to_json(self, filepath: str) -> str
def summary_report(self) -> str
筛选标准
估值指标
screener.filter(
pe_ratio=(5, 20), # P/E between 5 and 20
pb_ratio_max=3.0, # P/B ratio under 3
ps_ratio_max=5.0, # Price/Sales under 5
peg_ratio_max=1.5 # PEG ratio under 1.5
)
规模指标
screener.filter(
market_cap_min=1e9, # Min $1B market cap
market_cap_max=10e9, # Max $10B (mid-cap)
revenue_min=500e6 # Min $500M revenue
)
收入指标
screener.filter(
dividend_yield_min=2.0, # Min 2% dividend
dividend_yield_max=8.0, # Max 8% (avoid yield traps)
payout_ratio_max=75 # Sustainable payout
)
增长指标
screener.filter(
revenue_growth_min=10, # Min 10% revenue growth
earnings_growth_min=15, # Min 15% earnings growth
eps_growth_min=10 # Min 10% EPS growth
)
质量指标
screener.filter(
profit_margin_min=15, # Min 15% profit margin
roe_min=15, # Min 15% return on equity
debt_to_equity_max=1.0, # Max 1.0 D/E ratio
current_ratio_min=1.5 # Min 1.5 current ratio
)
预设筛选条件
价值筛选
results = screener.value_screen()
# Finds undervalued stocks:
# - P/E < 15
# - P/B < 2
# - Dividend yield > 2%
# - Profit margin > 10%
增长筛选
results = screener.growth_screen()
# Finds growth stocks:
# - Revenue growth > 15%
# - Earnings growth > 20%
# - PEG ratio < 2
股息筛选
results = screener.dividend_screen()
# Finds dividend stocks:
# - Dividend yield 2-8%
# - Payout ratio < 75%
# - 5+ years dividend history
质量筛选
results = screener.quality_screen()
# Finds high-quality stocks:
# - ROE > 15%
# - Profit margin > 15%
# - D/E < 0.5
# - Current ratio > 2
股票比较
comparison = screener.compare(["AAPL", "MSFT", "GOOGL"])
# Returns:
# AAPL MSFT GOOGL
# price 175.50 380.00 140.00
# pe_ratio 28.50 35.20 25.30
# market_cap 2.8T 2.8T 1.7T
# dividend_yield 0.50 0.80 0.00
# profit_margin 25.30 36.70 22.50
# ...
排名与评分
按单项指标排名
# Top 20 by dividend yield
top_dividend = screener.rank_by("dividend_yield", ascending=False).head(20)
综合评分
# Score stocks with custom weights
scores = screener.score_stocks({
"pe_ratio": -0.2, # Lower is better
"dividend_yield": 0.3, # Higher is better
"profit_margin": 0.3, # Higher is better
"revenue_growth": 0.2 # Higher is better
})
# Returns stocks ranked by composite score
百分位排名
# See where each stock ranks on multiple metrics
ranked = screener.percentile_rank(["pe_ratio", "dividend_yield", "profit_margin"])
# Returns percentile (0-100) for each metric
行业分析
sector_stats = screener.sector_summary()
# Returns:
# sector | count | avg_pe | avg_div | avg_margin
# Technology | 45 | 28.5 | 1.2 | 22.3
# Healthcare | 32 | 18.2 | 2.1 | 18.7
# Financials | 28 | 12.5 | 3.2 | 25.1
工作流示例
查找被低估的股息股票
screener = StockScreener()
screener.load_csv("sp500.csv")
# Apply filters
results = screener.filter(
pe_ratio=(5, 15),
dividend_yield_min=3.0,
payout_ratio_max=70,
profit_margin_min=10
)
# Rank by dividend yield
top = results.sort_values("dividend_yield", ascending=False).head(10)
print(top[["symbol", "name", "pe_ratio", "dividend_yield", "payout_ratio"]])
合理价格增长(GARP)
results = screener.filter(
revenue_growth_min=15,
earnings_growth_min=15,
peg_ratio_max=1.5,
pe_ratio_max=25
)
行业比较
# Filter to technology sector
tech = screener.filter_by_sector(["Technology"]).filter(
market_cap_min=10e9,
profit_margin_min=15
)
# Compare top tech stocks
comparison = screener.compare(tech["symbol"].head(5).tolist())
输出格式
CSV 导出
screener.filter(pe_ratio_max=20).to_csv("value_stocks.csv")
JSON 导出
screener.filter(dividend_yield_min=3).to_json("dividend_stocks.json")
摘要报告
report = screener.summary_report()
# Returns formatted text summary of screening results
依赖项
- pandas>=2.0.0
- numpy>=1.24.0
评论
支持 Markdown