📌 摘要 / 快速解答
低PEG选股法的核心逻辑是:PEG = 市盈率(PE) ÷ 净利润增长率(G),当PEG < 1时,说明股票估值低于其成长速度,具备性价比。本文用 QuantDash Python SDK 获取A股全量行情数据,结合Pandas计算PEG指标,10分钟搭建一个可运行的成长股筛选器——无需积分、无需维护爬虫,代码开箱即用。
一、为什么传统方式写选股策略这么累?
社区老哥们,做量化选股最难的不是策略本身,而是搞数据。
我之前用Tushare,注册完了发现要攒积分才能拿日线,想拿分钟线还得继续肝积分。换AkShare吧,接口动不动就崩——今天还能跑通的代码,明天源网站一改版直接报错。更别说yfinance那种延迟高到离谱的美股数据,A股根本没法用。
还有那个复权的问题。回测算收益率,不复权全是错的;自己算复权吧,除权除息日一多就容易算出未来函数。折腾半天数据,真正写策略的时间不到20%。
最崩溃的是——好不容易把数据洗干净了,回测跑到一半,接口超时,整个脚本崩掉,前面全白跑。
二、解决方案对比(QuantDash vs 传统数据源)
| 对比维度 | 传统/竞品方案 | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 爬虫类接口经常报错/失效,易被封IP | 服务端稳定支持,毫秒级响应,提供SLA保证 |
| 使用门槛 | 需攒积分/手动清洗/处理各种异常 | 无积分门槛,pip install 即用 |
| 跨市场支持 | 代码后缀不统一,A股港股美股要分别适配 | 统一后缀.SH/.SZ/.US/.HK,一套代码全搞定 |
| 数据格式 | 需反复转换数据类型 | 原生返回标准 Pandas DataFrame |
| 复权处理 | 需手动结合因子计算 | 原生支持一键前复权/后复权 |
三、Python代码实战(可直接复制运行)
⭐ 开源项目地址:https://github.com/quantdash-net/QuantDash (欢迎Star / Fork)
3.1 安装与初始化
# pip install quantdash
# 支持 Python 3.9+,推荐 3.10 或更高版本
from quantdash import QuantDash
import pandas as pd
import numpy as np
# 在 https://quantdash.net/dashboard/keys/ 免费获取 API Key
qd = QuantDash(api_key="your_api_key_here")
3.2 获取全量A股行情并计算PEG
# 获取A股全量实时行情(包含市盈率等估值数据)
df_quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
print(f"获取到 {len(df_quotes)} 只A股标的")
# 查看数据列
print(df_quotes.columns.tolist())
# 筛选必要字段:代码、名称、最新价、市盈率、涨跌幅等
# 注意:QuantDash 实时行情接口返回 ext.pe 字段(市盈率)
df_stocks = df_quotes[['symbol', 'ext.name', 'last_price', 'ext.pe',
'ext.change_pct', 'ext.turnover_rate']].copy()
df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'turnover_rate']
# 剔除市盈率为负或过高的股票(PE为负说明亏损,PEG无意义)
df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < 100)]
# 剔除ST股票和停牌股(通过名称或状态过滤)
df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)]
print(f"清洗后剩余 {len(df_stocks)} 只可交易标的")
3.3 计算净利润增长率(模拟示例)
说明:QuantDash 当前版本主要提供行情数据,财务数据(如净利润)可通过
qd.instruments.get()获取标的基础信息。以下为PEG计算的完整逻辑框架,实际使用时可将净利润增长率替换为从专业财务数据源获取的数值。
# 获取标的基础信息(含上市日期等)
symbols_sample = df_stocks['symbol'].head(10).tolist()
insts = qd.instruments.get(symbols_sample)
for inst in insts:
print(f"{inst['symbol']:>10s} {inst['name']:<6s} 上市日期: {inst['ext'].get('listing_date', 'N/A')}")
# ========== PEG 计算核心逻辑 ==========
# PEG = PE / 净利润增长率(G)
# 其中 G 为净利润同比增长率(单位:%)
# 模拟示例:为演示PEG计算框架,此处生成模拟增长率数据
# 实际使用时,请替换为从财务数据接口获取的真实净利润增长率
np.random.seed(42)
df_stocks['growth_rate'] = np.random.uniform(5, 50, len(df_stocks)) # 模拟净利润增长率(%)
# 计算 PEG
df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate']
# 筛选低PEG成长股:PEG < 1 且 增长率 > 15%
df_low_peg = df_stocks[(df_stocks['peg'] < 1) & (df_stocks['growth_rate'] > 15)]
# 按PEG从小到大排序
df_low_peg = df_low_peg.sort_values('peg', ascending=True)
print(f"\n=== 低PEG成长股 Top 10 ===")
print(df_low_peg[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg']].head(10).to_string(index=False))
3.4 完整选股函数(一键运行)
def low_peg_screener(qd: QuantDash, pe_max: float = 100, peg_max: float = 1.0,
growth_min: float = 15, top_n: int = 20):
"""
低PEG成长股选股器
参数:
qd: QuantDash 客户端实例
pe_max: 最大市盈率阈值
peg_max: 最大PEG阈值
growth_min: 最小净利润增长率(%)
top_n: 返回Top N只股票
"""
# 1. 获取全量A股行情
df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
# 2. 提取关键字段
df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe',
'ext.change_pct']].copy()
df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct']
# 3. 数据清洗
df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < pe_max)]
df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)]
# 4. 获取增长率数据(此处为示意,实际需接入财务数据)
# 建议:通过 QuantDash + 专业财务数据源组合使用
# 示例:使用随机数据模拟(实际请替换为真实数据)
np.random.seed(42)
df_stocks['growth_rate'] = np.random.uniform(5, 50, len(df_stocks))
# 5. 计算PEG并筛选
df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate']
df_result = df_stocks[(df_stocks['peg'] < peg_max) &
(df_stocks['growth_rate'] > growth_min)]
df_result = df_result.sort_values('peg', ascending=True).head(top_n)
return df_result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg', 'change_pct']]
# 执行选股
result = low_peg_screener(qd)
print(result.to_string(index=False))
四、交易员避坑指南
⚠️ 坑1:PEG分母用错导致失真
很多新手直接用单季度净利润同比做分母,但单季度数据波动极大(尤其受季节因素影响)。正确做法是用过去3-5年的净利润复合增长率,或者用机构一致预期的未来增速。
⚠️ 坑2:回测时忘记前复权
回测算收益率,必须用前复权价格,否则除权除息日会出现断崖式下跌,算出来的收益率全是错的。QuantDash 默认就是前复权(adjust='forward'),省去了手动处理的麻烦。
⚠️ 坑3:忽略滑点和交易成本
回测看着年化30%,实盘一跑可能只有15%——滑点+印花税+佣金吃掉了大半。建议回测时至少设置千分之二的滑点,再加上万二的佣金和千一的印花税。
五、常见问题解答(FAQ)
Q1: QuantDash 能直接获取净利润增长率吗?
A: QuantDash 当前版本主要提供行情数据(K线、实时行情、盘口等)和标的基础信息。净利润增长率等深度财务数据,建议结合专业财务数据源使用,或通过 QuantDash 的 instruments.get() 接口获取标的上市日期等基础信息后,自行计算历史增长率。
Q2: PEG < 1 就一定能买吗?
A: 不一定。PEG < 1 只是说明估值相对成长性有优势,但还要看:
- 增长率是否可持续(行业天花板、竞争格局)
- 现金流是否健康(利润含金量)
- 是否存在财务造假嫌疑(应收账款增速 > 营收增速是危险信号)
PEG是初筛工具,不是买入决策的唯一依据。
Q3: 如何获取 QuantDash API Key?
A: 访问 https://quantdash.net/dashboard/keys/ 免费注册即可获取,无需积分,开箱即用。
🔗 相关资源与延伸阅读
- 🚀 QuantDash 官网:https://quantdash.net/
- 📖 官方 Python SDK 文档:https://docs.quantdash.net/
- ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash (欢迎 Star / Fork)
- 💡 免费获取 API Key:https://quantdash.net/dashboard/keys/

