3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant 聚宽平台的自定义因子中,使用 turnover_ratio 时需要注意它的数据来源和更新机制。以下是针对您问题的详细解答:
turnover_ratio 的周期是多久?turnover_ratio(换手率)属于市值表(valuation)中的字段,它的更新周期是日频(按天更新)。在回测或因子计算中,当前逻辑日期(current_dt)能获取到的 turnover_ratio 实际上是前一个交易日的换手率(因为当天的市值数据需要在收盘后才能计算得出,为了避免未来函数,系统默认返回前一交易日的数据)。
turnover_ratio_1 数据对不上?在 JoinQuant 的自定义因子文档中,_1、_2 这种后缀仅适用于单季度财务指标(如利润表 income、资产负债表 balance、现金流表 cash_flow 和财务指标表 indicator),用来获取前 1 个季度或前 2 个季度的数据。
市值表(valuation)不支持 _1 这种按季度滞后的后缀。因此,在 dependencies 中写 turnover_ratio_1 是无效的,系统可能无法正确解析或返回了未定义的数据,导致您发现数据对不上。
如果您想在自定义因子中获取前几天(例如前 1 个交易日、前 2 个交易日)的换手率,正确的做法是调整 max_window 参数,而不是使用 _1 后缀。
max_window 定义了获取数据的时间窗口长度(天数)。例如,设置 max_window = 2,data['turnover_ratio'] 将返回一个包含过去 2 天数据的 DataFrame。您可以通过 .iloc 来截取特定日期的数据。
以下代码展示了如何正确获取“最新换手率”(T-1日)和“上一日换手率”(T-2日):
from jqdata import *
from jqfactor import Factor, calc_factors
# 获取最新换手率(即 T-1 日的换手率)
class turnover_ratio_latest(Factor):
name = '_turnover_ratio_latest'
max_window = 1
dependencies = ['turnover_ratio']
def calc(self, data):
# max_window=1 时,直接取最新的一天
return data['turnover_ratio'].iloc[-1]
# 获取上一日换手率(即 T-2 日的换手率)
class turnover_ratio_prev(Factor):
name = '_turnover_ratio_prev'
max_window = 2 # 窗口设为2,获取过去2天的数据
dependencies = ['turnover_ratio']
def calc(self, data):
# iloc[-1] 是 T-1 日,iloc[-2] 是 T-2 日
return data['turnover_ratio'].iloc[-2]
securities = ['600000.XSHG']
df = calc_factors(
securities,
[turnover_ratio_latest(), turnover_ratio_prev()],
start_date='2016-12-01',
end_date='2017-02-01',
use_real_price=False,
skip_paused=False
)
display(df)
turnover_ratio 是日频数据,代表前一个交易日的换手率。turnover_ratio, market_cap, pe_ratio 等)使用 _1 后缀。max_window 并使用 data['字段名'].iloc[-N] 来实现。