import pandas as pd
import numpy as np
import mplfinance as mpf
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
from matplotlib.colors import LinearSegmentedColormap, ListedColormap
def calculate_institution_chips(df):
"""
计算机构筹码和散户筹码相关指标
"""
# 计算获利盘比例 (简化实现)
df['winner_c'] = df['close'].rolling(20).apply(lambda x: np.sum(x < x[-1]) / len(x), raw=True)
# 机构筹码增减通达信指标计算中间变量
df['A1'] = (df['winner_c'] - df['winner_c'].shift(1)) / df['winner_c'].shift(1)
df['A2'] = df['volume'] / df['float_share'] # 假设float_share为流通股本
df['A3'] = df['A1'] / df['A2']
df['A4'] = 1 - df['winner_c']
df['A5'] = (df['A4'] - df['A4'].shift(1)) / df['A4'].shift(1)
df['A6'] = df['A5'] / df['A2']
# 计算机构筹码和散户筹码
df['A3_diff'] = np.where(df['A3'] == df['A3'].shift(1), 0, df['A3'])
df['institution_chips'] = df['A3_diff'].cumsum()
df['A6_diff'] = np.where(df['A6'] == df['A6'].shift(1), 0, df['A6'])
df['retail_chips'] = df['A6_diff'].cumsum()
# 计算筹码增减
df['institution_change'] = df['institution_chips'] - df['institution_chips'].shift(1)
df['retail_change'] = df['retail_chips'] - df['retail_chips'].shift(1)
# 计算低量
v_cols = [f'v{i}'for i in range(1, 9)]
for i, col in enumerate(v_cols):
shift1 = 2*i + 1
shift2 = 2*i + 2
df[col] = np.minimum(df['institution_chips'].shift(shift1),
df['institution_chips'].shift(shift2))
df['w1'] = np.minimum(np.minimum(df['v1'], df['v2']),
np.minimum(df['v3'], df['v4']))
df['w2'] = np.minimum(np.minimum(df['v5'], df['v6']),
np.minimum(df['v7'], df['v8']))
df['low_volume'] = np.minimum(df['w1'], df['w2'])
# 机构筹码增减通达信指标计算天量
vd_cols = [f'vd{i}'for i in range(1, 9)]
for i, col in enumerate(vd_cols):
shift1 = 2*i + 1
shift2 = 2*i + 2
df[col] = np.maximum(df['institution_chips'].shift(shift1),
df['institution_chips'].shift(shift2))
df['wd1'] = np.maximum(np.minimum(df['vd1'], df['vd2']),
np.minimum(df['vd3'], df['vd4']))
df['wd2'] = np.maximum(np.minimum(df['vd5'], df['vd6']),
np.minimum(df['vd7'], df['vd8']))
df['high_volume'] = np.maximum(df['wd1'], df['wd2'])
# 买点信号
df['buy_signal'] = df['institution_change'] > 1000
df['sell_signal1'] = (df['retail_change'] > 100) & (df['institution_change'
] -2)
df['sell_signal2'] = (df['retail_change'] > 200) & (df['institution_change'] -1)
return df
def plot_chips_analysis(df):
"""
绘制机构筹码分析图
"""
# 创建颜色映射
colors = []
for i in range(256):
r = min(255, i)
g = min(255, 156 + i)
b = 255
colors.append((r/255, g/255, b/255))
positive_cmap = LinearSegmentedColormap.from_list('positive', colors)
negative_cmap = ListedColormap(['#005500', '#007700', '#009900', '#00CC00'])
low_volume_cmap = ListedColormap(['#555500', '#777700', '#999900', '#CCCC00'])
high_volume_cmap = ListedColormap(['#990099', '#AA00AA', '#DD00DD', '#FF33DD'])
special_cmap = ListedColormap(['#000099', '#0000AA', '#0000DD', '#AA33DD'])
# 准备绘图数据
apd = mpf.make_addplot(df['institution_change'], type='bar', width=0.8, panel=1)
# 机构筹码增减通达信指标创建绘图
fig, axes = mpf.plot(df,
type='candle',
addplot=apd,
volume=False,
figratio=(12, 8),
figscale=1.2,
returnfig=True)
ax1 = axes[0] # 价格轴
ax2 = axes[2] # 筹码变化轴
# 添加文本说明
ax1.text(0.01, 0.95, '青芯-机构低位深度洗盘或高位出货坚决',
transform=ax1.transAxes, color='yellow', fontsize=10)
ax1.text(0.01, 0.90, '绿芯-机构在做高抛低吸或顶部高抛',
transform=ax1.transAxes, color='green', fontsize=10)
ax1.text(0.01, 0.85, '黄芯-机构洗盘',
transform=ax1.transAxes, color='cyan', fontsize=10)
ax1.text(0.01, 0.80, '粉芯-机构吸筹进货',
transform=ax1.transAxes, color='magenta', fontsize=10)
ax1.text(0.01, 0.75, '红芯-机构吸筹进货积极主动',
transform=ax1.transAxes, color='red', fontsize=10)
# 标记买卖信号
buy_signals = df[df['buy_signal']]
sell_signals = df[df['sell_signal1'] | df['sell_signal2']]
for idx, row in buy_signals.iterrows():
ax2.plot(df.index.get_loc(idx), row['institution_change'],
'^', markersize=10, color='green', alpha=0.7)
for idx, row in sell_signals.iterrows():
ax2.plot(df.index.get_loc(idx), row['institution_change'],
'v', markersize=10, color='red', alpha=0.7)
# 机构筹码增减通达信指标设置标题和标签
ax1.set_title('机构筹码分析', fontsize=16)
ax1.set_ylabel('价格')
ax2.set_ylabel('机构筹码变化')
plt.tight_layout()
plt.show()