🚀 AI 一键生成 joinquant 策略代码

JoinQuant 资金流向:北向资金与南向资金数据获取与分析

joinquant | 发布时间: 2025/12/19
以下内容由 EasyQuant 生成。

问题描述

如何获取沪深港通的北向资金流向数据?

解决方案

在聚宽(JoinQuant)平台中,获取沪深港通(北向资金)的流向数据,主要通过查询 finance.STK_ML_QUOTA(沪深港通额度数据)表来实现。

北向资金(Northbound Capital)是指香港资金通过沪股通和深股通进入A股市场的资金。

获取方法

使用 finance.run_query 函数查询数据库。

关键字段说明:

  • 表名: finance.STK_ML_QUOTA
  • link_id (互联互通标识):
    • 310001: 沪股通(北向 - 上海)
    • 310002: 深股通(北向 - 深圳)
  • daily_quota: 每日额度
  • daily_balance: 每日余额
  • 计算逻辑: 净流入资金 = 每日额度 - 每日余额

代码实现

以下代码展示了如何获取指定时间段内沪股通和深股通的资金流向数据,并计算净流入额。

# -*- coding: utf-8 -*-
from jqdata import *
import pandas as pd

def initialize(context):
    # 设置回测日期区间,这里仅作演示,实际回测中会自动根据 context.current_dt 获取
    # 在研究环境中,可以直接运行 query_northbound_money_flow 函数
    pass

def query_northbound_money_flow(start_date, end_date):
    """
    查询北向资金流向数据
    :param start_date: 开始日期 (str)
    :param end_date: 结束日期 (str)
    :return: DataFrame
    """
    # 310001: 沪股通, 310002: 深股通
    link_ids = [310001, 310002]
    
    q = query(
        finance.STK_ML_QUOTA.day,
        finance.STK_ML_QUOTA.link_id,
        finance.STK_ML_QUOTA.daily_quota,   # 每日额度
        finance.STK_ML_QUOTA.daily_balance, # 每日余额
        finance.STK_ML_QUOTA.quota_balance  # 剩余额度(部分旧数据字段可能不同,通常用daily_balance)
    ).filter(
        finance.STK_ML_QUOTA.link_id.in_(link_ids),
        finance.STK_ML_QUOTA.day >= start_date,
        finance.STK_ML_QUOTA.day <= end_date
    ).order_by(
        finance.STK_ML_QUOTA.day.desc()
    )
    
    df = finance.run_query(q)
    
    if df.empty:
        print("未查询到数据")
        return df
    
    # 映射名称方便阅读
    link_map = {310001: '沪股通(北向)', 310002: '深股通(北向)'}
    df['link_name'] = df['link_id'].map(link_map)
    
    # 计算净流入 (单位:亿元,原始数据通常为人民币元,视具体数据源精度而定,通常为元)
    # 净流入 = 每日额度 - 每日余额
    df['net_inflow'] = df['daily_quota'] - df['daily_balance']
    
    # 整理列顺序
    df = df[['day', 'link_name', 'net_inflow', 'daily_quota', 'daily_balance']]
    
    return df

# 示例:在研究环境或回测中调用
# 获取最近几天的北向资金数据
# 注意:finance数据通常在收盘后更新
try:
    # 设定查询时间范围
    start_dt = '2023-01-01'
    end_dt = '2023-01-10'
    
    df_flow = query_northbound_money_flow(start_dt, end_dt)
    
    if not df_flow.empty:
        print("北向资金流向数据 (前5行):")
        print(df_flow.head())
        
        # 计算某日的北向资金总流入 (沪股通 + 深股通)
        # 按日期分组求和
        total_flow = df_flow.groupby('day')['net_inflow'].sum()
        print("\n每日北向资金总流入:")
        print(total_flow.head())
except Exception as e:
    print("查询发生错误: ", e)

注意事项

  1. 数据更新时间finance 库的数据通常在交易日收盘后更新。如果在盘中(回测或模拟交易的 handle_data 中)调用,获取到的通常是上一交易日的数据。
  2. 南向资金:如果需要获取南向资金(港股通),只需修改 link_id
    • 310003: 港股通(沪)
    • 310004: 港股通(深)
  3. 单位:数据库中金额单位通常为,在进行分析展示时建议转换为亿元以便于阅读。
  4. 未来函数:在回测中,finance.run_query 会自动规避未来数据(即只能获取到当前回测日期之前已发布的数据)。

Q&A

Q: 如何获取南向资金(港股通)的数据?
A: 使用相同的 finance.STK_ML_QUOTA 表,将 link_id 过滤条件改为 [310003, 310004] 即可。310003代表港股通(沪),310004代表港股通(深)。

Q: 为什么计算出的净流入和某些行情软件显示的数值有细微差异?
A: 这里的计算公式是 额度 - 余额,这代表的是资金占用额。行情软件有时会区分“挂单未成交金额”和“实际成交净买入额”。finance.STK_ML_QUOTA 提供的是额度占用视角的数据,通常被广泛用作资金流向的参考指标。

Q: 可以在分钟级别回测中获取实时的北向资金流向吗?
A: 不可以。finance 数据库是按天更新的(通常是T+1或收盘后),无法提供分钟级别的实时北向资金流向。