本方案由 EasyQuant AI量化助手 提供。
问题背景
基本面选股是聚宽中搜索频率很高的策略类型。通过市盈率、市净率、市值、ROE 等指标,可以从指数成分股中筛选出符合预设条件的股票,再配合定时调仓形成完整策略。
聚宽使用 query() 构造查询条件,并通过 get_fundamentals() 获取基本面数据。
实现思路
-
以沪深 300 成分股作为初始股票池。
-
过滤负市盈率、负市净率和异常数据。
-
选择 PE 较低、PB 较低、ROE 较高的股票。
-
将筛选结果按综合条件排序后返回。
完整代码示例
def initialize(context):
# 最大选股数量
g.stock_num = 10
# 每周第一个交易日更新股票池
run_weekly(
update_stock_pool,
weekday=1,
time="before_open"
)
def update_stock_pool(context):
stocks = get_index_stocks(
"000300.XSHG",
date=context.previous_date
)
# 构造基本面查询
q = query(
valuation.code,
valuation.pe_ratio,
valuation.pb_ratio,
valuation.market_cap,
indicator.roe
).filter(
valuation.code.in_(stocks),
# 过滤亏损或异常估值
valuation.pe_ratio > 0,
valuation.pe_ratio < 30,
# 过滤异常市净率
valuation.pb_ratio > 0,
valuation.pb_ratio < 3,
# ROE大于8%
indicator.roe > 8
).order_by(
valuation.pe_ratio.asc()
)
fundamentals = get_fundamentals(
q,
date=context.previous_date
)
if fundamentals is None or fundamentals.empty:
g.stock_pool = []
log.info("未获取到基本面数据")
return
current_data = get_current_data()
selected = []
for stock in fundamentals["code"]:
# 过滤停牌股票
if current_data[stock].paused:
continue
# 过滤ST股票
if current_data[stock].is_st:
continue
# 过滤名称含退市标记的股票
if "退" in current_data[stock].name:
continue
selected.append(stock)
if len(selected) >= g.stock_num:
break
g.stock_pool = selected
log.info(
"本周基本面股票池:%s"
% str(g.stock_pool)
)
def handle_data(context, data):
# 示例:打印股票池当前价格
if not hasattr(g, "stock_pool"):
return
for stock in g.stock_pool:
if stock not in data:
continue
log.info(
"股票:%s,当前价格:%.2f"
% (stock, data[stock].close)
)
注意事项
-
PE、PB、ROE 只是选股条件,不代表股票一定上涨。
-
基本面数据存在披露周期,策略应使用当时可见的数据,避免未来函数。
-
筛选股票前需处理停牌、ST、退市整理等不能正常交易的标的。
-
单一因子容易失效,可在后续加入盈利增长、换手率、波动率和行业分散等条件。
-
基本面策略通常适合周度或月度调仓,而非高频交易。
总结
聚宽的 get_fundamentals() 可以快速构建低 PE、低 PB、高 ROE 等基本面选股策略。结合指数股票池和定时调仓,可形成完整的低频量化策略框架。

406

被折叠的 条评论
为什么被折叠?



