量化交易中,如何使用Python计算「筹码分布」指标【附代码】 [量化小讲堂-64]

这是邢不行第 64 期量化小讲堂的分享

作者 | 邢不行、助教林奇

 

本文内容也有视频版本,点击观看:量化交易中,筹码分布指标如何计算【邢不行】

记得小时候的某个暑假,一边吃西瓜,一边看港剧《大时代》。

 

里面炒股的场景给我留下了很深的印象,也为之后进入金融行业埋下了一个种子。

剧里有经典的一幕,一位投资大师为了让主人公帮其报仇,教他炒股。图中大师正使用香烟代表筹码,推演股价走势。

小时候的我只是记得这一幕但并不理解,之后回想才明白,他们在讲的应该是筹码分布理论

有一定经验的A股投资者,应该都或多或少的听过筹码分布,本文我们就谈谈在量化投资中如何计算筹码分布,附有计算代码。

01

什么是筹码分布

我是08年左右开始炒股的,之前的市场没有亲历,不清楚筹码分布理论具体是什么时候引入中国市场。

只能通过查看资料,大致推测A股市场的筹码分布最早是由行情软件“指南针”在1997年提出的。

那么筹码分布到底是什么呢?

我们都知道一只股票在上市时会发行很多股份,那这每一股就代表了一个筹码。

 

而每一股在成交后都会有一个最近的成交价格,比如某只股票在13元成交1000股,14元成交500股,15元成交2000股。

分布就是指将筹码按照其最近成交价格进行分类,统计每个成交价格上筹码的数量。

我们把一只股票所有的筹码按照最近一次成交价进行分类排列,就能得到筹码分布图:

 

 

一般的行情软件都会提供筹码分布图。以同花顺为例,在K线图的右侧就有筹码分布图,图中价格上的柱线代表了筹码分布的数量

 

上图中45元左右集中了很多筹码,说明很多股票都是在45元附近成交的。

随着鼠标在K线上移动,筹码分布图也会跟着变动,这是一个随着每天的交易而变动的动态过程

 

 

虽然筹码分布问世多年,但至今热度依旧不减。各种新闻上经常提到,也有很多同学加我问我筹码分布相关的问题。

各类行情软件上的筹码分布图

基本上所有的行情软件也都提供筹码分布指标,这使得我们可以很方便的查到任意一只股票的筹码分布。

但我们做量化投资,光看这个图是没用的,一定要有最原始的数据。

只有有了筹码分布的具体数据,才能对此进行加工处理,构建各类量化交易策略。

02

筹码分布如何计算

 

行情软件上的筹码分布到底是如何计算的呢?

让我们回到股票发行的起点。

假设股票A以10元的价格发行1000股,那它发行时的筹码分布是这样的:

所有筹码的成本都是10元,其他价位上的筹码是0。

假设股票A开始上市交易,并且我们获取到了股票A的逐笔交易数据。

第一笔交易以10.3的价格成交了300股,在这一笔交易结束之后,筹码分布会变成这样:

10元的筹码减少300股,10.3元的筹码增加300股。

第二笔交易以10.5的价格成交了200股,毫无疑问10.5元的筹码会增加200股,但关键问题是,这200股从哪里来呢?

 

这其实取决于这200股到底是从10元的价位卖出,还是从10.3元的价位卖出,亦或两者都有。

遗憾的是这个数据只有交易所知道,并且绝对不会对外公布

所以我们从第二笔交易开始就已经算不清楚准确的筹码分布了,更何况之后更多的交易了。

所以理论上,经过以上简单的推理,我们根本画不出准确的筹码分布图。

 

03

行情软件上的筹码分布

既然我们都不知道筹码的准确来源,那行情软件是怎么画筹码分布图的呢?

 

其实方法非常简单粗暴,既然不知道卖出的筹码到底从哪个价格来,那么干脆一刀切,强制让所有价格的筹码都卖出相同的比例。

什么意思呢?比如刚刚第二笔交易以10.5元成交200股。

这200股占总股本的20%,我就从原来的所有价位都卖出20%

经过第二笔交易后,10.3元的价位卖出20%变为240股,10元的价位也卖出20%变为560股。

 

知道第二笔交易怎么处理后,第三笔、第四笔可依此类推,只要有逐笔数据我们就能画出筹码分布图。

 

// 筹码分布的优化算法

 

有的行情软件算法会更高级一点,并不是所有价格档位都按照相同的比例卖出。

有的算法认为盈利越多的价格,越倾向于减仓。10元的盈利比10.3元高,所以10元的减仓比例高于10.3元。

而有的算法认为持有时间越长,越倾向于减仓

当然,虽然这些算法在尝试逼近真实情况,但肯定还是有差距的。

 

// 筹码分布的简化算法

 

不过有的行情软件就没那么讲究了,会进一步偷懒。

什么意思呢?我们之前讲的算法是用逐笔数据近似的,数据量非常大。

有的行情软件为了偷懒,把一整天的交易数据合并成一笔交易数据,即当日的均价和总成交量。然后仅仅用这一笔数据,来计算筹码分布。

这样算出来的数据,是近似的近似,失真程度大家可以自己想象。

 

合并成一笔

 

04

用Python计算筹码分布

 

根据之前讲的原理,其实我们已经可以自己用python画出筹码分布了。

下图是我用python实现计算筹码分布的代码,代码就不逐行讲解了,如果有看不懂的地方欢迎和我沟通。

我用浦发银行的数据作为案例计算其筹码分布的结果:

第一行数据代表,以126的价格(已经复权)成交的股票,占到所有股份的0.38%。

依据这张表画出来的图,能直观地表现出浦发银行的筹码分布:

上图中可以非常清楚地看到在116元附近分布了很多筹码,这个价格可能是一个重要的支撑或者阻力位。

上面的代码和数据,都可以跟我询问。

如果很多人感兴趣,之后也会讲一下基于筹码分布数据开发的量化策略,感兴趣的朋友可以直接留

### Python 中实现筹码分布Python中实现筹码分布主要依赖于对历史交易数据的处理,通过统计不同价格区间的成交量来构建筹码分布图。这不仅有助于理解市场参与者的行为模式,还能够辅助投资者做出更明智的投资决策。 #### 数据准备 为了计算筹码分布,首先需要获取票的历史成交记录,通常这些数据可以从金融API接口获得,也可以从本地CSV文件加载。这里假设已经有一个包含日期、开盘价、最高价、最低价、收盘价以及成交量的数据集[^2]。 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 假设我们已经有了一个名为 'data' 的 DataFrame 对象, # 它包含了某只票一段时间内的每日行情信息。 data = pd.read_csv('stock_data.csv') ``` #### 计算筹码分布 接下来定义函数`calculate_chip_distribution()`用于计算特定时间段内各个价位上的累积成交量: ```python def calculate_chip_distribution(data, price_column='close', volume_column='volume'): """ :param data: 票日K线数据框 :param price_column: 表示价列名,默认为 close (收盘价) :param volume_column: 表示成交量列名,默认为 volume :return: 返回一个新的DataFrame对象,其中包含每个整数价位对应的累计成交量 """ prices = sorted(set([int(x) for x in data[price_column]])) # 获取所有唯一的价格并排序 chip_dist = {p: sum((data[price_column].between(p-0.5, p+0.5)).astype(int)*data[volume_column]) for p in prices} # 统计各价位区间内的总成交量 df_chip = pd.DataFrame(list(chip_dist.items()), columns=['Price', 'Volume']) return df_chip.set_index('Price').sort_index() ``` 此部分逻辑解释如下:对于每一天的收盘价向下取整得到该天代表性的“价位”,然后累加相同价位下的成交量作为当天在这个价位上新增的持仓量;最后按照时间顺序依次叠加形成最终的筹码分布表[^1]。 #### 可视化展示 有了上述计算好的筹码分布之后就可以绘制图表直观展现出来: ```python df_chip = calculate_chip_distribution(data) plt.figure(figsize=(10,6)) plt.bar(df_chip.index, height=df_chip['Volume'], width=0.8, color='blue', alpha=0.7) plt.title('Chip Distribution Over Time') plt.xlabel('Price Level ($)') plt.ylabel('Accumulated Volume') plt.grid(True) plt.show() ``` 这段代码会创建一张柱状图,横坐标表示不同的价格水平,纵坐标则显示对应位置处积累起来的成交量大小,从而形象地反映了市场上各方力量对比情况及其变化趋势[^3]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值