🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 聚宽量化平台:结合 get_fundamentals 与 jqfactor 因子库的实战指南

joinquant | 发布时间: 2026/6/5
以下内容由 EasyQuant 生成。

问题描述

聚宽因子库调用到query回测筛选条件问题

我的思路是:
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

关键点解析:

  1. 提取股票列表get_fundamentals 返回的是一个 pandas.DataFrame。你需要用 list(df['code']) 或者 df['code'].tolist() 将其转换为 Python 列表,因为 get_factor_valuessecurities 参数需要的是列表或单个字符串。
  2. 日期对齐:在回测中,为了避免未来函数get_fundamentalsget_factor_values 的日期参数建议使用 context.previous_date(即昨天的日期),这样你获取的是昨天收盘后就能确定的数据,今天开盘交易。
  3. 数据结构处理get_factor_values 返回的是一个字典(dict)。你需要先通过因子名(如 factor_data['DEGM'])取出对应的 DataFrame,然后再用 .iloc[-1] 取出最后一天的截面数据(Series),这样就可以很方便地用 Pandas 进行条件过滤或排序了。

祝你在聚宽因子库中挖掘出优秀的 Alpha 收益!