
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
class StockAnalysis:
def __init__(self, stock_code, period="1d", interval="1m"):
self.stock_code = stock_code
self.data = yf.download(stock_code, period=period, interval=interval)
self.data = self.data.rename(columns={'Open': 'OPEN', 'High': 'HIGH', 'Low': 'LOW', 'Close': 'CLOSE', 'Volume': 'VOL'})
self.data['CAPITAL'] = 1e8
def winner(self, price_ratio):
cost = self.data['CLOSE'].values[-1] * price_ratio
return np.mean(self.data['CLOSE'] <= cost) * 100
def calculate_winner_values(self):
# 计算获利盘主力持仓筹码分布指标源码
self.data['获利盘'] = self.data['CLOSE'].apply(lambda x: self.winner(1)) # 获利盘:WINNER(C)*100
# 计算活筹
c1_075 = self.data['CLOSE'] * 1.075
c0_925 = self.data['CLOSE'] * 0.925
self.data['活筹'] = (self.data.apply(lambda row: self.winner(row.name, c1_075[row.name]) - self.winner(row.name, c0_925[row.name]), axis=1)) * 100
# 计算获利纵横
self.data['获利纵横'] = self.data['获利盘'] - self.data['活筹']
# 计算换手率
self.data['换手率'] = (self.data[
'VOL'] / self.data['CAPITAL']) * 100
# 计算量比(简化版)
self.data['量比'] = self.data['VOL'] / self.data['VOL'].mean()
# 计算主力仓位
self.data['主力仓位'] = self.data.apply(lambda row: self.winner(row.name, row['CLOSE'] / 1.20), axis=1) * 100
# 计算主力控盘系数
zlcm = self.data['获利盘'].ewm(span=3, adjust=False).mean() * 70
shcm = ((self.data.apply(lambda row: self.winner(row.name, row['CLOSE'] * 1.10) - self.winner(row.name, row['CLOSE'] * 0.90), axis=1)) * 80).ewm(span=3, adjust=False).mean()
self.data['主力控盘系数'] = (zlcm / (zlcm + shcm)) * 100
# 计算穿筹量
self.data['穿筹量'] = (self.data['获利盘'] - self.data['获利盘'].shift(1)) * 100
def plot_cost_bands(self):
# 绘制成本分布带
plt.figure(figsize=(12, 8))
cost_levels = [99.99, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0.01]
colors = ['red', 'green', 'magenta', 'yellow', 'cyan', 'red', 'green', 'magenta', 'yellow', 'cyan']
for i in range(len(cost_levels)-1):
lower = self.data['CLOSE'].quantile(cost_levels[i]/100)
upper = self.data['CLOSE'].quantile(cost_levels[i+1]/100)
plt.fill_between(self.data.index, lower, upper, color=colors[i], alpha=0.3)
# 绘制关键价格线
plt.axhline(self.data['CLOSE'
].quantile(0.9999), color='red', linestyle='--', linewidth=2, label='顶筹价')
plt.axhline(self.data['CLOSE'].quantile(0.5), color='red', linestyle='--', linewidth=2, label='中筹价')
plt.axhline(self.data['CLOSE'].quantile(0.0001), color='cyan', linestyle='--', linewidth=2, label='底筹价')
# 绘制收盘价
plt.plot(self.data['CLOSE'], color='blue', linewidth=2, label='收盘价')
plt.title(f'{self.stock_code} 成本分布图')
plt.xlabel('时间')
plt.ylabel('价格')
plt.legend()
plt.grid(True)
plt.show()
def display_info(self):
# 显示今日波幅和价差
high = self.data['HIGH'].max()
low = self.data['LOW'].min()
close = self.data['CLOSE'].values[-1]
open_price = self.data['OPEN'].values[0]
price_range = high - low
price_range_percent = (price_range / low) * 100
print(f"今日最大振幅: {price_range_percent:.2f}%")
print(f"今日高低价差: {price_range:.2f}元")
print(f"开盘价: {open_price:.2f}")
print(f"最高价: {high:.2f}")
print(f"最低价: {low:.2f}")
print(f"收盘价: {close:.2f}")
if __name__ == "__main__":
stock = StockAnalysis("AAPL")
stock.calculate_winner_values()
stock.plot_cost_bands()
stock.display_info()


主力持仓筹码分布指标源码
赋值:若是否最后一个周期则将最近DDCS1周期置为1
XG2赋值:若是否最后一个周期则将最近DINGBUTS1周期置为1
XD2赋值:若是否最后一个周期则将最近DDTS2周期置为1
当满足条件显示顶底=1ANDXG2时,在GDCS23和GDCS23位置之间画柱状线,宽度为2,1不为0则画空心柱., 画淡蓝色
当满足条件显示顶底=1ANDXG1时,在GDCS13和GDCS13位置之间画柱状线,宽度为2,1不为0则画空心柱., 画淡蓝色
当满足条件显示顶底=1ANDXD2时,在DDCS23和DDCS23位置之间画柱状线,宽度为2,1不为0则画空心柱.,画淡红色
当满足条件显示顶底=1ANDXD1时,在DDCS13和DDCS13位置之间画柱状线,宽度为2,1不为0则画空心柱.,画淡红色
AAT赋值:顶底周期2日前的最高价=2*顶底周期2+1日内最高价的最高值
AA1T赋值:顶底周期2日前的最低价=2*顶底周期2+1日内最低价的最低值
QYT赋值:若AAT则将最近顶底周期2+1周期置为1
QY1T赋值:若AA1T则将最近顶底周期2+1周期置为1
CCT赋值:QYT的顶底周期2日过滤 AND 最高价=顶底周期2+1日内最高价的最高值
CC1T赋值:QY1T的顶底周期2日过滤 AND 最低价=顶底周期2+1日内最低价的最低值
DDDT赋值:上次CCT距今天数
DD1T赋值:上次CC1T距今天数
GDTST赋值:如果CCT,返回到最后交易的周期,否则返回0
DDTST赋值:如果CC1T,返回到最后交易的周期,否则返回0
DINGBUTST赋值:如果DDDT,返回DDDT日前的GDTST,否则返回GDTST
DDTS1T赋值:如果DD1T,返回DD1T日前的DDTST,否则返回DDTST
通达信复制下方代码即可,下方代码仅用于学习交流使用。
获利盘:WINNER(C)*100,COLORYELLOW,NODRAW;
活筹:(WINNER(C*1.075)-WINNER(C*0.925))*100,COLORFFFFFF,NODRAW;
获利纵横:获利盘-活筹,NODRAW,COLORMAGENTA;
换手率:VOL/CAPITAL*100,COLORWHITE,NODRAW;
预测换手:IF(CURRBARSCOUNT=1&&PERIOD=5,换手率*240/FROMOPEN,DRAWNULL),NODRAW;
量比:DYNAINFO(17),NODRAW,COLORWHITE;
主力仓位:WINNER(C/1.20)*100,COLORWHITE,NODRAW;
ZLCM:=EMA(WINNER(C)*70,3);
SHCM:=EMA((WINNER(C*1.10)-WINNER(C*0.90))*80,3);
主力控盘系数:(ZLCM/(ZLCM+SHCM))*100,COLORYELLOW,NODRAW;
【穿筹量】:(WINNER(CLOSE)-REF(WINNER(C),1))*100,NODRAW,COLORMAGENTA;
STICKLINE(1,COST(99.99),COST(90),6,0),COLORRED;
STICKLINE(1,COST(90),COST(80),6,0),COLORGREEN;
STICKLINE(1,COST(80),COST(70),6,0),COLORMAGENTA;
STICKLINE(1,COST(70),COST(60),6,0),COLORYELLOW;
STICKLINE(1,COST(60),COST(50),6,0),COLORCYAN;
STICKLINE(1,COST(50),COST(40),6,0),COLORRED;
STICKLINE(1,COST(40),COST(30),6,0),COLORGREEN;
STICKLINE(1,COST(30),COST(20),6,0),COLORMAGENTA;
STICKLINE(1,COST(20),COST(10),6,0),COLORYELLOW;
STICKLINE(1,COST(10),COST(0.01),6,0),COLORCYAN;
DRAWBAND(COST(99.99),RGB(250,0,0),COST(90),RGB(250,0,0));
DRAWBAND(COST(90.00),RGB(0,250,0),COST(80.00),RGB(0,250,0));
DRAWBAND(COST(80.00),RGB(200,110,250),COST(70.00),RGB(200,100,250));
DRAWBAND(COST(70.00),RGB(250,200,0),COST(60.00),RGB(250,200,0));
DRAWBAND(COST(60.00),RGB(0,150,250),COST(50.00),RGB(0,150,250));
DRAWBAND(COST(50.00),RGB(250,0,0),COST(40.00),RGB(0,250,0));
DRAWBAND(COST(40.00),RGB(0,250,0),COST(30.00),RGB(0,250,0));
DRAWBAND(COST(30.00),RGB(200,110,250),COST(20.00),RGB(200,110,250));
DRAWBAND(COST(20.00),RGB(250,200,0),COST(10.00),RGB(250,200,0));
DRAWBAND(COST(10.00),RGB(0,150,250),COST(00.01),RGB(0,150,250));
顶筹价:COST(99.99),COLORRED,LINETHICK2;
中筹价:COST(50),COLORRED,LINETHICK2;
底筹价:COST(0.01),COLORCYAN,LINETHICK2;
收盘价:C,COLORBLUE,LINETHICK2;
今日波幅:=100*(DYNAINFO(5)-DYNAINFO(6))/DYNAINFO(6);
今日价差:=DYNAINFO(5)-DYNAINFO(6);
DRAWTEXT_FIX(1,0.000,0.000,0,STRCAT(STRCAT('今日最大振幅:',CON2STR(今日波幅,2)),'%')),COLORWHITE;
DRAWTEXT_FIX(1,0.120,0.000,0,STRCAT(STRCAT('今日高低价差:',CON2STR(今日价差,2)),'元')),COLORWHITE;