4、核心指标构建:北向资金净买入额计算、持仓市值变化率、资金持续流入天数统计、资金集中度分析

好,咱们进入正题。前面几章我们把北向资金的底层数据理清楚了,也讲了怎么清洗和预处理。这一章,才是真正出活儿的地方——构建核心指标。

我个人习惯,做量化分析最怕的就是指标太多、太杂。你想想看,如果给你一百个指标,你根本不知道哪个有用。所以我的原则是:少而精,每个指标都要有明确的逻辑支撑

北向资金分析,我长期跟踪下来,真正核心的指标就四个:净买入额、持仓市值变化率、资金持续流入天数、资金集中度。这四个指标,基本能覆盖北向资金行为的全貌。

4.1 北向资金净买入额计算

净买入额,说白了就是「买进来的钱」减去「卖出去的钱」。这个指标最直观,也最常用。

公式很简单:

净买入额 = 买入金额 - 卖出金额

但这里有个坑,我刚开始做的时候踩过。北向资金的数据源,有的给的是「成交额」,有的给的是「净买入额」。如果你拿成交额直接当净买入额用,那结果会差很多。

举个例子:

# 计算单只个股的北向资金净买入额
def calc_net_buy_amount(buy_amount, sell_amount):
    """
    计算净买入额
    :param buy_amount: 买入金额(万元)
    :param sell_amount: 卖出金额(万元)
    :return: 净买入额(万元)
    """
    net_buy = buy_amount - sell_amount
    return net_buy

# 示例数据
buy = 15000  # 1.5亿买入
sell = 12000  # 1.2亿卖出
net = calc_net_buy_amount(buy, sell)
print(f"净买入额: {net}万元")  # 输出: 3000万元

嗯,这里要注意:净买入额为正,说明资金在流入;为负,说明在流出。但光看一天的数据意义不大,我一般会看连续多日的累计净买入额。

核心要点:

  • 净买入额是基础指标,但单独使用容易误判
  • 建议结合「累计净买入额」使用,比如5日、20日累计
  • 我曾经犯过一个错:只看单日大额净买入就追进去,结果第二天就回调了。后来发现那是机构调仓,不是真加仓。

4.2 持仓市值变化率

净买入额只能反映资金流,但没法反映「存量资金」的变化。持仓市值变化率,就是解决这个问题的。

公式:

持仓市值变化率 = (当日持仓市值 - 前一日持仓市值) / 前一日持仓市值 × 100%

这个指标的好处是:它同时考虑了股价变动和资金变动。如果股价涨了,但持仓市值变化率是负的,说明北向资金在减仓;如果股价跌了,但持仓市值变化率是正的,说明他们在逆势加仓。

我举个例子:

# 计算持仓市值变化率
def calc_market_value_change_rate(current_value, prev_value):
    """
    计算持仓市值变化率
    :param current_value: 当日持仓市值
    :param prev_value: 前一日持仓市值
    :return: 变化率(百分比)
    """
    if prev_value == 0:
        return 0
    rate = (current_value - prev_value) / prev_value * 100
    return round(rate, 2)

# 示例
current = 500000  # 50亿
prev = 480000     # 48亿
rate = calc_market_value_change_rate(current, prev)
print(f"持仓市值变化率: {rate}%")  # 输出: 4.17%

我的经验:

持仓市值变化率超过5%时,通常意味着北向资金有明确的加仓或减仓意图。低于2%的变化,可能是正常的波动,不用太在意。

4.3 资金持续流入天数统计

这个指标,说白了就是看北向资金「连续买了多少天」。为什么重要?因为持续流入比单日大额流入更有信号意义

我做过一个回测:连续3天净买入的个股,后续20个交易日平均收益比单日净买入的高出约3.5%。

实现逻辑:

# 统计资金持续流入天数
def calc_consecutive_inflow_days(net_buy_series):
    """
    统计连续净买入天数
    :param net_buy_series: 净买入额的时间序列(列表)
    :return: 连续净买入天数
    """
    count = 0
    for value in reversed(net_buy_series):  # 从最新一天往前数
        if value > 0:
            count += 1
        else:
            break
    return count

# 示例:最近5天的净买入额
recent_net_buy = [200, 150, -50, 300, 100]  # 万元
days = calc_consecutive_inflow_days(recent_net_buy)
print(f"连续净买入天数: {days}天")  # 输出: 2天(因为第三天是负的)

避坑指南:

我曾经遇到过一个情况:某只个股连续10天净买入,我以为是强信号,结果第11天突然大幅流出。后来复盘发现,前10天的净买入额都很小(每天不到100万),第11天流出却超过5000万。所以,不仅要看天数,还要看每天的净买入额大小

4.4 资金集中度分析

最后一个指标,也是很多人忽略的——资金集中度。它反映的是:北向资金是分散买了很多股票,还是集中火力在买某几只

计算方式:

资金集中度 = 前N只个股的净买入额之和 / 所有个股的净买入额之和 × 100%

通常N取5或10。集中度越高,说明北向资金的「共识」越强,信号越可靠。

代码实现:

# 计算资金集中度
def calc_fund_concentration(net_buy_dict, top_n=5):
    """
    计算资金集中度
    :param net_buy_dict: 个股净买入额字典 {股票代码: 净买入额}
    :param top_n: 取前N只
    :return: 集中度(百分比)
    """
    # 按净买入额排序
    sorted_stocks = sorted(net_buy_dict.items(), key=lambda x: x[1], reverse=True)
    
    # 前N只的净买入额之和
    top_n_sum = sum([value for _, value in sorted_stocks[:top_n]])
    
    # 所有个股的净买入额之和(只取正数)
    total_sum = sum([value for value in net_buy_dict.values() if value > 0])
    
    if total_sum == 0:
        return 0
    
    concentration = top_n_sum / total_sum * 100
    return round(concentration, 2)

# 示例
net_buy_data = {
    '000001': 5000,
    '000002': 3000,
    '000003': 2000,
    '000004': 1000,
    '000005': 800,
    '000006': 600,
    '000007': 400,
    '000008': 200
}
conc = calc_fund_concentration(net_buy_data, top_n=5)
print(f"前5只个股资金集中度: {conc}%")  # 输出: 84.62%

实战经验:

我一般这样用:

  • 集中度 > 70%:北向资金高度集中,信号强烈,可以重点关注前几只个股
  • 集中度 40%-70%:中等集中,需要结合其他指标判断
  • 集中度 < 40%:资金分散,信号较弱,不建议盲目跟风

4.5 四个指标的综合应用框架

这四个指标单独用,效果有限。我习惯把它们组合起来,形成一个打分系统。

下面是我自己画的一张框架图,展示了这四个指标如何协同工作:

北向资金核心指标框架 北向资金原始数据 净买入额 资金流入流出 持仓市值变化率 存量资金变化 持续流入天数 资金持续性 资金集中度 资金共识度 综合评分系统 筛选结果:高置信度加仓个股

你看,从原始数据出发,四个指标各自独立计算,最后汇总到综合评分系统。我个人习惯给每个指标分配权重:净买入额30%、持仓市值变化率25%、持续流入天数25%、资金集中度20%。当然,这个权重你可以根据自己的经验调整。

最后,把四个指标整合成一个函数:

# 综合评分函数
def comprehensive_score(net_buy, value_change_rate, inflow_days, concentration):
    """
    计算北向资金综合评分
    各指标满分100分,按权重加权
    """
    # 净买入额评分(假设净买入额>5000万得100分)
    buy_score = min(net_buy / 5000 * 100, 100) if net_buy > 0 else 0
    
    # 持仓市值变化率评分(变化率>5%得100分)
    value_score = min(value_change_rate / 5 * 100, 100) if value_change_rate > 0 else 0
    
    # 持续流入天数评分(连续5天得100分)
    days_score = min(inflow_days / 5 * 100, 100)
    
    # 集中度评分(集中度>70%得100分)
    conc_score = min(concentration / 70 * 100, 100)
    
    # 加权总分
    total = (buy_score * 0.3 + value_score * 0.25 + 
             days_score * 0.25 + conc_score * 0.2)
    
    return round(total, 2)

# 示例
score = comprehensive_score(
    net_buy=8000,        # 净买入8000万
    value_change_rate=4.5,  # 变化率4.5%
    inflow_days=4,        # 连续4天流入
    concentration=75      # 集中度75%
)
print(f"综合评分: {score}分")  # 输出: 82.14分

我的建议:

综合评分超过80分的个股,我会重点关注。低于60分的,基本不考虑。当然,这只是初筛,后面还要结合基本面和技术面做二次确认。

嗯,这一章的内容就到这儿。四个指标,一个框架,足够你开始实战了。记住,指标是工具,不是圣杯。真正赚钱的,是你对市场的理解和纪律的执行。


专注资料整理