使用Python画一张完整的K线图的方法教程

 更新时间:2025年04月10日 09:42:07   作者:花小姐的春天  
Pyecharts 是 Python 里的一个强大可视化库,基于百度 Echarts,支持各种图表:柱状图、折线图、饼图、K 线图等等,本文就给大家介绍了Python如何使用Pyecharts画一个漂亮的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线图的资料请关注脚本之家其它相关文章!

相关文章

  • 浅析Python迭代器的高级用法

    浅析Python迭代器的高级用法

    这篇文章主要介绍了Python迭代器的高级用法,在实际场景当中非常实用,可以帮助我们大大简化代码的复杂度。感兴趣的朋友可以了解下
    2020-07-07
  • Python技能树共建之python urllib 模块

    Python技能树共建之python urllib 模块

    这篇文章介绍了Python技能树共建之python urllib 模块,urllib模块是 Python 标准库,更多相关介绍需要的小伙伴可以参考下面文章的详细内容
    2022-05-05
  • Python 使用dict实现switch的操作

    Python 使用dict实现switch的操作

    这篇文章主要介绍了Python 使用dict实现switch的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python使用Scrapy保存控制台信息到文本解析

    Python使用Scrapy保存控制台信息到文本解析

    这篇文章主要介绍了Python使用Scrapy保存控制台信息到文本解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Python作用域用法实例详解

    Python作用域用法实例详解

    这篇文章主要介绍了Python作用域用法,结合实例形式详细分析了Python作用域概念,用法与相关函数的使用技巧,需要的朋友可以参考下
    2016-03-03
  • Python Selenium参数配置方法解析

    Python Selenium参数配置方法解析

    这篇文章主要介绍了Python Selenium参数配置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Python+OpenCv制作证件图片生成器的操作方法

    Python+OpenCv制作证件图片生成器的操作方法

    这篇文章主要介绍了Python+OpenCv制作证件图片生成器的操作方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python获取url的返回信息方法

    python获取url的返回信息方法

    今天小编就为大家分享一篇python获取url的返回信息方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python计算机视觉SIFT尺度不变的图像特征变换

    Python计算机视觉SIFT尺度不变的图像特征变换

    这篇文章主要为大家介绍了Python计算机视觉SIFT尺度不变的图像特征变换,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • pytorch自定义loss损失函数

    pytorch自定义loss损失函数

    这篇文章主要介绍了pytorch自定义loss损失函数,自定义loss的方法有很多,本文要介绍的是把loss作为一个pytorch的模块,下面详细资料需要的小伙伴可以参考一下
    2022-02-02

最新评论