🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant聚宽平台query函数用法详解:如何查询财务数据与避免未来函数?

joinquant | 发布时间: 2026/6/1
以下内容由 EasyQuant 生成。

问题描述

请教query函数的用法

在一个策略里看到到这么段代码:
q = query(valuation.code).filter(
valuation.code.in_( get_index_stocks('000300.XSHG')),
indicator.eps > g.min_eps
).order_by(
valuation.market_cap.asc()
).limit(
g.pick_stock_counthu )
想请教几个问题:
1。这个函数是查出沪深300里esp小于g.min_eps的成分股吗?
2.这里面这个esp值得是回测当日的esp还是当前esp?如果是当前 这不就成了未来函数了吗?
3.valuation对象是什么东西

解决方案

这段代码是 JoinQuant(聚宽)平台中用于构建财务数据查询条件(Query 对象)的标准写法。通常它会配合 get_fundamentals(q) 函数一起使用来获取最终的数据。下面针对您的三个问题进行详细解答:

1. 这个函数是查出沪深300里eps小于g.min_eps的成分股吗?

不完全准确。

首先,代码中写的是 indicator.eps > g.min_eps,所以是查出 EPS(每股收益)大于 g.min_eps 的成分股,而不是小于。

其次,这段代码不仅仅是过滤,它还做了排序和截取:

  • valuation.code.in_(get_index_stocks('000300.XSHG')):限定股票池为沪深300成分股。
  • indicator.eps > g.min_eps:限定每股收益大于设定的阈值。
  • order_by(valuation.market_cap.asc()):将符合条件的股票按照**总市值(market_cap)从小到大(升序,asc)**进行排序。
  • limit(g.pick_stock_counthu):最后只取排在前面的 g.pick_stock_counthu 只股票。

总结: 这段代码的作用是选出沪深300中EPS大于指定值,且市值最小的前 g.pick_stock_counthu 只股票。

2. 这里面的eps是回测当日的还是当前的?会不会是未来函数?

不是未来函数。

query 只是构建了一个查询语句,真正执行查询并获取数据的是 get_fundamentals(q, date=None) 函数。关于时间点,JoinQuant 平台有严格的防未来函数机制:

  • 在回测模块中:如果调用 get_fundamentals 时不传入 date 参数(即默认情况),系统会自动将查询日期设定为 context.current_dt前一天。因为在实际交易中,今天开盘前你只能看到昨天收盘后已经公布的财报数据。因此,它获取的是回测到那一天时,市场上已经公开的最新一期财报的 EPS,绝对不会获取到未来的数据。
  • 在研究模块中:如果不传 date,默认获取的是平台数据库中最新一天的财务数据。

所以,只要你在回测中正常使用 get_fundamentals(q),它取到的就是回测当时合法的历史数据,不存在未来函数。

3. valuation对象是什么东西?

valuation 是 JoinQuant 财务数据库中的市值数据表对象。在 SQLAlchemy(聚宽底层使用的数据库查询框架)中,它代表了一张数据库表。

这张表包含了股票在每一天的市值相关的指标,常用的字段包括:

  • valuation.code:股票代码
  • valuation.market_cap:总市值(亿元)
  • valuation.circulating_market_cap:流通市值(亿元)
  • valuation.pe_ratio:市盈率(PE, TTM)
  • valuation.pb_ratio:市净率(PB)
  • valuation.turnover_ratio:换手率(%)

同理,代码中的 indicator财务指标数据表,包含了 eps(每股收益)、roe(净资产收益率)等经过计算的财务指标。

完整的使用示例

这段 query 代码通常在策略的 handle_data 或定时运行函数中这样使用:

def market_open(context):
    # 1. 构建查询条件
    q = query(valuation.code).filter(
        valuation.code.in_(get_index_stocks('000300.XSHG')),
        indicator.eps > g.min_eps
    ).order_by(
        valuation.market_cap.asc()
    ).limit(
        g.pick_stock_counthu 
    )
    
    # 2. 执行查询,获取DataFrame格式的数据
    # 这里默认获取的是 context.current_dt 前一天的公开数据,无未来函数
    df = get_fundamentals(q)
    
    # 3. 提取股票代码列表
    target_stocks = list(df['code'])
    
    # 打印选出的股票
    log.info("选出的股票: %s" % target_stocks)