Python量化分析:主力资金成本支撑位识别与筹码分布实战
在资本市场的复杂博弈中,主力资金的动向深刻塑造着股价的运行轨迹。筹码分布作为一种揭示市场持仓成本结构的核心分析工具,能够直观地展现不同价格区间内的股票持仓状况,从而帮助投资者洞悉主力资金完整的运作周期——包括吸筹、洗盘、拉升与派发。通过系统性地分析筹码的集中程度、转移方向以及与价格、成交量的配合关系,我们可以构建一套逻辑严谨的主力行为分析框架,进而在纷繁复杂的市场信息中捕捉具有潜在价值的投资信号。本文将立足于筹码分布的基础理论,深入剖析识别主力筹码的内在逻辑与分析方法,并借助Python编程实现一套完整的量化分析流程,内容涵盖筹码集中度计算、主力筹码变动监测、量价配合模型构建以及最终的实战案例验证。
筹码分布的核心理论与量化基础
1. 筹码分布的物理意义与数学模型
筹码分布本质上是对市场中所有持仓者成本结构的可视化呈现。其核心思想在于,将历史上每一个交易日的成交量,按照其成交的价格区间进行加权分配,从而累积形成不同价位上的“筹码”堆积形态。假设某交易日,股票成交价格区间为[P_low, P_high],当日总成交量为V,那么可以近似认为该价格区间内每一个价位P所获得的筹码增量为:
通过累加历史上所有交易日的筹码增量,我们就能得到当前时刻的筹码分布函数C(P)。这个函数精确描述了在任意价格P处,市场总持仓量占流通股本的比例,是后续所有分析的数据基石。
2. 主力资金运作的行为特征与筹码形态
主力资金的运作通常呈现明显的周期性,不同阶段会在筹码分布图上留下独特的“足迹”:
- 吸筹阶段:股价徘徊于相对低位,成交量呈现温和放大态势。主力通过持续性买入收集廉价筹码,使得筹码集中度迅速提升。此时的筹码分布往往表现为单一、密集的峰形,且峰值中心位于当前股价下方,形成坚实的成本支撑。
- 洗盘阶段:为清洗市场中的浮动筹码、抬高市场平均持仓成本,主力会刻意制造股价震荡。成交量时而萎缩,筹码分布则显示出高位套牢筹码减少、低位获利筹码被锁定的迹象,常常在高低价位之间形成一个筹码相对稀疏的“真空地带”。
- 拉升阶段:主力利用资金优势推动股价快速上行,伴随成交量持续放大。筹码分布的峰值会随着股价上涨而同步上移,形成经典的“价升量增”格局。此时,底部的获利筹码开始部分松动并向高位转移,但整体筹码结构仍保持相对稳定。
- 派发阶段:股价处于高位,主力通过对倒等方式将手中筹码派发给市场跟风盘。成交量往往出现“天量”后迅速萎缩,筹码分布图清晰地显示高位形成新的密集峰,而下方锁定的低成本筹码大幅减少,这通常是行情即将见顶的重要预警信号。
3. 量化筹码集中度的核心指标
为了精确、定量地描述筹码的聚集程度,我们引入两个关键指标:
- 筹码集中度 (Concentration Ratio, CR):用于衡量在特定价格区间内聚集的筹码比例。常用的有CR10(价格从高到低排序,前10%的价格区间所聚集的筹码占比)、CR30等。其计算公式体现了筹码分布的“头部”集中特性。

其中,k代表价格从高到低排序后,累计筹码占比达到n%时所覆盖的价格区间数量。CR值越小,说明筹码越集中在少数高价区间,集中度越高。
- 基尼系数 (Gini Coefficient):借鉴经济学中衡量收入分配公平程度的指标,用于评估筹码分布的均衡性。其取值范围在[0,1]之间,0代表筹码完全均匀分布在所有价位,1代表筹码完全集中在某一个价位。计算公式如下:

其中,μ代表平均价格,n为样本(价格区间)数量。基尼系数越接近1,表明筹码分布越不均衡,主力控盘可能性越大。
主力筹码分析的Python算法实现
1. 筹码分布计算函数
我们首先构建一个核心函数,用于计算指定历史截止日期的筹码分布。这里采用将每日成交量均匀分配至当日价格区间的简化加权方法。
import pandas as pd
import numpy as np
import qstock as qs
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
def calculate_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']
# 确定当日实际价格波动区间(简化处理为OHLC中的高低价)
day_low = min(l, o)
day_high = max(h, o)
# 计算筹码在当日价格区间内的均匀分布密度
if day_high == day_low:
continue # 避免除以零
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
2. 筹码集中度与基尼系数计算
接下来,实现计算CR10、CR30和基尼系数的函数,为量化分析提供具体数值依据。
def calculate_concentration(chip_prices, chip_dist):
"""
计算筹码集中度指标(CR10, CR30)和基尼系数
: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_idx = np.where(cumulative_dist >= 0.1)[0][0] + 1
cr10 = cr10_idx / len(sorted_dist) * 100 # 数值越小,说明筹码越集中在高价区
# 计算CR30
cr30_idx = np.where(cumulative_dist >= 0.3)[0][0] + 1
cr30 = cr30_idx / 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
3. 监测主力筹码的动态转移
通过对比两个不同时间点的筹码分布,可以直观看出筹码的流动方向,这是判断主力动向的关键。
def analyze_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
4. 构建量价配合分析模型
量价关系是验证筹码分析结论的重要维度。此处构建一个成交量偏离度指标,用于识别异常放量行为。
def calculate_volume_deviation(df, window=20):
"""
计算成交量偏离度(当前成交量相对于近期平均成交量的波动幅度)
:param window: 计算移动平均的窗口期,默认为20日
:return: 添加了偏离度指标的DataFrame
"""
df = df.copy()
df['ma20_vol'] = df['volume'].rolling(window).mean()
df['vol_deviation'] = (df['volume'] - df['ma20_vol']) / df['ma20_vol']
return df
def analyze_price_volume(df, chip_prices, chip_dist):
"""
结合筹码分布进行量价综合分析
:return: 当前股价处的筹码密度, 量价背离信号序列
"""
# 获取最新收盘价
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]
# 构建一个简单的量价背离预警指标:成交量创阶段新高,但筹码集中度却在下降(CR10值上升)
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)单峰密集形态 当筹码分布图呈现单一的、突出的密集峰,且该峰值区域所覆盖的筹码总量超过30%,同时CR10指标小于15%时,通常表明主力资金高度控盘。这种形态常见于吸筹阶段的末期或拉升行情的初期。若此时股价伴随显著放量向上突破密集峰的上沿阻力位,可视为一个技术性买入信号。
(2)双峰对峙形态 筹码在股价运行区间的上方和下方分别形成两个明显的密集峰,中间价位则筹码稀少,形成“真空带”。这反映了市场在该区间存在巨大的多空分歧。若上方为历史套牢盘峰,下方为新进主力获利盘峰,当股价回调至下方密集峰区域并出现缩量企稳迹象时,往往意味着主力洗盘动作可能接近完成,值得关注潜在的反弹机会。
(3)多峰发散形态 筹码广泛而分散地分布在多个价格区间,CR30指标往往大于50%。这种形态通常出现在长期盘整后趋势反转的初期,或股价经历大幅无序震荡的阶段。它表明市场暂无明确主导力量,主力控盘程度较低,股价短期方向随机性较强,投资者应保持谨慎,避免盲目介入。
2. 主力控盘度的量化评估模型
我们可以通过结合换手率与筹码集中度,构建一个简易的控盘度评估指标:
其中,平均换手率通常取最近30个交易日的均值。当该控盘度指标大于50时,通常表明主力对股价具备较强的引导能力;若该指标在股价横盘或小幅震荡期间持续攀升,则可能预示着主力正在积蓄力量,主升浪行情启动的概率在增加。
3. 融合时空维度的综合分析视角
一个更完整的分析框架需要将价格、成交量、筹码分布(空间)与时间周期结合起来考虑。
实战案例:个股筹码结构演变分析
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)
# 将计算出的指标存回原DataFrame对应日期行
df.loc[df['date'] == date, ['cr10', 'cr30', 'gini']] = [cr10, cr30, gini]
# 查看关键日期的指标
print(df[['date', 'close', 'cr10', 'cr30', 'gini']].dropna().round(2))
2. 筹码分布动态可视化分析
通过绘图可以直观观察筹码峰的移动、集中度的变化。以下是不同时间点筹码分布的示意图,清晰展示了从集中到发散再到集中的全过程(具体绘图代码因篇幅略去,核心是使用matplotlib绘制横向筹码山峦图并与股价叠加)。
3. 算法识别主力成本与支撑位
除了标准方法,我们还可以引入考虑持股时间与盈亏程度的筹码流动概率模型,进行更精细的模拟计算,从而动态评估主力成本区。
主力成本核心区间:(51.566, 51.66]
当前重要支撑位建议关注:51.57元附近
该结论由模型根据筹码峰值密度与稳定性计算得出,下图展示了基于动态概率模型的筹码流动模拟结果:
结语
主力筹码分布分析技术,就如同为观察市场安装了一台“CT扫描仪”,它能够穿透每日价格波动的表象,深入揭示其背后资金博弈的成本结构与流动逻辑。然而,必须清醒认识到,资本市场永远充斥着不确定性,筹码分布分析的有效性高度依赖于对市场微观结构的深刻理解,并需要与宏观经济、行业基本面、市场情绪等多维度信息进行交叉验证。在实战应用中,我们既要密切关注筹码集中度、变动速率等核心量化指标,也必须将其置于量价关系、资金流向的整体框架中进行审视。
请谨记,没有任何单一的技术指标或分析工具能够百分百精准地预测未来股价走势。真正的优势来源于构建一套系统化的分析体系,并持续跟踪观察主力资金行为模式的动态变化。本文所提供的Python代码与分析框架,旨在抛砖引玉,可作为读者进一步深入研究的基础。读者可以根据自身的实际需求,扩展更高效的数据接口,优化筹码分配的计算算法,甚至可以尝试引入机器学习模型来提升对主力行为模式的识别与预测精度。