使用Python画一张完整的K线图的方法教程
作者:花小姐的春天
最近炒股的朋友们老问我:“花姐,你能不能教我用 Python 画个 K 线图,研究研究趋势?”
听到这个问题,我差点没一口奶茶喷出来。
“用 Python 画 K 线?当然能!而且还得是高大上的动态交互图!”
说实话,一开始我也觉得画 K 线挺麻烦的,要处理数据、搞清楚指标、还得美观……结果后来发现,Pyecharts 这个库真的太香了!
今天咱们就一起来画出一个漂亮的 K 线图,均线、成交量 指标都加上,让你在 Python 里玩转金融数据!
1. 什么是 Pyecharts?
Pyecharts 是 Python 里的一个强大可视化库,基于百度 Echarts,支持各种图表:柱状图、折线图、饼图、K 线图等等。相比 Excel 或 Matplotlib,Pyecharts 生成的图表更美观,而且支持交互!
1.1 安装 Pyecharts?
用 pip 轻松搞定:
pip install pyecharts
装好以后,我们先来画个简单的折线图,看看效果。
1.2 画个简单的折线图
from pyecharts.charts import Line
from pyecharts import options as opts
# 创建折线图对象
line = Line()
# 添加数据
line.add_xaxis(["周一", "周二", "周三", "周四", "周五"])
line.add_yaxis("股票价格", [10, 12, 15, 13, 17])
# 设置标题
line.set_global_opts(title_opts=opts.TitleOpts(title="股票价格变化"))
# 渲染成 HTML
line.render("line_chart.html")
运行后,会在本地生成一个 HTML 页面,你会看到一条简单的折线,鼠标移动上去还会有交互效果!

1.3 关键步骤介绍
1.3.1 模块导入(基石搭建)
from pyecharts.charts import Line from pyecharts import options as opts
• 核心作用:加载可视化工具包
• Line:折线图绘制核心类
• opts:样式配置工具箱(控制标题/坐标轴/颜色等)
1.3.2 画布初始化(创建舞台)
line = Line()
• 本质:创建空白绘图区域
• 类比:准备画布和画笔,准备绘制折线图
1.3.3 数据注入(填充内容)
# X轴:维度数据(通常为分类数据)
.add_xaxis(["周一", "周二", "周三", "周四", "周五"])
# Y轴:指标数据(数值序列)
.add_yaxis("股票价格", [10, 12, 15, 13, 17])
- 数据绑定:
- X轴 → 横坐标标签(星期)
- Y轴 → 股价波动数值
- 扩展性:可连续添加多个
add_yaxis()绘制多指标对比
1.3.4 样式配置(美化定型)
.set_global_opts(title_opts=opts.TitleOpts(title="股票价格变化"))
- 核心配置项:
title_opts:主/副标题设置tooltip_opts:悬浮提示框样式axis_opts:坐标轴标签格式- 可扩展配置:支持50+种样式参数调整
1.3.5 输出成果(生成文件)
.render("line_chart.html")
- 输出特性:
- 生成完整HTML5文件
- 自带交互功能(缩放/悬浮提示/下载)
- 跨平台兼容(浏览器直接打开)
2. 画一张完整的 K 线图!
知道了基础用法,接下来,我们用 pyecharts 画 K 线图,并加上均线、成交量、MACD 指标,让它更专业!
2.1 获取股票数据
这里我们用AKShare库来获取股票日线行情数据,把数据转存成csv文件,这样方便我们测试。
import akshare as ak
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20230101", end_date="20250101" ,adjust="qfq")
df.to_csv("kdata.csv",index=False)
这是测试用的csv数据

2.2 准备数据
K 线图的数据格式要求:
k_data = [
[开盘价, 收盘价, 最低价, 最高价],
[开盘价, 收盘价, 最低价, 最高价],
...
]
2.3 读取csv数据并做处理
import pandas as pd
# 读取数据并排序
df = pd.read_csv("kdata.csv", parse_dates=["日期"])
# 数据预处理
df['日期'] = pd.to_datetime(df['日期']).dt.strftime('%Y-%m-%d') # 格式化日期
df = df.sort_values("日期") # 安装日期排序
data = df[["开盘", "收盘", "最低", "最高"]].values.tolist() # 生成K线数据序列
print(data)
2.4 画蜡烛图(K 线)
from pyecharts.charts import Kline
from pyecharts import options as opts
# 创建K线图
kline = Kline()
kline.add_xaxis(df['日期'].tolist()) # X轴日期数据
kline.add_yaxis(
series_name="k线", # y轴名称
y_axis=data, # K线数据序列
itemstyle_opts=opts.ItemStyleOpts(
color="#ef232a", # 上涨颜色(红色)
color0="#14b143", # 下跌颜色(绿色)
border_color="#000", # 统一黑色描边
border_color0="#000"
)
)
kline.set_global_opts(
title_opts=opts.TitleOpts(title="股票K线走势图", subtitle=df['股票代码'][0]),
xaxis_opts=opts.AxisOpts(
type_='category',
axislabel_opts=opts.LabelOpts(rotate=45), # 日期标签旋转45度
splitline_opts=opts.SplitLineOpts(is_show=True) # 显示网格线
),
yaxis_opts=opts.AxisOpts(
splitarea_opts=opts.SplitAreaOpts(
is_show=True,
areastyle_opts=opts.AreaStyleOpts(opacity=1)
),is_scale=True # 启用自动缩放
),
datazoom_opts=[ # 添加数据缩放控件
opts.DataZoomOpts(
is_show=True,
type_="inside",
xaxis_index=[0],
range_start=50,
range_end=100
),
opts.DataZoomOpts(
is_show=True,
xaxis_index=[0],
type_="slider",
pos_top="90%",
range_start=50,
range_end=100
)
]
)
# 生成HTML文件
kline.render("stock_kline.html")
效果展示:

2.5 添加均线
# 计算移动平均线 (处理前4个NaN值)
ma_periods = [5, 10, 20]
for period in ma_periods:
df[f'MA{period}'] = df['收盘'].rolling(window=period).mean().bfill()
from pyecharts.charts import Line
# 创建均线叠加图
line = Line()
# 添加各周期均线
ma_colors = {
5: {"color": "#FF0000", "width": 2}, # 红色5日均线
10: {"color": "#0000FF", "width": 2}, # 蓝色10日均线
20: {"color": "#00FF00", "width": 2} # 绿色20日均线
}
for period in ma_periods:
line.add_xaxis(df['日期'].tolist())
line.add_yaxis(
series_name=f"MA{period}",
y_axis=df[f'MA{period}'].tolist(),
symbol="circle",
symbol_size=0,
linestyle_opts=opts.LineStyleOpts(
color=ma_colors[period]["color"],
width=ma_colors[period]["width"]
),
label_opts=opts.LabelOpts(is_show=False), # 关闭数据点标签
is_smooth=True, # 平滑曲线
z_level=1 # 确保均线显示在K线上方
)
# 合并图表
overlap_kline = kline.overlap(line)

2.6 加入成交量柱状图
# 生成涨跌颜色列表(与K线颜色同步)
df['color'] = df.apply(lambda x: "#ef232a" if x['收盘'] >= x['开盘'] else "#14b143", axis=1)
# 创建成交量柱形图
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
vol_bar = (
Bar()
.add_xaxis(df['日期'].tolist())
.add_yaxis(
series_name="",
y_axis=df['成交量'].tolist(),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode('''
function(params) {
var colors = [%s];
return params.dataIndex < colors.length ? colors[params.dataIndex] : '#14b143';
}
''' % ("'" + "','".join(df['color'].tolist()) + "'")) # 生成正确数组格式
),
yaxis_index=1,
bar_width='60%',
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="category",
axislabel_opts=opts.LabelOpts(is_show=False),
splitline_opts=opts.SplitLineOpts(is_show=False)
),
yaxis_opts=opts.AxisOpts(
position="right",
axislabel_opts=opts.LabelOpts(formatter=JsCode(
"function(value){return value > 10000 ? (value/10000).toFixed(1)+'万' : value;}"))
)
)
)
# 组合图表布局
from pyecharts.charts import Grid
grid = (
Grid(init_opts=opts.InitOpts(width="1200px", height="800px"))
.add(
overlap_kline, # 使用已合并的K线均线图
grid_opts=opts.GridOpts(
pos_left="10%",
pos_right="8%",
height="65%", # 主图高度65%
pos_top="10%"
)
)
.add(
vol_bar,
grid_opts=opts.GridOpts(
pos_left="10%",
pos_right="8%",
height="15%", # 成交量图高度15%
pos_top="80%" # 从80%位置开始
)
)
)
# 修改渲染对象为grid
grid.render("stock_kline.html")

2.8 美化+完整代码
import pandas as pd
from pyecharts.charts import Kline
from pyecharts import options as opts
# 读取数据并排序
df = pd.read_csv("kdata.csv", parse_dates=["日期"])
# 数据预处理
df['日期'] = pd.to_datetime(df['日期']).dt.strftime('%Y-%m-%d') # 格式化日期
df = df.sort_values("日期") # 安装日期排序
data = df[["开盘", "收盘", "最低", "最高"]].values.tolist() # 生成K线数据序列
# 创建K线图
kline = Kline()
kline.add_xaxis(df['日期'].tolist()) # X轴日期数据
kline.add_yaxis(
series_name="k线", # y轴名称
y_axis=data, # K线数据序列
itemstyle_opts=opts.ItemStyleOpts(
color="#ef232a", # 上涨颜色(红色)
color0="#14b143", # 下跌颜色(绿色)
border_color="#000", # 统一黑色描边
border_color0="#000"
)
)
kline.set_global_opts(
title_opts=opts.TitleOpts(title="股票K线走势图", subtitle=df['股票代码'][0]),
xaxis_opts=opts.AxisOpts(
type_='category',
axislabel_opts=opts.LabelOpts(rotate=45), # 日期标签旋转45度
splitline_opts=opts.SplitLineOpts(is_show=True) # 显示网格线
),
yaxis_opts=opts.AxisOpts(
splitarea_opts=opts.SplitAreaOpts(
is_show=True,
areastyle_opts=opts.AreaStyleOpts(opacity=1)
),is_scale=True # 启用自动缩放
),
datazoom_opts=[ # 添加数据缩放控件
opts.DataZoomOpts(
is_show=True,
type_="inside",
xaxis_index=[0],
range_start=50,
range_end=100
),
opts.DataZoomOpts(
is_show=True,
xaxis_index=[0],
type_="slider",
pos_top="90%",
range_start=50,
range_end=100
)
]
)
# 计算移动平均线 (处理前4个NaN值)
ma_periods = [5, 10, 20]
for period in ma_periods:
df[f'MA{period}'] = df['收盘'].rolling(window=period).mean().bfill()
from pyecharts.charts import Line
# 创建均线叠加图
line = Line()
# 添加各周期均线
ma_colors = {
5: {"color": "#FF0000", "width": 2}, # 红色5日均线
10: {"color": "#0000FF", "width": 2}, # 蓝色10日均线
20: {"color": "#00FF00", "width": 2} # 绿色20日均线
}
for period in ma_periods:
line.add_xaxis(df['日期'].tolist())
line.add_yaxis(
series_name=f"MA{period}",
y_axis=df[f'MA{period}'].tolist(),
symbol="circle",
symbol_size=0,
linestyle_opts=opts.LineStyleOpts(
color=ma_colors[period]["color"],
width=ma_colors[period]["width"]
),
label_opts=opts.LabelOpts(is_show=False), # 关闭数据点标签
is_smooth=True, # 平滑曲线
z_level=1 # 确保均线显示在K线上方
)
# 合并图表
overlap_kline = kline.overlap(line)
# 生成涨跌颜色列表(与K线颜色同步)
df['color'] = df.apply(lambda x: "#ef232a" if x['收盘'] >= x['开盘'] else "#14b143", axis=1)
# 创建成交量柱形图
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
vol_bar = (
Bar()
.add_xaxis(df['日期'].tolist())
.add_yaxis(
series_name="",
y_axis=df['成交量'].tolist(),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode('''
function(params) {
var colors = [%s];
return params.dataIndex < colors.length ? colors[params.dataIndex] : '#14b143';
}
''' % ("'" + "','".join(df['color'].tolist()) + "'")) # 生成正确数组格式
),
yaxis_index=1,
bar_width='60%',
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="category",
axislabel_opts=opts.LabelOpts(is_show=False),
splitline_opts=opts.SplitLineOpts(is_show=False)
),
yaxis_opts=opts.AxisOpts(
position="right",
axislabel_opts=opts.LabelOpts(formatter=JsCode(
"function(value){return value > 10000 ? (value/10000).toFixed(1)+'万' : value;}"))
)
)
)
# 组合图表布局
from pyecharts.charts import Grid
grid = (
Grid(init_opts=opts.InitOpts(width="1200px", height="800px"))
.add(
overlap_kline, # 使用已合并的K线均线图
grid_opts=opts.GridOpts(
pos_left="10%",
pos_right="8%",
height="65%", # 主图高度65%
pos_top="10%"
)
)
.add(
vol_bar,
grid_opts=opts.GridOpts(
pos_left="10%",
pos_right="8%",
height="15%", # 成交量图高度15%
pos_top="80%" # 从80%位置开始
)
)
)
# 修改渲染对象为grid
grid.render("stock_kline.html")

3. 结尾——这 K 线,有点意思!
一顿操作下来,我们终于用 pyecharts 画出了一个完整的 K 线图,包含了所有关键指标!
如果你是个数据分析师或者炒股爱好者,这样的 K 线图绝对是你的利器!
以上就是使用Python画一张完整的K线图的方法教程的详细内容,更多关于Python画K线图的资料请关注脚本之家其它相关文章!
