【筹码分布策略】用Python识别主力成本区与支撑位

引言

在资本市场博弈中,主力资金动向犹如暗涌下的潮汐,时刻影响着股价的波动轨迹。筹码分布作为揭示市场持仓成本结构的核心工具,能够清晰展现不同价位区间的股票持仓量,帮助投资者洞察主力资金的吸筹、洗盘、拉升和派发过程。通过分析筹码的集中程度、转移方向及量价配合关系,可以构建一套完整的主力行为分析框架,在复杂的市场环境中捕捉具有价值的投资信号。本文从筹码分布的基础理论出发,深入解析主力筹码的识别逻辑与分析方法,并结合 Python 编程实现完整的量化分析流程,涵盖筹码集中度计算、主力筹码变动监测、量价配合模型构建以及实战案例验证等核心内容。

筹码分布的核心理论与数学本质

  1. 1. 筹码分布的物理意义

筹码分布本质上是对市场持仓成本的可视化表达,其核心思想是将每日的成交量按照价格区间进行加权分配,形成不同价位的筹码堆积形态。假设某日成交价格在区间[𝑃𝑙𝑜𝑤,𝑃ℎ𝑖𝑔ℎ]
 , 内,成交量为 V,则该价格区间内的每个价位 P 的筹码增量可近似表示为:

通过累加历史所有交易日的筹码增量,即可得到当前的筹码分布函数 C (P),该函数描述了在价格 P 处的总持仓量占流通股本的比例。

  1. 2. 主力筹码的行为特征

主力资金的操作周期通常分为四个阶段:

  • • 吸筹阶段:股价处于低位区间,成交量温和放大,筹码集中度快速提升,主力通过持续买入收集廉价筹码,此时筹码分布呈现单峰密集形态,且峰值位于当前股价下方。

  • • 洗盘阶段:主力为清洗浮动筹码,会通过震荡打压股价,成交量出现阶段性萎缩,筹码分布表现为高位筹码减少、低位筹码锁定,形成双峰之间的筹码真空带。

  • • 拉升阶段:主力利用资金优势快速推高股价,成交量持续放大,筹码分布的峰值随股价上移,形成典型的 "价升量增" 形态,此时低位筹码开始部分派发,但整体保持相对稳定。

  • • 派发阶段:主力在高位通过对倒交易将筹码派发给散户,成交量出现天量后迅速萎缩,筹码分布显示高位筹码密集峰形成,低位锁定筹码大幅减少,预示着行情即将见顶。

  1. 3. 筹码集中度的量化指标
    为了定量描述筹码的集中程度,我们定义两个核心指标:

  • • 筹码集中度(Concentration Ratio, CR):衡量一定价格区间内的筹码占比,通常计算 CR10(前 10% 价格区间的筹码占比)、CR30 等,计算公式为:

其中,k为价格从高到低排序后前n%的区间数量。

  • • 基尼系数(Gini Coefficient):借鉴经济学中的收入分配理论,衡量筹码分布的均衡程度,取值范围 [0,1],0 表示完全平均分布,1 表示完全集中在某一价位,计算公式为:

其中,μ为平均价格,n 为样本数量。

主力筹码分析的核心算法与 Python 实现

  1. 1. 筹码分布计算函数
    首先构建一个计算指定日期筹码分布的函数,采用加权平均法分配每日成交量到价格区间:

import pandas as pd
import numpy as np
import qstock as qs
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

defcalculate_chip_distribution(df, target_date, price_range=100):
    """
    计算指定日期的筹码分布
    :param df: 包含open, high, low, close, volume的DataFrame
    :param target_date: 目标日期(格式'YYYY-MM-DD')
    :param price_range: 价格区间划分精度(单位:分,即0.01元)
    :return: 筹码分布数组(价格, 筹码占比)
    """
    # 筛选目标日期前的所有数据
    historical_data = df[df['date'] <= target_date].copy()
    # 计算价格最小单位
    price_step = 0.01# 精确到分
    min_price = historical_data['low'].min() - 1 * price_step
    max_price = historical_data['high'].max() + 1 * price_step
    price_bins = np.arange(min_price, max_price, price_step)
    
    chip_dist = np.zeros_like(price_bins, dtype=float)
    total_volume = historical_data['volume'].sum()
    
    for _, row in historical_data.iterrows():
        o, h, l, c, v = row['open'], row['high'], row['low'], row['close'], row['volume']
        # 当天价格区间
        day_low = min(l, o)
        day_high = max(h, o)  # 这里假设以ohlc中的高低作为价格区间,实际可优化为真实成交区间
        # 计算当天筹码在价格区间的分布(均匀分布假设)
        if day_high == day_low:
            continue# 避免除以0
        volume_per_price = v / (day_high - day_low)
        # 找到对应的价格区间索引
        start_idx = np.searchsorted(price_bins, day_low, side='left')
        end_idx = np.searchsorted(price_bins, day_high, side='right')
        chip_dist[start_idx:end_idx] += volume_per_price * price_step
    
    chip_dist /= total_volume  # 转换为占比
    return price_bins, chip_dist
  1. 2. 筹码集中度计算

实现 CR10、CR30 指标及基尼系数计算:

defcalculate_concentration(chip_prices, chip_dist):
    """
    计算筹码集中度指标
    :param chip_prices: 价格数组
    :param chip_dist: 筹码分布数组(占比)
    :return: CR10, CR30, 基尼系数
    """
    # 按价格从高到低排序
    sorted_idx = np.argsort(-chip_prices)
    sorted_prices = chip_prices[sorted_idx]
    sorted_dist = chip_dist[sorted_idx]
    
    # 计算累计分布
    cumulative_dist = np.cumsum(sorted_dist)
    total = cumulative_dist[-1]
    
    # 找CR10:累计达到10%的价格区间占比
    cr10 = np.where(cumulative_dist >= 0.1)[0][0] + 1
    cr10 = cr10 / len(sorted_dist) * 100# 表示前x%的价格区间集中了10%的筹码,数值越小集中度越高
    
    cr30 = np.where(cumulative_dist >= 0.3)[0][0] + 1
    cr30 = cr30 / len(sorted_dist) * 100
    
    # 计算基尼系数
    n = len(sorted_dist)
    gini = (np.sum(np.abs(np.subtract.outer(sorted_dist, sorted_dist))) ) / (2 * n**2 * np.mean(sorted_dist))
    return cr10, cr30, gini
  1. 3. 主力筹码变动监测

通过对比不同日期的筹码分布,计算主力筹码的转移方向:

defanalyze_chip_change(df, date1, date2):
    """
    分析两个日期之间的筹码变动
    :return: 变动矩阵(价格, 筹码变动量)
    """
    p1, c1 = calculate_chip_distribution(df, date1)
    p2, c2 = calculate_chip_distribution(df, date2)
    
    # 合并价格区间
    all_prices = np.unique(np.concatenate([p1, p2]))
    # 插值计算两个日期在统一价格区间的分布
    c1_interp = np.interp(all_prices, p1, c1, left=0, right=0)
    c2_interp = np.interp(all_prices, p2, c2, left=0, right=0)
    
    change = c2_interp - c1_interp
    return all_prices, change
  1. 4. 量价配合分析模型

构建量价偏离度指标,识别主力对倒行为:

defcalculate_volume_deviation(df, window=20):
    """
    计算成交量偏离度(相对20日平均)
    """
    df = df.copy()
    df['ma20_vol'] = df['volume'].rolling(window).mean()
    df['vol_deviation'] = (df['volume'] - df['ma20_vol']) / df['ma20_vol']
    return df

defanalyze_price_volume(df, chip_prices, chip_dist):
    """
    结合筹码分布的量价分析
    """
    # 计算当前股价对应的筹码位置
    current_price = df[df['date'] == max(df['date'])]['close'].values[0]
    idx = np.searchsorted(chip_prices, current_price, side='right')
    current_chip = chip_dist[idx]
    
    # 量价背离指标:成交量创新高但筹码集中度下降
    volume_high = df['volume'] == df['volume'].rolling(60).max()
    concentration_decrease = (df['cr10'].diff() > 0)  # cr10数值越大集中度越低
    volume_price_divergence = volume_high & concentration_decrease
    return current_chip, volume_price_divergence

主力筹码分布的实战分析框架

  1. 1. 筹码形态识别体系

(1)单峰密集形态

当筹码分布呈现单一密集峰,且峰值对应的价格区间占比超过 30%,同时 CR10 小于 15% 时,表明主力高度控盘,常见于吸筹末期或拉升初期。此时若股价突破密集峰上沿,且成交量有效放大,可视为买入信号。

(2)双峰对峙形态
在股价区间形成上下两个密集峰,中间为筹码真空带,表明市场存在多空分歧。若上峰为套牢盘,下峰为获利盘,当股价回落至下峰支撑位并出现缩量止跌,说明主力洗盘完成,可关注反弹机会。

(3)发散形态

筹码分布呈现分散状态,CR30 大于 50%,通常出现在趋势反转初期或大幅震荡阶段,此时主力控盘度低,股价波动随机性强,应避免盲目介入。

  1. 2. 主力控盘度量化模型

通过换手率与筹码集中度的联动分析,构建控盘度指标:

其中,平均换手率取最近 30 日均值。当控盘度大于 50 时,表明主力具备较强控盘能力;当控盘度持续上升且股价滞涨,可能预示即将启动主升浪。

  1. 3. 量价时空四维分析框架

实战案例:某个股筹码演变分析

  1. 1. 数据预处理

假设我们选取 2023-2025 年中国平安交易数据,首先计算关键时间点的筹码分布:

df=qs.get_data('中国平安',start='20230101')
df=df.reset_index()

# 设定分析日期
start_date = '2023-01-01'
end_date = qs.latest_trade_date()
key_dates = ['2023-06-30', '2023-12-29', '2024-06-28', '2024-12-31',end_date]

# 计算各关键日期的筹码分布
chip_data = {}
for date in key_dates:
    prices, dist = calculate_chip_distribution(df, date)
    chip_data[date] = (prices, dist)
    cr10, cr30, gini = calculate_concentration(prices, dist)
    df.loc[df['date'] == date, ['cr10', 'cr30', 'gini']] = [cr10, cr30, gini]
df[['date','close','cr10','cr30','gini']].dropna().round(2)
  1. 2. 可视化分析

绘制筹码分布动态变化图,篇幅有限,可视化完整代码见Python金融量化知识星球。

defplot_chip_distribution(price_bins, chip_dist, target_price, date):
    """
    绘制单日期筹码分布图(独立窗口)
    :param price_bins: 价格区间数组
    :param chip_dist: 筹码分布占比数组
    :param target_price: 目标日期收盘价
    :param date: 分析日期
    """
    pass 完整代码见Python金融量化知识星球

下面再采用一种简化的方法来模拟筹码分布的计算过程。我们假设筹码的抛出概率与持股时间和盈利程度有关,并据此计算每日的筹码转移情况。然后,我们将每日的筹码转移情况累加起来,形成最终的筹码分布图。

主力成本区间:(51.566, 51.66]
支撑位建议:51.57元

结语

主力筹码分布分析如同市场的 "CT 扫描仪",能够穿透价格波动的表象,揭示资金博弈的深层逻辑。然而,资本市场永远充满不确定性,筹码分布的有效性取决于对市场生态的深刻理解与多维度数据的综合运用。在实战中,我们既要关注筹码集中度、变动率等核心指标,也要结合量价关系、市场情绪和基本面因素进行交叉验证。记住,没有任何单一指标能够精准预测股价走势,唯有建立系统化的分析体系,持续跟踪主力资金的动态变化,才能在复杂的市场环境中占据先机。本文提供的 Python 代码框架可作为进一步研究的基础,读者可根据实际需求扩展数据接口、优化筹码分配算法或引入机器学习模型提升预测精度。

图片

关于Python金融量化

图片

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取八五折优惠。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值