pyecharts 画K线记录 精细版
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid, EffectScatter
from pyecharts.globals import SymbolType
from pyecharts.commons.utils import JsCode
def drawKline(df):
# kline
x = df.index.tolist()
y = list(df.loc[:, ['o', 'c', 'l', 'h']].round(2).values)
y = [i.tolist() for i in y] # 里面的单个数组也必须转换成list
# kline = Kline(init_opts=opts.InitOpts(width="100%", height="800px"), )
kline = Kline()
kline.add_xaxis(x)
kline.add_yaxis("kline", y)
kline.set_global_opts(
yaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)),
# tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross",is_show_content=False),
datazoom_opts=[
opts.DataZoomOpts(is_show=False, type_="inside", xaxis_index=[0, 0], range_end=50),
# xaxis_index=[0, 0]设置第一幅图为内部缩放
opts.DataZoomOpts(is_show=False, xaxis_index=[0, 1], pos_top="97%", range_end=50),
# xaxis_index=[0, 1]连接第二幅图的axis
],
)
# line
ma5 = df['c'].rolling(5).mean()
ma10 = df['c'].rolling(10).mean()
ma20 = df['c'].rolling(20).mean()
line = Line()
line.add_xaxis(x)
line.add_yaxis('MA5', ma5.round(2).tolist(), is_smooth=True)
line.add_yaxis('MA10', ma10.round(2).tolist(), is_smooth=True)
line.add_yaxis('MA20', ma20.round(2).tolist(), is_smooth=True)
line.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 是否显示数据标签
# KD PD KK PK
es = EffectScatter()
# KD
v1 = df.index[df['KD'] == 1].tolist()
v2 = df['l'].loc[v1].tolist()
es.add_xaxis(v1)
es.add_yaxis('KD', v2, symbol=SymbolType.ARROW)
# PD
v1 = df.index[df['PD'] == 1].tolist()
v2 = df['h'].loc[v1].tolist()
es.add_xaxis(v1)
es.add_yaxis('PD', v2, symbol=SymbolType.ARROW, symbol_rotate=180)
# Kk
v1 = df.index[df['KK'] == 1].tolist()
v2 = (df['h'].loc[v1] * 1.01).tolist() # 向上偏移1% 防止重叠看不清
es.add_xaxis(v1)
es.add_yaxis('KK', v2, symbol=SymbolType.TRIANGLE, symbol_rotate=180)
# pk
v1 = df.index[df['PK'] == 1].tolist()
v2 = (df['l'].loc[v1] * 0.99).tolist() # 向下偏移1% 防止重叠看不清
es.add_xaxis(v1)
es.add_yaxis('PK', v2, symbol=SymbolType.TRIANGLE)
es.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 是否显示数据标签
# overlap
# kline.overlap(line)
kline.overlap(es)
return kline
def drawMACD(df):
MACD = get_macd(df['c'], 12, 26, 9)
x = df.index.tolist()
bar_2 = Bar()
bar_2.add_xaxis(x)
bar_2.add_yaxis(
series_name="MACD",
y_axis=MACD.MACD.round(2).tolist(),
label_opts=opts.LabelOpts(is_show=False),
xaxis_index=1, # 用于合并显示时排列位置,单独显示不要添加
yaxis_index=1, # 用于合并显示时排列位置,单独显示不要添加
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode(
"""
function(params) {
var colorList;
if (params.data >= 0) {
colorList = '#ef232a';
} else {
colorList = '#14b143';
}
return colorList;
}
"""
))
)
bar_2.set_global_opts(
xaxis_opts=opts.AxisOpts(
grid_index=1, # 用于合并显示时排列位置,单独显示不要添加
axislabel_opts=opts.LabelOpts(is_show=False),
),
yaxis_opts=opts.AxisOpts(
grid_index=1, # 用于合并显示时排列位置,单独显示不要添加
split_number=4,
),
legend_opts=opts.LegendOpts(is_show=False),
)
line_2 = Line()
line_2.add_xaxis(x)
line_2.add_yaxis(
series_name="DIF",
y_axis=MACD.DIF.round(2),
xaxis_index=1,
yaxis_index=2,
label_opts=opts.LabelOpts(is_show=False),
)
line_2.add_yaxis(
series_name="DEA",
y_axis=MACD.DEA.round(2),
xaxis_index=1,
yaxis_index=2,
label_opts=opts.LabelOpts(is_show=False),
)
line_2.set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
return bar_2.overlap(line_2)
def drawAll(df):
df.index = df.index.strftime('%Y-%m-%d %H:%M:%S')
kline = drawKline(df)
MACD = drawMACD(df)
grid_chart = Grid(init_opts=opts.InitOpts(width="100%", height="800px"))
grid_chart.add(
kline,
grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="70%"),
)
grid_chart.add(
MACD,
grid_opts=opts.GridOpts(
pos_left="3%", pos_right="1%", pos_top="80%", height="20%"
)
)
grid_chart.render('123.html')
def get_macd(price, fast, slow, smooth):
exp1 = price.ewm(span=fast, adjust=False).mean()
exp2 = price.ewm(span=slow, adjust=False).mean()
DIF = exp1 - exp2
DEA = DIF.ewm(span=smooth, adjust=False).mean()
MACD = (DIF - DEA) * 2
columns1 = pd.DataFrame(DIF).rename(columns={'c': 'DIF'})
columns2 = pd.DataFrame(DEA).rename(columns={'c': 'DEA'})
columns3 = pd.DataFrame(MACD).rename(columns={'c': 'MACD'})
frames = [columns1, columns2, columns3]
df = pd.concat(frames, join='inner', axis=1)
return df
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具