核心指标计算(上):大单成交额、特大单成交额、资金净流入/流出计算逻辑

各位同学,今天我们来啃一块硬骨头——主力资金的核心指标计算。

说实话,我刚入行那会儿,看到各种软件上红红绿绿的资金流数据,也是一头雾水。后来自己动手写代码算了一遍,才明白里面的门道。今天我就把这些经验掰开了揉碎了讲给你听。

一、什么是大单和特大单?

先搞清楚概念。我们常说的「主力资金」,其实是通过单笔成交的金额大小来划分的。

我个人习惯把成交单分成四类:

  • 小单:单笔成交金额 < 4万元
  • 中单:4万元 ≤ 单笔成交金额 < 20万元
  • 大单:20万元 ≤ 单笔成交金额 < 100万元
  • 特大单:单笔成交金额 ≥ 100万元

你可能会问:「为什么是20万和100万这两个阈值?」

嗯,这个其实没有统一标准。我在项目中遇到过,不同交易所、不同软件商的划分方式略有差异。有的用20万/100万,有的用50万/200万。但核心逻辑是一样的——用金额大小来区分散户行为和机构行为。

核心要点:特大单几乎可以肯定是机构行为。大单可能是大户,也可能是多家散户的集合。但特大单,尤其是连续出现的特大单,基本就是主力在干活。

二、大单成交额与特大单成交额的计算

计算逻辑其实很简单。我们拿到的原始数据是每一笔成交的明细,包含:

  • 成交时间
  • 成交价格
  • 成交数量
  • 成交金额(价格 × 数量)
  • 买卖方向(主动买、主动卖)

然后我们按金额大小做分类汇总:

def classify_order(amount):
    """根据成交金额分类"""
    if amount < 40000:
        return '小单'
    elif amount < 200000:
        return '中单'
    elif amount < 1000000:
        return '大单'
    else:
        return '特大单'

# 计算某只股票当日的大单成交额
def calc_large_turnover(trades_df):
    large_orders = trades_df[
        (trades_df['amount'] >= 200000) & 
        (trades_df['amount'] < 1000000)
    ]
    return large_orders['amount'].sum()

# 计算特大单成交额
def calc_extra_large_turnover(trades_df):
    extra_large = trades_df[trades_df['amount'] >= 1000000]
    return extra_large['amount'].sum()

你看,代码就这么几行。但实际项目中,数据量会非常大。一只活跃股票一天可能有几万笔成交,全市场几千只股票,数据量是百万级的。所以性能优化很重要——我一般会用向量化操作,而不是循环。

小技巧:用 pandas 的 cut 函数可以一行代码完成分类,比写 if-else 快得多:

df['order_type'] = pd.cut(
    df['amount'], 
    bins=[0, 40000, 200000, 1000000, float('inf')],
    labels=['小单', '中单', '大单', '特大单']
)

三、资金净流入/流出的计算逻辑

这个才是重点,也是很多新手容易搞混的地方。

资金净流入的计算公式是:

净流入 = 主动买入成交额 - 主动卖出成交额

说白了,就是看买方和卖方谁更主动。如果买方愿意主动吃卖单,说明看好后市;如果卖方主动砸盘,说明不看好。

具体到代码实现:

def calc_net_inflow(trades_df):
    """
    计算资金净流入
    trades_df 必须包含 'direction' 列:
        'B' 表示主动买入(Buy)
        'S' 表示主动卖出(Sell)
    """
    buy_amount = trades_df[trades_df['direction'] == 'B']['amount'].sum()
    sell_amount = trades_df[trades_df['direction'] == 'S']['amount'].sum()
    
    net_inflow = buy_amount - sell_amount
    return net_inflow

# 计算大单级别的净流入
def calc_large_net_inflow(trades_df):
    large_trades = trades_df[
        (trades_df['amount'] >= 200000) & 
        (trades_df['amount'] < 1000000)
    ]
    return calc_net_inflow(large_trades)

# 计算特大单级别的净流入
def calc_extra_large_net_inflow(trades_df):
    extra_large_trades = trades_df[trades_df['amount'] >= 1000000]
    return calc_net_inflow(extra_large_trades)

避坑指南:我曾经踩过一个坑——有些行情数据源会把「主动买卖」的方向搞反。不同交易所的标记规则不一样,有的用 'B'/'S',有的用 1/0,还有的用 '买'/'卖'。拿到数据后,一定要先做数据校验。

我的校验方法是:找一笔明显的大单,比如一笔100万的成交,如果价格是向上跳动的,那应该是主动买入;如果是向下跳动的,则是主动卖出。用这个逻辑反向验证数据的方向标记是否正确。

四、完整的计算流程

下面我把整个流程串起来,画了一张图,方便你理解:

主力资金指标计算流程 原始成交明细数据 时间、价格、数量、金额、方向 按金额大小分类 小单(<4万) | 中单(4-20万) | 大单(20-100万) | 特大单(≥100万) 大单成交额 汇总大单的成交金额 特大单成交额 汇总特大单的成交金额 大单净流入 主动买入 - 主动卖出 特大单净流入 主动买入 - 主动卖出 最终输出:大单成交额、特大单成交额、净流入/流出

五、实战中的注意事项

讲完了理论,说说我在实战中总结的几个要点:

  1. 数据频率很重要:我建议用 tick 级数据(逐笔成交)来计算,而不是用分钟线。分钟线已经丢失了单笔成交的信息,算出来的资金流不准。
  2. 复权处理:遇到分红、送股时,股价会变化,单笔成交金额的阈值也要相应调整。否则你会发现分红后突然多出很多「大单」,其实是假象。
  3. 跨市场对比:不同市场的股票价格差异很大。比如贵州茅台一手就要十几万,它的「小单」可能相当于别的股票的「大单」。所以阈值要根据股价做动态调整,我一般用「成交金额 / 股价 × 100」来标准化。
  4. 时间窗口:我习惯同时看 1分钟、5分钟、30分钟三个级别的资金流。短周期看异动,长周期看趋势。

一个实用技巧:当你发现某只股票出现「大单净流入 + 特大单净流入」同时为正,且金额持续放大时,这往往是主力建仓的信号。反之,如果大单和特大单都在流出,而股价还在涨,那就要小心了——可能是主力在拉高出货。

好了,这一节的内容就到这里。核心就是三件事:分类、汇总、算净额。下一节我们会讲如何把这些指标组合起来,构建真正的监控模型。


专注资料整理