问题描述
在一个策略里看到到这么段代码:
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)