老哥们,觉得不错给个star吧(^-^)。
“筹码分布”的准确的学术名称应该叫“流通股票持仓成本分布”。 右边的哪个柱状图就是筹码分布,体现的现有流通股票再股市中的分布状况。
获利盘是股票术语其中之一。获利盘一般是指股票交易中,能够卖出赚钱的那部分股票。每一只股票都有获利盘和套牢盘,套牢盘就是买入的股票亏本。 也就是说
COST(10),表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下,其余90%在该价格以上,为套牢盘,该函数仅对日线分析周期有效。 这个也是根据筹码分布就可以简单计算,cost和winner就像两个相反的东西
总之,筹码分布是形态分布计算的根本
这里简单讲解两个简单的计算
基本的一些概念
-
平均分布:将当日的换手筹码在当日的最高价和最低价之间平均分布。
-
三角形分布:将当日的换手筹码在当日的最高价、最低价和平均价之间三角形分布。
- 历史换手衰减系数:它是一个常数参数,我们用来赋予今天换手率,也既是当日被移动的成本的权重。如果今天的换手率是A,衰减系数是n,那么我们计算昨日的被移动的筹码的总量是A*n,如果n取值为1,就是一般意义上理解的今天换手多少,就有多少筹码被从作日的成本分布中被搬移;如果n是2,那么我们就放大了作日被移动的筹码的总量..这样的目的在于突出“离现在越近的筹码分布其含义越明显”。
每日成本算法是一个移动平均过程: 公式是:当日成本*(换手率历史换手衰减系数)+上一日成本分布图(1-换手率*历史换手衰减系数)
代码:(这里只是部分运算代码, 项目源码放在后面)
low = data['low']
high = data['high']
vol = data['volume']
TurnoverRate = data['TurnoverRate']
avg = data['avg']
date = data['date']
Chip ={}
ChipList ={}
Profit =[]
flag = True # start
import time
def calcuJUN(dateT,highT, lowT, volT, TurnoverRateT, A, minD):
# print(highT, lowT, volT)
x =[]
l = (highT - lowT) / minD
for i in range(int(l)):
x.append(round(lowT + i * minD, 2))
length = len(x)
eachV = volT/length
for i in Chip:
Chip[i] = Chip[i] *(1 -TurnoverRateT * A)
for i in x:
if i in Chip:
Chip[i] += eachV *(TurnoverRateT * A)
else:
Chip[i] = eachV *(TurnoverRateT * A)
import copy
print(dateT)
ChipList[dateT] = copy.deepcopy(Chip)
def calcuSin(dateT,highT, lowT,avgT, volT,TurnoverRateT,minD,A):
x =[]
l = (highT - lowT) / minD
for i in range(int(l)):
x.append(round(lowT + i * minD, 2))
length = len(x)
#计算仅仅今日的筹码分布
tmpChip = {}
eachV = volT/length
#极限法分割去逼近
for i in x:
x1 = i
x2 = i + minD
h = 2 / (highT - lowT)
s= 0
if i < avgT:
y1 = h /(avgT - lowT) * (x1 - lowT)
y2 = h /(avgT - lowT) * (x2 - lowT)
s = minD *(y1 + y2) /2
s = s * volT
else:
y1 = h /(highT - avgT) *(highT - x1)
y2 = h /(highT - avgT) *(highT - x2)
s = minD *(y1 + y2) /2
s = s * volT
tmpChip[i] = s
for i in Chip:
Chip[i] = Chip[i] *(1 -TurnoverRateT * A)
for i in tmpChip:
if i in Chip:
Chip[i] += tmpChip[i] *(TurnoverRateT * A)
else:
Chip[i] = tmpChip[i] *(TurnoverRateT * A)
import copy
print(dateT)
ChipList[dateT] = copy.deepcopy(Chip)
def calcu(date,highT, lowT,avgT, volT, TurnoverRateT,minD = 0.01, flag =1, AC=1): #flag 使用哪个计算方式, AC 衰减系数
if flag ==1:
calcuSin(dateT,highT, lowT,avgT, volT, TurnoverRateT,A=AC, minD=minD)
elif flag ==2:
calcuJUN(dateT,highT, lowT, volT, TurnoverRateT, A=AC, minD=minD)
for i in range(len(date)):
# if i < 90:
# continue
highT = high[i]
lowT = low[i]
volT = vol[i]
TurnoverRateT = TurnoverRate[i]
avgT = avg[i]
print(date[i])
dateT = date[i]
calcu(dateT,highT, lowT,avgT, volT, TurnoverRateT/100, flag=1) # 东方财富的小数位要注意,兄弟萌。我不除100懵逼了
来代码,就很清楚了
- 首先加载数据
- 然后计算筹码分布
def calcu(self,dateT,highT, lowT,avgT, volT, TurnoverRateT,minD = 0.01, flag=1 , AC=1):
if flag ==1:
self.calcuSin(dateT,highT, lowT,avgT, volT, TurnoverRateT,A=AC, minD=minD)
elif flag ==2:
self.calcuJUN(dateT,highT, lowT, volT, TurnoverRateT, A=AC, minD=minD)
def calcuChip(self, flag=1, AC=1): #flag 使用哪个计算方式, AC 衰减系数
low = self.data['low']
high = self.data['high']
vol = self.data['volume']
TurnoverRate = self.data['TurnoverRate']
avg = self.data['avg']
date = self.data['date']
for i in range(len(date)):
# if i < 90:
# continue
highT = high[i]
lowT = low[i]
volT = vol[i]
TurnoverRateT = TurnoverRate[i]
avgT = avg[i]
print(date[i])
dateT = date[i]
self.calcu(dateT,highT, lowT,avgT, volT, TurnoverRateT/100, flag=flag, AC=AC) # 东方财富的小数位要注意,兄弟萌。我不除100懵逼了
这是计算结果,可以看出,图形和通达信基本一致。 然后比对每一天的具体数值后, 基本偏差也不大于10%。和东方财富,同花顺等平台比对后也是基本精准的。
- 三角分布使用极限逼近的方法去逼近,划分成一个个小区 仓库地址:github
这里的筹码分布本质上其实也只是一个概率模型,能够较好的反应实际的筹码分布。通过三角分布或者均匀分布去进行运算,实践中可以考虑加入更多trick。
最后,这些指标,都只是参考。。。。