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

JoinQuant聚宽策略中直接使用因子库因子的方法与代码示例

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

问题描述

请问策略里可以直接用因子库里的因子嘛?

我看因子策略里 定义因子都要用class。

请问可以直接用 因子库里,比如质量因子 里的因子嘛?

谢谢。

例如 在环境策略里

factor_values = get_factor_values(context, [circulating_market_cap], universe)

这里的“circulating_market_cap”就是质量因子 我可以直接用吗?如果可以 要怎么用呢?

解决方案

完全可以!在 JoinQuant(聚宽)的策略中,你可以直接调用因子库里已经计算好的现成因子,不需要自己用 class 去重新定义。用 class 继承 Factor 通常是为了自定义因子或者在研究环境中使用单因子分析工具(analyze_factor)时才需要的。

不过,你提供的示例代码 factor_values = get_factor_values(context, [circulating_market_cap], universe) 参数传错了。下面为你详细讲解正确的用法。

方法一:使用 get_factor_values 函数(适用于所有因子库因子)

get_factor_values 是专门用来获取聚宽因子库数据的 API。它的正确参数不包含 context,而是需要指定股票池、因子列表和时间。

正确的 API 格式:

get_factor_values(securities, factors, start_date=None, end_date=None, count=None)

在策略中的具体用法示例:
为了避免未来函数,在策略中通常获取前一个交易日(context.previous_date)的因子值。

import jqdata
from jqfactor import get_factor_values

def initialize(context):
    set_benchmark('000300.XSHG')
    # 每天开盘前调用
    run_daily(before_market_open, time='09:00')

def before_market_open(context):
    # 1. 确定你的股票池,比如沪深300成分股
    stock_list = get_index_stocks('000300.XSHG')
    
    # 2. 调用因子库数据,注意因子名要加引号,作为字符串传入列表
    # 获取前一个交易日的流通市值因子
    factor_data = get_factor_values(securities=stock_list, 
                                    factors=['circulating_market_cap'], 
                                    end_date=context.previous_date, 
                                    count=1)
    
    # 3. 解析返回的数据
    # 返回的是一个 dict,key 是因子名,value 是 DataFrame
    df_circulating_market_cap = factor_data['circulating_market_cap']
    
    # 打印查看平安银行的流通市值因子值
    if '000001.XSHE' in df_circulating_market_cap.columns:
        print("平安银行流通市值因子值:", df_circulating_market_cap['000001.XSHE'].iloc[0])

方法二:使用 get_fundamentals 函数(强烈推荐用于财务/市值类因子)

虽然 circulating_market_cap(流通市值)在因子库里有,但它本质上属于财务/市值数据。在回测策略中,获取这类基础财务数据,使用 get_fundamentals 往往速度更快、更灵活

在策略中的具体用法示例:

import jqdata

def initialize(context):
    run_daily(market_open, time='09:30')

def market_open(context):
    # 1. 确定股票池
    stock_list = get_index_stocks('000300.XSHG')
    
    # 2. 构建查询语句,查询 valuation 表中的 circulating_market_cap
    q = query(
        valuation.code, 
        valuation.circulating_market_cap
    ).filter(
        valuation.code.in_(stock_list)
    )
    
    # 3. 获取数据(在回测中,不传 date 参数默认获取的就是前一天的财务数据,无未来函数)
    df = get_fundamentals(q)
    
    # 打印前5行看看
    print(df.head())

总结

  1. 可以直接用:不需要写 class,直接用 API 调取。
  2. 注意参数:因子名称必须是字符串(如 'circulating_market_cap'),并且放在列表里传给 factors 参数。
  3. 注意时间:在策略中调用 get_factor_values 时,end_date 最好传入 context.previous_date,防止引入未来数据。
  4. 灵活选择:如果是纯粹的技术因子、情绪因子、风险模型因子,用 get_factor_values;如果是基础的市值、利润、PE/PB 等财务数据,用 get_fundamentals 效率更高。