问题描述
解决方案
在聚宽(JoinQuant)平台中,选股主要通过 get_fundamentals 函数配合 query 对象来实现。你需要查询 valuation(市值数据表)中的 market_cap(总市值)和 pe_ratio(市盈率)字段。
注意: 聚宽数据库中 market_cap 的单位是 亿元,因此 1000 亿应写为 1000。
以下是具体的实现代码:
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 运行选股函数
select_stocks(context)
def select_stocks(context):
# 1. 构建查询语句
# 查询 valuation 表中的股票代码、总市值、市盈率
q = query(
valuation.code,
valuation.market_cap,
valuation.pe_ratio
).filter(
# 筛选总市值大于 1000 亿元的股票
valuation.market_cap > 1000,
# 筛选市盈率(PE)小于 10 的股票
valuation.pe_ratio < 10
)
# 2. 执行查询
# get_fundamentals 默认查询的是回测当日的前一个交易日的数据(避免未来函数)
df = get_fundamentals(q)
# 3. 获取股票代码列表
if not df.empty:
stock_list = list(df['code'])
print("选出的股票数量:", len(stock_list))
print("选出的股票代码:", stock_list)
# 打印详细数据供检查(可选)
# print(df)
else:
print("未找到符合条件的股票")
stock_list = []
return stock_list
代码说明:
from jqdata import *: 导入聚宽的数据接口库,这是使用query和valuation等对象的前提。query(...): 用于构建查询对象。valuation.code: 股票代码。valuation.market_cap: 总市值,单位为亿元。valuation.pe_ratio: 市盈率(PE-TTM,滚动市盈率)。
.filter(...): 用于设置筛选条件。valuation.market_cap > 1000: 对应“总市值大于1000亿”。valuation.pe_ratio < 10: 对应“市盈率小于10”。
get_fundamentals(q): 执行查询,返回一个 pandas DataFrame。在回测模式下,它会自动获取当前回测日期前一天的数据;在研究环境中,默认获取最新交易日的数据。