问题描述
用get_price在9:00和19:00取到的股价是一样的?不是说9:30开盘前取到的是昨天的吗?按此9:00取到的应是昨天的,19:00取到的是今天收盘后的当天数据。
另外,用alpha取的因子值分别在以上两个时间取的是什么时间的数据呢?
解决方案
在 JoinQuant 聚宽平台中,数据的获取逻辑与您所处的环境(回测/模拟交易 vs 投资研究)以及底层数据的更新机制密切相关。以下为您详细解答 get_price 和 alpha 因子在不同时间点的取数逻辑:
一、 关于 get_price 的取数逻辑
您提到在 9:00 和 19:00 用 get_price 取到的股价是一样的,这通常取决于您是否指定了 end_date 以及您运行代码的环境。
-
在回测/模拟交易环境中:
- 引擎是基于逻辑时间(
context.current_dt)运行的。如果您在before_trading_start(默认 9:00 运行)调用get_price获取日线(1d)数据,由于当天的交易尚未产生,您获取到的最新数据确实是昨天的收盘数据。 - 如果您在
after_trading_end(15:30 运行)或之后的逻辑时间调用,您获取到的将是今天的收盘数据。
- 引擎是基于逻辑时间(
-
在投资研究环境(Jupyter Notebook)中:
- 如果您没有指定
end_date,get_price默认会获取到当前系统时间之前的数据。 - 为什么 19:00 取到的可能和 9:00 一样? 根据聚宽官方文档说明:“我们当日的回测数据会在收盘后通过多数据源进行校验,并在 T+1(第二天)的 00:01 更新。” 虽然盘后(如 15:30 之后)会生成当天的初步行情数据,但经过严格校验的最终日线数据通常在次日凌晨入库。如果在某些特定情况下(或未指定精确到分钟的
end_date),系统可能默认返回已完全校验的 T-1 日数据。为了在 19:00 准确获取当天的收盘价,建议明确指定end_date为当天的日期(如end_date='2023-10-25 15:00:00')。
- 如果您没有指定
二、 关于 alpha 因子的取数逻辑
对于聚宽因子库中的因子(包括 Alpha 101、Alpha 191 等),其更新机制与基础行情数据不同。
根据聚宽 API 文档说明:
“频率为天,每天 05:00 更新前一天数据”
这意味着,因子数据的计算需要依赖前一个交易日完整的收盘数据和财务数据,并在夜间进行批处理计算,直到次日凌晨 05:00 才更新完毕。
因此,无论您是在 9:00 还是 19:00 调用 alpha 因子取数函数(如 alpha_001 或 get_factor_values):
- 您取到的都是 T-1 日(昨天)的因子数据。
- 例如:假设今天是周二,您在周二的 9:00 或 19:00 请求当天的因子值,实际上底层返回的最新有效因子值都是周一收盘后计算出来的结果。两者在时间戳上是一致的。
总结建议
- 获取行情 (
get_price):在研究环境中,若想在盘后立即获取当天数据,请务必带上包含具体时分秒的end_date参数(如15:00:00)。 - 获取因子 (
alpha):请牢记因子数据是 T+1 日凌晨 05:00 更新 T 日数据,日内任何时间获取的最新因子均为前一交易日的结果,不存在 9:00 和 19:00 的差异。