请问策略环境里,可以直接调用聚宽因子库的因子吗?
在策略环境中:
# 获取因子值
# get_factor_values 有三个参数,context、因子列表、股票池;
# 例如: factor_values = get_factor_values(context, [gross_profitability()], universe)
因子列表里用的因子都是需要额外定义 Class才能使用,请问可以直接调用聚宽因子库里的因子吗?
如果可以的话 请给一个sample,谢谢。
问题描述
解决方案
在 JoinQuant 的策略环境中,完全可以直接调用聚宽因子库中已经提供好的因子,而不需要你自己去额外定义 Class。
你只需要使用 jqfactor 模块中的 get_factor_values 函数,并在 factors 参数中传入你想要获取的**因子名称(字符串格式)**即可。
get_factor_values 函数说明
get_factor_values(securities, factors, start_date=None, end_date=None, count=None)
- securities: 股票池,单只股票(字符串)或一个股票列表。
- factors: 因子名称,单个因子(字符串)或一个因子列表。聚宽因子库中的因子名称可以通过
get_all_factors()查看。 - start_date: 开始日期,字符串或 datetime 对象,与
count参数二选一。 - end_date: 结束日期,字符串或 datetime 对象。
- count: 截止
end_date之前交易日的数量(含end_date当日),与start_date参数二选一。
策略环境中的调用示例 (Sample)
下面是一个在策略环境中直接调用聚宽因子库因子(例如:Skewness60 和 net_profit_ratio)的完整示例:
# 导入聚宽函数库
import jqdata
# 导入获取因子的函数
from jqfactor import get_factor_values
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设定要操作的股票池,这里以平安银行和万科A为例
g.stocks = ['000001.XSHE', '000002.XSHE']
# 每天开盘前运行
run_daily(before_market_open, time='09:00')
def before_market_open(context):
# 获取前一个交易日的日期
yesterday = context.previous_date
# 我们想要获取的因子列表(直接使用聚宽因子库中的因子名称字符串)
# Skewness60: 个股收益的60日偏度 (风险因子)
# net_profit_ratio: 销售净利率 (质量因子)
factor_list = ['Skewness60', 'net_profit_ratio']
# 调用 get_factor_values 获取因子值
# 注意:为了避免未来函数,end_date 使用前一个交易日 (yesterday)
factor_data = get_factor_values(securities=g.stocks,
factors=factor_list,
end_date=yesterday,
count=1)
# factor_data 是一个字典,key 是因子名称,value 是 pandas.DataFrame
# 查看 Skewness60 因子值
skewness_df = factor_data['Skewness60']
log.info("\n=== Skewness60 因子值 ===\n%s" % skewness_df)
# 查看 net_profit_ratio 因子值
net_profit_df = factor_data['net_profit_ratio']
log.info("\n=== net_profit_ratio 因子值 ===\n%s" % net_profit_df)
# 你可以根据获取到的因子值进行后续的选股或调仓逻辑
# 例如:获取平安银行昨天的销售净利率
# pa_net_profit = net_profit_df['000001.XSHE'].iloc[0]
# log.info("平安银行销售净利率: %s" % pa_net_profit)
总结
- 不需要自定义 Class:只要是聚宽因子库里有的因子,直接传字符串名字就行。
- 注意避免未来函数:在策略中调用时,
end_date最好传入context.previous_date,以获取前一个交易日的因子值,避免使用当天的未知数据。 - 返回值结构:返回的是一个字典,键是因子名,值是 DataFrame(行是日期,列是股票代码)。