🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

如何在 JoinQuant 中使用 get_money_flow 避免未来函数?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

get_money_flow 怎么避免未来函数?

如果我在回测中运行如下代码:

td=context.current_dt
z=get_money_flow('000069.XSHE',fields=['date','sec_code','net_amount_main'], end_date=td,count=3)
log.info(z)
Img

聚宽官网给的API说明是:
Img

我的理解是,如果是早晨09:36运行,虽然count=3,但也只能返回2天的数据(昨天和前天),这应该就是对应了官网中说的比count少一条的现象。

我试着回测跑了一下,事实上是返回了包括当天的一共3天的数据。当天给的数据是收盘后的数据,这不就是未来函数吗?

Img

如果是下午17:36运行,给出的数据是3天,这个逻辑上没有问题。

解决方案

针对您在 JoinQuant (聚宽) 平台使用 get_money_flow 时遇到的未来函数问题,以下是详细的原理解析与解决方案:

为什么会取到当天收盘后的数据?

资金流向数据(get_money_flow)的底层数据频率是。在按分钟回测时(例如 09:36),如果您将 end_date 设置为 context.current_dt,系统在解析日期时会提取到『今天』的日期。由于日线数据的最小颗粒度是整天,底层数据库在匹配到『今天』时,会直接返回今天全天的最终资金流数据。这就导致了您在早盘获取到了收盘后才应该知道的数据,从而引入了未来函数

官方文档中提到的『比 count 少一条』通常发生在系统严格按时间戳截断的特定场景下,但为了绝对安全,不能完全依赖系统的默认截断,必须在代码逻辑上进行规避。

解决方案

1. 明确指定 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)

2. 开启平台的『避免未来数据模式』

聚宽平台提供了一个全局的安全设置,可以在 initialize 函数中开启。开启后,系统会在底层帮助检测和拦截未来数据:

def initialize(context):
    # 开启避免未来数据模式
    set_option('avoid_future_data', True)

开启此选项后,如果您尝试通过包含时间参数的 API 获取 current_dt 之后(或当前未完成周期)的数据,系统会抛出 FutureDataError 异常,或者自动将返回结果中的未来数据剔除。

总结

在量化策略编写中,跨周期获取数据(在分钟线获取日线数据)是未来函数的重灾区。请养成良好的代码规范:只要是获取日线级别的统计数据(如资金流向、财务报表、龙虎榜等),在盘中调用时一律使用 context.previous_date 作为结束时间。