别再只看K线了!用Python自制筹码分布图,可视化Winner函数帮你判断支撑压力

张开发
2026/4/10 12:05:57 15 分钟阅读

分享文章

别再只看K线了!用Python自制筹码分布图,可视化Winner函数帮你判断支撑压力
用Python打造专业级筹码分布图从数据清洗到动态可视化的完整实战在传统股票分析中K线图几乎是每个投资者的标配工具。但真正决定股价关键支撑与压力位的往往是隐藏在价格背后的筹码分布——那些在不同价位买入的持仓量。想象一下当你能直观看到哪些价格区域聚集了大量持仓哪些价位存在明显的筹码真空你的交易决策将获得怎样的提升1. 为什么筹码分布比K线更能揭示市场真相K线告诉我们价格如何波动而筹码分布揭示的是市场参与者的真实成本。当股价跌至某个密集成交区时这里往往形成强力支撑——因为大量持仓者会本能地保卫自己的成本价反之当股价上涨至历史密集区时这些解套盘涌出就会形成天然压力。传统交易软件的筹码分布图存在三个致命缺陷黑箱操作不公开计算逻辑用户无法验证准确性静态展示无法动态观察筹码随时间的迁移过程交互局限不能自由调整参数或与其他指标叠加分析用Python自建筹码分布系统你将获得透明度完全掌控算法每个细节灵活性自定义时间范围、计算参数和可视化风格扩展性轻松叠加其他技术指标进行多维分析关键洞察筹码分布的本质是价格-持仓量的二维概率密度函数。Winner函数计算的是这个分布函数在当前价格左侧的积分面积。2. 构建筹码分布计算引擎2.1 数据准备与清洗任何分析的基础都是高质量的数据。我们需要以下核心字段import pandas as pd from tqdm import tqdm # 进度条工具 def load_tick_data(stock_code): 加载股票tick级交易数据 # 这里假设已经从数据库或API获取原始数据 cols [timestamp, price, volume, amount] df pd.read_csv(f{stock_code}.csv, parse_dates[timestamp]) return df[cols]常见的数据质量问题及处理方法问题类型检测方法处理方案异常价格3σ原则或分位数检查用前后均值填充或直接删除零成交量volume 0删除该条记录时间戳重复df.duplicated()保留最后一条或聚合处理价格跳变计算相邻价差比率设置合理阈值过滤2.2 筹码分布算法实现基于换手率的递推算法是最接近商业软件逻辑的方法。核心公式当日新筹码 当日成交量 留存筹码 前日筹码 × (1 - 当日换手率)Python实现代码def calculate_chip_distribution(df, window250): 计算移动窗口内的筹码分布 df df.copy() df[turnover] df[volume] / df[volume].rolling(window).sum() df[turnover].fillna(0, inplaceTrue) chips [] current_chips pd.Series() for idx, row in tqdm(df.iterrows(), totallen(df)): # 新交易日筹码 new_chips pd.Series([row[volume]], index[row[price]]) if len(current_chips) 0: # 留存筹码 前日筹码 × (1 - 当日换手率) retained_chips current_chips * (1 - row[turnover]) current_chips retained_chips.add(new_chips, fill_value0) else: current_chips new_chips chips.append(current_chips) return chips参数优化建议窗口大小通常取120-250个交易日半年到一年价格精度对高价股适当四舍五入如50元以上取整到0.1元平滑处理对最终分布应用高斯滤波消除毛刺3. 动态可视化让筹码活起来3.1 基础热力图绘制使用Matplotlib的hexbin函数创建二维密度图import matplotlib.pyplot as plt import numpy as np def plot_chip_heatmap(chips, prices): 绘制筹码热力图 plt.figure(figsize(12, 6)) # 准备数据 x np.concatenate([np.repeat(i, len(c)) for i, c in enumerate(chips)]) y np.concatenate([c.index.values for c in chips]) w np.concatenate([c.values for c in chips]) # 热力图 hb plt.hexbin(x, y, Cw, gridsize50, cmapviridis, reduce_C_functionnp.sum, mincnt1) # 叠加价格线 plt.plot(prices, w-, linewidth1.5, alpha0.7) plt.colorbar(hb, labelChip Concentration) plt.xlabel(Trading Days) plt.ylabel(Price) plt.title(Dynamic Chip Distribution) plt.show()3.2 交互式三维可视化Plotly提供的三维曲面图能更直观展示筹码堆积import plotly.graph_objects as go def interactive_3d_chips(chips, prices): 交互式3D筹码分布图 # 准备网格数据 days range(len(chips)) price_levels np.linspace(min(prices)*0.9, max(prices)*1.1, 100) Z np.zeros((len(days), len(price_levels))) for i, day_chips in enumerate(chips): for price, vol in day_chips.items(): idx np.abs(price_levels - price).argmin() Z[i, idx] vol fig go.Figure(data[ go.Surface(zZ, xdays, yprice_levels, colorscaleViridis) ]) fig.update_layout( title3D Chip Distribution, scenedict( xaxis_titleTrading Days, yaxis_titlePrice, zaxis_titleChip Volume ), height800 ) fig.show()可视化优化技巧颜色映射使用matplotlib.cm.get_cmap(plasma).reversed()让高位筹码更醒目透明度设置alpha0.7让重叠区域可见动态标注添加关键价位和成交量突变的标记4. Winner函数的实战应用4.1 计算获利盘比例Winner函数的核心是计算当前价格下方的筹码占比def winner_function(chips, current_price): 计算当前价格下的获利盘比例 if not chips: return 0 total sum(chips[-1].values) if total 0: return 0 profitable sum(vol for price, vol in chips[-1].items() if price current_price) return profitable / total4.2 支撑压力位识别策略结合筹码分布与Winner值可以开发多种交易策略支撑位判定条件价格处于筹码密集区下沿当前Winner值 30%多数持仓亏损成交量萎缩至20日均量以下压力位判定条件价格接近历史筹码峰顶部当前Winner值 70%多数持仓盈利出现放量滞涨现象策略回测框架示例def backtest_strategy(data, chips): signals [] for i in range(1, len(data)): price data[close][i] winner winner_function(chips[:i], price) # 支撑信号 if winner 0.3 and price data[low][i-1]: signals.append((buy, data.index[i], price)) # 压力信号 elif winner 0.7 and price data[high][i-1]: signals.append((sell, data.index[i], price)) return pd.DataFrame(signals, columns[signal, date, price])5. 高级技巧筹码分布与其他指标的协同分析5.1 与量价指标结合创建复合指标筹码换手率def chip_turnover(chips, window5): 计算筹码换手率 changes [] for i in range(window, len(chips)): common_prices set(chips[i].keys()) set(chips[i-window].keys()) turnover sum(abs(chips[i][p] - chips[i-window][p]) for p in common_prices) total sum(chips[i].values()) changes.append(turnover / total if total 0 else 0) return pd.Series(changes, indexchips.index[window:])5.2 多周期筹码对比分析不同时间维度的筹码分布差异def multi_period_chips(df, periods[30, 90, 250]): 计算多周期筹码分布 results {} for p in periods: chips calculate_chip_distribution(df.iloc[-p*3:], windowp) results[f{p}day] chips[-1] # 取最新分布 # 转换为DataFrame便于分析 return pd.DataFrame(results).fillna(0)典型应用场景主力动向分析短期筹码快速集中而长期筹码分散可能预示主力建仓压力位确认当多个周期筹码峰出现在同一价位该位置压力更强趋势判断短期筹码均价高于长期筹码显示上升趋势健康在实盘中我习惯将筹码分布图与MACD结合使用。当价格突破筹码密集区时如果同时出现MACD金叉且筹码分布呈现单峰形态这样的突破信号可靠性往往更高。曾经在某新能源龙头股上这种组合策略帮助我准确捕捉到了从盘整到主升浪的转折点——当时60日筹码集中度突然提升到75%以上而价格刚好回踩这个密集区上沿。

更多文章