🚀 AI 一键生成 joinquant 策略代码

JoinQuant 聚宽可以在日内(如9:35)获取当天的资金流数据吗?

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

问题描述

聚宽可以在日内获取当时的资金流数据吗

get_money_flow只能按日获取。
如果我要在9:35获取000002当日的资金流数据可以吗?

解决方案

核心解答

不可以。 在 JoinQuant(聚宽)平台上,您无法直接通过 API 获取当日日内(如 9:35)的实时资金流向数据

根据聚宽 API 文档的说明,get_money_flow 函数存在以下严格限制:

  1. 数据频率为天:该接口提供的数据频率仅为“天”级别,不提供分钟级或 Tick 级别的资金流拆分。
  2. 防未来函数限制:在回测和模拟交易中,为了避免引入未来函数,get_money_flow 无法获取当前逻辑时间所在的那一天的数据。也就是说,在当天的交易时段内,您只能获取到昨天及以前的资金流数据。

替代方案:通过 Tick 数据自行估算日内资金流

如果您必须在日内(如 9:35)获取类似资金流的数据,唯一的替代方案是订阅或拉取 Tick 数据,然后根据每笔 Tick 的成交额(money)差值,自行定义和计算“大单”、“中单”、“小单”的流入流出情况。

实现思路

  1. 使用 get_ticks 获取开盘到当前时间(如 9:30:00 到 9:35:00)的 Tick 序列。
  2. 计算相邻两个 Tick 之间的成交额差值(即该笔 Tick 的实际成交金额)。
  3. 根据成交金额的大小(例如:单笔 > 100万 视为超大单,20万-100万 视为大单)进行分类。
  4. 结合价格变化(Tick 的 current 价格对比上一个 Tick)判断是主动买入(资金流入)还是主动卖出(资金流出)。

Python 代码示例

以下是一个在 9:35 定时运行,通过拉取 Tick 数据来估算当日开盘前 5 分钟资金流的示例代码:

import jqdata
import pandas as pd

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    g.security = '000002.XSHE' # 万科A
    
    # 每天 9:35 定时运行
    run_daily(calculate_intraday_money_flow, time='09:35')

def calculate_intraday_money_flow(context):
    # 获取当天的日期字符串
    today_str = context.current_dt.strftime('%Y-%m-%d')
    start_time = today_str + ' 09:30:00'
    end_time = today_str + ' 09:35:00'
    
    # 获取开盘前5分钟的 Tick 数据
    # 注意:get_ticks 返回的是 numpy.ndarray,设置 df=True 返回 DataFrame
    ticks_df = get_ticks(g.security, start_dt=start_time, end_dt=end_time, df=True)
    
    if ticks_df is None or ticks_df.empty:
        log.info("未获取到 Tick 数据")
        return
        
    # 计算每笔 Tick 的新增成交额和新增成交量
    # ticks_df['money'] 是累计成交额,需差分得到单笔成交额
    ticks_df['tick_money'] = ticks_df['money'].diff().fillna(ticks_df['money'].iloc[0])
    ticks_df['price_change'] = ticks_df['current'].diff().fillna(0)
    
    # 简单定义:单笔成交额 >= 100万 为大单
    large_order_threshold = 1000000 
    
    # 估算资金流入流出(简单以价格上涨视为流入,下跌视为流出)
    # 实际更精确的做法是对比买一卖一价,但此处做简化演示
    inflow_mask = ticks_df['price_change'] > 0
    outflow_mask = ticks_df['price_change'] < 0
    
    # 计算大单流入流出
    large_inflow = ticks_df[(ticks_df['tick_money'] >= large_order_threshold) & inflow_mask]['tick_money'].sum()
    large_outflow = ticks_df[(ticks_df['tick_money'] >= large_order_threshold) & outflow_mask]['tick_money'].sum()
    
    # 计算净流入
    net_large_inflow = large_inflow - large_outflow
    
    log.info(f"[{context.current_dt}] {g.security} 开盘5分钟大单流入: {large_inflow/10000:.2f}万, 大单流出: {large_outflow/10000:.2f}万, 净流入: {net_large_inflow/10000:.2f}万")

注意事项

  1. Tick 数据的局限性:聚宽的股票 Tick 数据是 3 秒一次的快照(Snapshot),并非真实的逐笔交易(Level-2 逐笔还原)。因此,两个 Tick 之间的差值可能包含多笔真实的交易,这种估算方法只能作为近似参考,无法做到 100% 精确的资金流拆分。
  2. 性能消耗:在回测中大量拉取和处理 Tick 数据会显著降低回测速度,建议仅在关键时间点(如早盘、尾盘)进行拉取分析。