问题描述
文档里,
turnover_ratio : 指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。换手率=[指定交易日成交量(手)×100/截至该日股票的流通股本(股)]×100%
这个的周期是多久?
如果是上1个自然天。自定义factor依赖了(dependencies)这个指标,turnover_ratio_1是指上一个自然天的换手率吗?但数据对不上。
from jqdata import *
from jqlib.technical_analysis import *
from jqfactor import *
class turnover_ratio_1(Factor):
name = '_turnover_ratio_1'
max_window = 1
dependencies = ['turnover_ratio_1']
def calc(self, data):
return data['turnover_ratio_1'].iloc[0]
class turnover_ratio(Factor):
name = '_turnover_ratio'
max_window = 1
dependencies = ['turnover_ratio']
def calc(self, data):
return data['turnover_ratio'].iloc[0]
securities = ['600000.XSHG']
df = calc_factors(securities, [turnover_ratio_1(), turnover_ratio()], start_date='2016-12-01', end_date='2017-02-01', use_real_price=False, skip_paused=False)
display(df)
解决方案
在 JoinQuant 聚宽平台的自定义因子中,使用 turnover_ratio 时需要注意它的数据来源和更新机制。以下是针对您问题的详细解答:
1. turnover_ratio 的周期是多久?
turnover_ratio(换手率)属于市值表(valuation)中的字段,它的更新周期是日频(按天更新)。在回测或因子计算中,当前逻辑日期(current_dt)能获取到的 turnover_ratio 实际上是前一个交易日的换手率(因为当天的市值数据需要在收盘后才能计算得出,为了避免未来函数,系统默认返回前一交易日的数据)。
2. 为什么 turnover_ratio_1 数据对不上?
在 JoinQuant 的自定义因子文档中,_1、_2 这种后缀仅适用于单季度财务指标(如利润表 income、资产负债表 balance、现金流表 cash_flow 和财务指标表 indicator),用来获取前 1 个季度或前 2 个季度的数据。
市值表(valuation)不支持 _1 这种按季度滞后的后缀。因此,在 dependencies 中写 turnover_ratio_1 是无效的,系统可能无法正确解析或返回了未定义的数据,导致您发现数据对不上。
3. 如何正确获取前几天的换手率?
如果您想在自定义因子中获取前几天(例如前 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]来实现。