3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在 JoinQuant (聚宽) 平台使用 get_money_flow 时遇到的未来函数问题,以下是详细的原理解析与解决方案:
资金流向数据(get_money_flow)的底层数据频率是天。在按分钟回测时(例如 09:36),如果您将 end_date 设置为 context.current_dt,系统在解析日期时会提取到『今天』的日期。由于日线数据的最小颗粒度是整天,底层数据库在匹配到『今天』时,会直接返回今天全天的最终资金流数据。这就导致了您在早盘获取到了收盘后才应该知道的数据,从而引入了未来函数。
官方文档中提到的『比 count 少一条』通常发生在系统严格按时间戳截断的特定场景下,但为了绝对安全,不能完全依赖系统的默认截断,必须在代码逻辑上进行规避。
end_date 为前一交易日(强烈推荐)在盘中(分钟或 Tick 频率)调用日线级别的数据时,最安全且逻辑最严谨的做法是,明确将 end_date 设置为 context.previous_date。这样无论您在当天的哪个时刻运行,都只会获取到昨天及以前的确定性数据,从根本上杜绝未来函数。
def handle_data(context, data):
# 使用 previous_date 获取昨天及以前的数据
td = context.previous_date
z = get_money_flow('000069.XSHE', fields=['date','sec_code','net_amount_main'], end_date=td, count=3)
log.info(z)
聚宽平台提供了一个全局的安全设置,可以在 initialize 函数中开启。开启后,系统会在底层帮助检测和拦截未来数据:
def initialize(context):
# 开启避免未来数据模式
set_option('avoid_future_data', True)
开启此选项后,如果您尝试通过包含时间参数的 API 获取 current_dt 之后(或当前未完成周期)的数据,系统会抛出 FutureDataError 异常,或者自动将返回结果中的未来数据剔除。
在量化策略编写中,跨周期获取数据(在分钟线获取日线数据)是未来函数的重灾区。请养成良好的代码规范:只要是获取日线级别的统计数据(如资金流向、财务报表、龙虎榜等),在盘中调用时一律使用 context.previous_date 作为结束时间。