问题描述
我的思路是:
1、对市场用query查询和过滤一批
2、调用因子库的几个因子
我在
df= get_fundamentals(query( valuation.code)后有了一个股票池,这个时候调用因子库,怎么调用?
谢谢,最近刚会回测了,又发现聚宽因子库这个宝藏,一定要用起来。
解决方案
你好!你的思路非常清晰且高效:先用财务数据或市值指标(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 收益!