问题描述
取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')
# 在这里进行您的策略逻辑处理...
关键点总结:
get_index_stocks的日期参数:在回测中,get_index_stocks('000905.XSHG')默认会使用context.current_dt,这部分您的逻辑是正确的。但为了代码的严谨性,建议显式传入date=context.current_dt。- 因子函数的输入:必须是
['000001.XSHE', '000002.XSHE', ...]这样的列表格式。通过stocks = get_index_stocks(...)获取到的正是一个符合要求的列表。 - 数据对齐:按照上述修改后,您获取因子值的股票池和获取股价的股票池将完全一致,都是该日期下真实的中证500成分股。
如果您使用的是聚宽的新版因子库,也可以使用 get_factor_values 函数来获取因子值,用法类似,同样需要传入股票列表。