🚀 AI 一键生成 joinquant 策略代码

为什么在 JoinQuant 中获取中证500成分股的因子值和股价时股票列表不一致?

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

问题描述

500股票不一致

取191因子值:df=alpha(code='000905.XSHG',end_date=context.current_dt)
取股价:
stocks=get_index_stocks('000905.XSHG')
for stock in stocks:
price=attribute_history(stock, count=117, unit='1d', fields=
['open','close'], skip_paused=False, df=True, fq='pre')

这两个取数得到的500股票不一相同,比如2018年7月2日,都能取到500个股票的数据,但相同的股票只有205个,是我哪儿错了?还是数据有问题?

解决方案

您好!出现这个问题的原因在于 Alpha 191 因子函数的 code 参数用法不正确

在 JoinQuant 的 jqlib.alpha191 库中,因子函数(如 alpha_001 等)的 code 参数需要接收一个股票代码的列表(list),而不是一个指数代码的字符串。如果您直接传入 '000905.XSHG',底层函数可能无法正确解析为您想要获取该指数的所有成分股,从而导致返回的股票列表与实际的中证500成分股不一致。

正确的获取方式

您应该先使用 get_index_stocks 获取指定日期的中证500成分股列表,然后再将这个列表传递给 Alpha 191 因子函数。同时,为了避免未来函数,建议在 get_index_stocks 中明确指定日期。

示例代码:

from jqlib.alpha191 import *

def handle_data(context, data):
    # 1. 获取当前日期的中证500成分股列表
    stocks = get_index_stocks('000905.XSHG', date=context.current_dt)
    
    # 2. 将成分股列表传入 Alpha 191 因子函数(以 alpha_001 为例)
    # 注意:这里假设您调用的具体因子函数名为 alpha_001
    df_factor = alpha_001(code=stocks, end_date=context.current_dt)
    
    # 3. 获取股价数据
    for stock in stocks:
        price = attribute_history(stock, count=117, unit='1d', fields=['open','close'], skip_paused=False, df=True, fq='pre')
        
        # 在这里进行您的策略逻辑处理...

关键点总结:

  1. get_index_stocks 的日期参数:在回测中,get_index_stocks('000905.XSHG') 默认会使用 context.current_dt,这部分您的逻辑是正确的。但为了代码的严谨性,建议显式传入 date=context.current_dt
  2. 因子函数的输入:必须是 ['000001.XSHE', '000002.XSHE', ...] 这样的列表格式。通过 stocks = get_index_stocks(...) 获取到的正是一个符合要求的列表。
  3. 数据对齐:按照上述修改后,您获取因子值的股票池和获取股价的股票池将完全一致,都是该日期下真实的中证500成分股。

如果您使用的是聚宽的新版因子库,也可以使用 get_factor_values 函数来获取因子值,用法类似,同样需要传入股票列表。