3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!你的思路非常清晰且高效:先用财务数据或市值指标(get_fundamentals)进行粗筛,缩小股票池范围,然后再调用聚宽因子库(jqfactor)获取高阶因子进行精细打分或排序。 这样不仅能提高运行效率,还能有效规避垃圾股。
在 df = get_fundamentals(...) 之后,你只需要将 DataFrame 中的股票代码提取成一个 list,然后传给 get_factor_values 即可。具体步骤如下:
# 导入需要的函数库
import pandas as pd
from jqdata import *
from jqfactor import get_factor_values
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每天开盘前运行选股逻辑
run_daily(my_stock_filter, time='09:00')
def my_stock_filter(context):
# 1. 使用 query 和 get_fundamentals 筛选股票池
# 例如:筛选总市值大于100亿,且市盈率在0到30之间的股票
q = query(
valuation.code
).filter(
valuation.market_cap > 100,
valuation.pe_ratio > 0,
valuation.pe_ratio < 30
).limit(100) # 限制数量,防止请求过大
df = get_fundamentals(q, date=context.previous_date)
# 2. 将 DataFrame 中的 code 列转换为 list 格式的股票池
stock_list = list(df['code'])
if not stock_list:
log.info("今日无符合基础条件的股票")
return
# 3. 调用聚宽因子库 (jqfactor)
# 假设我们要获取 'Skewness60' (60日偏度) 和 'DEGM' (毛利率增长) 两个因子
factor_data = get_factor_values(
securities=stock_list,
factors=['Skewness60', 'DEGM'],
end_date=context.previous_date,
count=1 # 获取最近1天的数据
)
# 4. 处理因子数据
# factor_data 是一个 dict,key 是因子名,value 是 DataFrame (index是日期,columns是股票代码)
skewness_df = factor_data['Skewness60']
degm_df = factor_data['DEGM']
# 获取最新一天的因子值(Series格式,index为股票代码)
latest_skewness = skewness_df.iloc[-1]
latest_degm = degm_df.iloc[-1]
# 接下来你可以根据因子值进行排序、打分或剔除
# 例如:选出 DEGM 因子值大于 0 的股票
good_stocks = latest_degm[latest_degm > 0].index.tolist()
log.info(f"最终选出的股票数量: {len(good_stocks)}")
# 将选出的股票存入全局变量,供 handle_data 交易使用
g.buy_list = good_stocks
get_fundamentals 返回的是一个 pandas.DataFrame。你需要用 list(df['code']) 或者 df['code'].tolist() 将其转换为 Python 列表,因为 get_factor_values 的 securities 参数需要的是列表或单个字符串。get_fundamentals 和 get_factor_values 的日期参数建议使用 context.previous_date(即昨天的日期),这样你获取的是昨天收盘后就能确定的数据,今天开盘交易。get_factor_values 返回的是一个字典(dict)。你需要先通过因子名(如 factor_data['DEGM'])取出对应的 DataFrame,然后再用 .iloc[-1] 取出最后一天的截面数据(Series),这样就可以很方便地用 Pandas 进行条件过滤或排序了。祝你在聚宽因子库中挖掘出优秀的 Alpha 收益!