CYQ(筹码分布,成本分布)完整说明
CYQ 最早是指南针软件陈浩提出,通达信、东方财富、同花顺都内置。本质:估算流通盘在各个价格上的持仓数量,它是估算模型,不是真实股东持仓账本(真实每个投资者的成本软件不可能拿到)。
一、现成CYQ在哪里直接获取(你最关心)
1)通达信(免费版就自带)
通达信内置 WINNER、COST 两个核心底层函数,CYQ筹码分布图是软件原生图形,不需要自己写复杂代码
• 打开个股K线,按键盘【Ctrl+U】 直接调出右侧筹码分布图(CYQ)
• 内置配套函数(可以直接写进指标公式)
◦ WINNER(C):当前收盘价对应的获利盘比例(CYQ最核心输出)
◦ COST(50):50%筹码对应的价格,即市场平均成本
◦ COST(90)-COST(10):90%筹码区间宽度,用来算筹码集中度
• 通达信简易CYQ指标源码(副图,直接复制进公式管理器)
{CYQ 活动筹码}
A:=1.1*C;
B:=0.9*C;
活动筹码:100*(WINNER(A)-WINNER(B));
{90%筹码集中度}
集中度90:(COST(90)-COST(10))/COST(50)*100;
2)其他软件
• 东方财富:K线图右侧直接自带筹码分布,无需编写指标;
• 同花顺:K线页面切换「筹码」页;
⚠️重点:不同软件CYQ结果会略有差异。因为各家对历史筹码衰减、价格分桶、三角分布参数做了微调,不是统一标准。
3)量化Python获取现成CYQ数据(适合你的SQLite量化工程)
1. Tushare:cyq_chips、cyq_perf 接口,直接返回每日CYQ:各价格档位筹码数量、获利比例、平均成本、90%筹码集中度;接口内部就是三角分布模型,不用自己从头实现。
2. Akshare:可以抓取东方财富的筹码分布数据。
注意:需要token,有额度限制。
二、CYQ自己计算:完整原理(三角分布模型,行业通用标准)
核心思想:
流通盘总量固定;每一天成交的成交量,按三角分布分摊到当日【最低价L~最高价H】价格区间;历史老筹码随每日换手率衰减(换手越多,老筹码消失越快,被新成交替换)
步骤1:价格分桶
把标的全部价格区间切成大量离散价格桶(bins,比如0.01一档),每个桶保存【该价位的筹码数量】,全部桶加起来总和=流通股本。
步骤2:当日新增筹码(三角分布)
当日成交总量=V;当日L(最低)、H(最高)、A(当日均价)
• 三角分布:均价A位置筹码最多;向L、H两端线性递减,在L、H两点筹码为0,三角形总面积=当日成交量V
逻辑:一天当中,大部分成交集中在当日均价附近,高低点成交更少,符合真实交易特征。
步骤3:历史旧筹码衰减(最关键一步,很多人漏掉)
每天收盘执行:
旧筹码 = 旧筹码 × (1 - 当日换手率)
含义:当天发生换手,代表一部分老筹码被交易、更换持有人,所以旧筹码按换手率比例衰减消失,当天新成交的筹码(三角分布)新增进筹码桶。
• 换手率越高,历史筹码消失越快;
• 长期低换手的股票,很早之前的筹码会长期保留在筹码分布中。
步骤4:计算衍生指标(CYQ配套输出)
1. 获利比例 WINNER(P):所有价格 ≤ P 的筹码总量 ÷ 总流通盘
2. COST(X):从小到大累加筹码,累计占比达到X%对应的价格。COST(50)就是市场平均持仓成本
3. 筹码集中度90:(COST(90)-COST(10)) / COST(50) ×100%,数值越小筹码越集中。
◦ <10%:高度集中;10~20%中度集中;>20%筹码分散
简化Python伪代码(理解逻辑,可直接扩展进你的量化工程)
import numpy as np
# 1. 初始化价格桶、筹码数组
price_bins = np.arange(low_all, high_all, step=0.01)
chips = np.zeros(len(price_bins)) # 每个价格桶筹码数量
for day in daily_kdata:
# 取出当日K线
L, H, avg_price, vol, turnover, float_share = day
# Step1:历史筹码衰减
chips = chips * (1 - turnover)
# Step2:三角分布,把今日成交量vol分配进L~H价格桶
# 三角分布公式:距离均价越远,筹码越少
bin_mask = (price_bins >= L) & (price_bins <= H)
dist = 1 - np.abs(price_bins[bin_mask] - avg_price) / (H - L)
dist = dist / dist.sum() * vol
chips[bin_mask] += dist
# 计算获利比例:股价P以下筹码总和 / 流通盘
def winner(P):
idx = np.searchsorted(price_bins, P)
return chips[:idx].sum() / float_share
难点提醒:
1. 前复权/后复权处理:除权除息会改变价格,计算CYQ必须使用前复权K线,否则筹码峰错位。
2. 价格分桶精度:桶步长太小计算慢,太大丢失细节。A股一般0.01元一档。
3. 模型假设缺陷:CYQ是估算模型,无法区分大宗交易、限售解禁、对倒;真实股东持仓成本无法拿到,CYQ只是概率估算。
