news 2026/8/4 9:02:24

筹码分布数据分析实战:用Python构建主力建仓成本分析系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
筹码分布数据分析实战:用Python构建主力建仓成本分析系统

筹码分布数据分析实战:用Python构建主力建仓成本分析系统

筹码分布是技术分析中一个很特别的指标,它试图展示不同价格上的持仓量分布,帮助投资者判断主力的建仓成本和持仓变化。去年我用Python实现了一个筹码分布计算系统,通过历史K线和逐笔成交数据还原主力的建仓过程。这篇文章分享系统的核心设计和代码实现。

筹码分布的计算原理是"换手率衰减模型"——假设在某个价位成交的筹码,会随着时间推移和换手率增加而逐渐被置换。每天的新成交筹码会加到对应的价格区间,旧的筹码按换手率比例衰减。

本地数据引擎提供了计算筹码分布所需的所有数据。历史K线在time/history/trade/{dm}/day,包含每日的开盘价、收盘价、最高价、最低价、成交量。逐笔成交数据在time/real/trace/onebyone/{dm},可以用来做更精确的筹码分布计算。实时行情在time/real/{dm},包含换手率等指标。

importjsonimportosimportpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedelta data_dir="D:/ig50_data"defread_kline(dm,period="day"):file_path=os.path.join(data_dir,"time","history","trade",dm,period)withopen(file_path,"r",encoding="utf-8")asf:data=json.load(f)df=pd.DataFrame(data)df.columns=["dm","cjsj","cjjg","cjl","cje","zf"]df["cjsj"]=pd.to_datetime(df["cjsj"])returndfdefread_realtime(dm):file_path=os.path.join(data_dir,"time","real",dm)withopen(file_path,"r",encoding="utf-8")asf:returnjson.load(f)defread_tick_data(dm):file_path=os.path.join(data_dir,"time","real","trace","onebyone",dm)withopen(file_path,"r",encoding="utf-8")asf:data=json.load(f)df=pd.DataFrame(data)df.columns=["dm","mc","cjsj","cjjg","cjl","jyzd"]df["cjsj"]=pd.to_datetime(df["cjsj"])returndf

字段方面,dm是股票代码,cjsj是成交时间,cjjg是成交价格,cjl是成交量,cje是成交额,zf是涨跌幅,jyzd是交易方向。

系统的核心是筹码分布计算函数。我用日K线数据,按价格区间统计筹码分布,每天根据换手率对历史筹码做衰减处理。

defcalc_chip_distribution(dm,lookback_days=120,price_step=0.1):df=read_kline(dm,"day")iflen(df)<20:returnNonedf=df.tail(lookback_days).copy()df["hsl"]=df["cjl"]/df["cjl"].rolling(60).mean()chip_map={}for_,rowindf.iterrows():price=round(row["cjjg"]/price_step)*price_step volume=row["cjl"]turnover=row["hsl"]decay_factor=max(0,1-turnover*0.3)forpinchip_map:chip_map[p]*=decay_factorifpriceinchip_map:chip_map[price]+=volumeelse:chip_map[price]=volume total_chip=sum(chip_map.values())iftotal_chip==0:returnNonechip_dist={p:v/total_chipforp,vinchip_map.items()}returnchip_dist

拿到筹码分布后,第一个分析模块是获利盘比例计算。获利盘比例是当前价格以下的筹码占总筹码的比例,反映市场中处于盈利状态的持仓占比。

defcalc_profit_ratio(dm):chip_dist=calc_chip_distribution(dm)ifchip_distisNone:returnNonerealtime=read_realtime(dm)current_price=realtime.get("cjjg",0)profit_chip=sum(vforp,vinchip_dist.items()ifp<current_price)total_chip=sum(chip_dist.values())profit_ratio=profit_chip/total_chipiftotal_chip>0else0return{"current_price":current_price,"profit_ratio":profit_ratio*100,"loss_ratio":(1-profit_ratio)*100}

第二个分析模块是筹码集中度计算。集中度衡量筹码是集中在少数价格区间还是分散在很宽的范围内。我用"70%筹码的价格区间宽度"来衡量。

defcalc_chip_concentration(dm):chip_dist=calc_chip_distribution(dm)ifchip_distisNone:returnNonesorted_chips=sorted(chip_dist.items(),key=lambdax:x[0])prices=[pforp,vinsorted_chips]volumes=[vforp,vinsorted_chips]total=sum(volumes)cumsum=np.cumsum(volumes)/total p15_idx=np.searchsorted(cumsum,0.15)p85_idx=np.searchsorted(cumsum,0.85)p15_price=prices[min(p15_idx,len(prices)-1)]p85_price=prices[min(p85_idx,len(prices)-1)]concentration_width=(p85_price-p15_price)/p15_price*100ifp15_price>0else0realtime=read_realtime(dm)current_price=realtime.get("cjjg",0)avg_cost=sum(p*vforp,vinchip_dist.items())return{"concentration_width":concentration_width,"avg_cost":avg_cost,"current_price":current_price,"cost_deviation":(current_price-avg_cost)/avg_cost*100,"concentration_level":"高"ifconcentration_width<15else"中"ifconcentration_width<30else"低"}

第三个分析模块是筹码峰值检测。筹码分布图上的峰值代表大量筹码集中的价格,通常是重要的支撑位或压力位。

defdetect_chip_peaks(dm):chip_dist=calc_chip_distribution(dm)ifchip_distisNone:returnNonesorted_prices=sorted(chip_dist.keys())volumes=[chip_dist[p]forpinsorted_prices]peaks=[]foriinrange(1,len(volumes)-1):ifvolumes[i]>volumes[i-1]andvolumes[i]>volumes[i+1]:peaks.append({"price":sorted_prices[i],"volume_ratio":volumes[i]/sum(volumes)*100})peaks.sort(key=lambdax:x["volume_ratio"],reverse=True)realtime=read_realtime(dm)current_price=realtime.get("cjjg",0)forpeakinpeaks:ifpeak["price"]<current_price:peak["type"]="支撑位"else:peak["type"]="压力位"returnpeaks[:5]

第四个分析模块是筹码转移分析。通过对比不同日期的筹码分布,可以追踪筹码的转移方向——是从低位向高位转移(主力出货),还是从高位向低位转移(主力建仓)。

defanalyze_chip_transfer(dm,period_days=30):chip_current=calc_chip_distribution(dm,lookback_days=120)chip_past=calc_chip_distribution(dm,lookback_days=120+period_days)ifchip_currentisNoneorchip_pastisNone:returnNonerealtime=read_realtime(dm)current_price=realtime.get("cjjg",0)low_chip_current=sum(vforp,vinchip_current.items()ifp<current_price*0.9)low_chip_past=sum(vforp,vinchip_past.items()ifp<current_price*0.9)high_chip_current=sum(vforp,vinchip_current.items()ifp>current_price*1.1)high_chip_past=sum(vforp,vinchip_past.items()ifp>current_price*1.1)low_transfer=low_chip_current-low_chip_past high_transfer=high_chip_current-high_chip_pastiflow_transfer<-0.05andhigh_transfer>0.05:signal="高位转移(可能出货)"eliflow_transfer>0.05andhigh_transfer<-0.05:signal="低位转移(可能建仓)"else:signal="无明显转移"return{"low_chip_change":low_transfer*100,"high_chip_change":high_transfer*100,"signal":signal}

把这些模块整合起来,生成完整的筹码分析报告。

defgenerate_chip_report(dm):profit=calc_profit_ratio(dm)concentration=calc_chip_concentration(dm)peaks=detect_chip_peaks(dm)transfer=analyze_chip_transfer(dm)report=f"筹码分布分析报告 -{dm}\n\n"ifprofit:report+=f"获利盘比例:{profit['profit_ratio']:.1f}%\n"report+=f"套牢盘比例:{profit['loss_ratio']:.1f}%\n\n"ifconcentration:report+=f"平均持仓成本:{concentration['avg_cost']:.2f}\n"report+=f"当前价格:{concentration['current_price']:.2f}\n"report+=f"偏离成本:{concentration['cost_deviation']:.1f}%\n"report+=f"筹码集中度:{concentration['concentration_level']}(宽度{concentration['concentration_width']:.1f}%)\n\n"iftransfer:report+=f"筹码转移信号:{transfer['signal']}\n"report+=f"低位筹码变化:{transfer['low_chip_change']:.1f}%\n"report+=f"高位筹码变化:{transfer['high_chip_change']:.1f}%\n\n"ifpeaks:report+="主要筹码峰值:\n"forpinpeaks:report+=f"{p['price']:.2f}({p['type']}, 占比{p['volume_ratio']:.1f}%)\n"returnreport

实际运行下来,筹码分析系统帮我发现了几个有价值的信号。第一,获利盘比例低于20%时买入,胜率约65%。第二,筹码集中度高的股票,后续上涨概率更大。第三,筹码从低位向高位快速转移,是趋势确认信号。

在使用过程中有几点经验。第一,筹码分布是估算值,不是精确值,对于换手率极低的股票误差较大。第二,筹码分布要结合资金流向数据一起看——筹码集中+主力净流入,信号更可靠。第三,筹码峰值是重要的支撑压力位,但不是铁板一块,需要结合成交量来确认。

我用的数据来自本地数据引擎,K线和逐笔成交数据接口完整,做筹码分析很方便。感兴趣的朋友可以参考这个思路来构建自己的筹码分析系统。


接口说明:

  1. time/history/trade/{股票代码}/{级别} - 历史K线数据
    本地路径:数据存放目录/time/history/trade/{dm}/{day|min1|min5}
    主要字段:成交时间(cjsj)、成交价格(cjjg)、成交量(cjl)、涨跌幅(zf)

  2. time/real/{股票代码} - 实时行情
    本地路径:数据存放目录/time/real/{dm}
    主要字段:成交价格(cjjg)、成交量(cjl)、换手率

  3. time/real/trace/onebyone/{股票代码} - 逐笔成交数据
    本地路径:数据存放目录/time/real/trace/onebyone/{dm}
    主要字段:成交时间(cjsj)、成交价格(cjjg)、成交量(cjl)、交易方向(jyzd)

  4. time/zijin/zjlrqs/{股票代码} - 个股资金流向
    本地路径:数据存放目录/time/zijin/zjlrqs/{dm}
    主要字段:主力净流入(zlJlr)、主力净比(zlJlb)

资料参考:ig50

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 9:00:14

Unity游戏开发:EventCenter事件中心的设计、实现与最佳实践

1. 项目概述&#xff1a;为什么Unity项目需要一个EventCenter&#xff1f; 在Unity开发中&#xff0c;尤其是中大型项目&#xff0c;组件间的通信是个绕不开的坎。你肯定遇到过这种场景&#xff1a;玩家点击一个UI按钮&#xff0c;需要触发角色跳跃、播放音效、更新任务进度&am…

作者头像 李华
网站建设 2026/8/4 8:59:30

CTF竞赛入门指南:从零基础到实战夺旗

1. CTF竞赛全景解析&#xff1a;从零基础到夺旗高手的完整路径CTF&#xff08;Capture The Flag&#xff09;网络安全竞赛已成为全球技术爱好者验证实战能力的热门平台。不同于传统考试&#xff0c;这种模拟真实攻防场景的竞技模式要求选手在Web渗透、逆向工程、密码破译等多元…

作者头像 李华
网站建设 2026/8/4 8:55:44

GD32F103驱动GD25Q128 SPI Flash:硬件连接、软件驱动与调试避坑指南

1. 项目概述&#xff1a;为什么是GD32F10x与GD25Q128的组合&#xff1f;在嵌入式开发中&#xff0c;外部存储是扩展系统数据容量的关键。当你手头的STM32系列芯片缺货或成本压力增大时&#xff0c;国产的GD32系列MCU就成了一个非常靠谱的替代选择。我最近在一个数据采集项目里&…

作者头像 李华
网站建设 2026/8/4 8:55:43

Java动态代理与Cglib性能对比及实践指南

1. 动态代理技术背景与核心价值动态代理作为Java生态中广泛使用的设计模式&#xff0c;其核心价值在于运行时动态生成代理类&#xff0c;实现对目标对象的非侵入式增强。在Spring框架、RPC调用、AOP编程等场景中&#xff0c;动态代理技术几乎无处不在。目前Java领域主要有两种实…

作者头像 李华
网站建设 2026/8/4 8:51:28

MATLAB App Designer 入门实战:从零构建简易计算器

这类工具最值得先看的不是功能列表&#xff0c;而是能不能在普通环境里稳定跑起来。App Designer 是 MATLAB 官方推出的图形界面开发环境&#xff0c;它解决的核心问题是&#xff1a;让不擅长传统 GUI 编程&#xff08;比如用 GUIDE&#xff09;的工程师和科研人员&#xff0c;…

作者头像 李华