问题描述
get_money_flow只能按日获取。
如果我要在9:35获取000002当日的资金流数据可以吗?
解决方案
核心解答
不可以。 在 JoinQuant(聚宽)平台上,您无法直接通过 API 获取当日日内(如 9:35)的实时资金流向数据。
根据聚宽 API 文档的说明,get_money_flow 函数存在以下严格限制:
- 数据频率为天:该接口提供的数据频率仅为“天”级别,不提供分钟级或 Tick 级别的资金流拆分。
- 防未来函数限制:在回测和模拟交易中,为了避免引入未来函数,
get_money_flow无法获取当前逻辑时间所在的那一天的数据。也就是说,在当天的交易时段内,您只能获取到昨天及以前的资金流数据。
替代方案:通过 Tick 数据自行估算日内资金流
如果您必须在日内(如 9:35)获取类似资金流的数据,唯一的替代方案是订阅或拉取 Tick 数据,然后根据每笔 Tick 的成交额(money)差值,自行定义和计算“大单”、“中单”、“小单”的流入流出情况。
实现思路
- 使用
get_ticks获取开盘到当前时间(如 9:30:00 到 9:35:00)的 Tick 序列。 - 计算相邻两个 Tick 之间的成交额差值(即该笔 Tick 的实际成交金额)。
- 根据成交金额的大小(例如:单笔 > 100万 视为超大单,20万-100万 视为大单)进行分类。
- 结合价格变化(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}万")
注意事项
- Tick 数据的局限性:聚宽的股票 Tick 数据是 3 秒一次的快照(Snapshot),并非真实的逐笔交易(Level-2 逐笔还原)。因此,两个 Tick 之间的差值可能包含多笔真实的交易,这种估算方法只能作为近似参考,无法做到 100% 精确的资金流拆分。
- 性能消耗:在回测中大量拉取和处理 Tick 数据会显著降低回测速度,建议仅在关键时间点(如早盘、尾盘)进行拉取分析。