【聚宽 JoinQuant】聚宽如何实现基本面选股?get_fundamentals()低PE低PB策略示例

本方案由 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)
        )

注意事项

  1. PE、PB、ROE 只是选股条件,不代表股票一定上涨。

  2. 基本面数据存在披露周期,策略应使用当时可见的数据,避免未来函数。

  3. 筛选股票前需处理停牌、ST、退市整理等不能正常交易的标的。

  4. 单一因子容易失效,可在后续加入盈利增长、换手率、波动率和行业分散等条件。

  5. 基本面策略通常适合周度或月度调仓,而非高频交易。

总结

聚宽的 get_fundamentals() 可以快速构建低 PE、低 PB、高 ROE 等基本面选股策略。结合指数股票池和定时调仓,可形成完整的低频量化策略框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值