3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这段代码是 JoinQuant(聚宽)平台中用于构建财务数据查询条件(Query 对象)的标准写法。通常它会配合 get_fundamentals(q) 函数一起使用来获取最终的数据。下面针对您的三个问题进行详细解答:
不完全准确。
首先,代码中写的是 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 只股票。
不是未来函数。
query 只是构建了一个查询语句,真正执行查询并获取数据的是 get_fundamentals(q, date=None) 函数。关于时间点,JoinQuant 平台有严格的防未来函数机制:
get_fundamentals 时不传入 date 参数(即默认情况),系统会自动将查询日期设定为 context.current_dt 的前一天。因为在实际交易中,今天开盘前你只能看到昨天收盘后已经公布的财报数据。因此,它获取的是回测到那一天时,市场上已经公开的最新一期财报的 EPS,绝对不会获取到未来的数据。date,默认获取的是平台数据库中最新一天的财务数据。所以,只要你在回测中正常使用 get_fundamentals(q),它取到的就是回测当时合法的历史数据,不存在未来函数。
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)