开发者

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

目录
  • 1. 什么是 Pyecharts?
    • 1.1 安装 Pyecharts?
    • 1.2 画个简单的折线图
    • 1.3 关键步骤介绍
      • 1.3.1 模块导入(基石搭建)
      • 1.3.2 画布初始化(创建舞台)
      • 1.3.3 数据注入(填充内容)
      • 1.3.4 样式配置(美化定型)
      • 1.3.5 输出成果(生成文件)
  • 2. 画一张完整的 K 线图!
    • 2.1 获取股票数据
      • 2.2 准备数据
        • 2.3 读取csv数据并做处理
          • 2.4 画蜡烛图(K 线)
            • 2.5 添加均线
              • 2.6 加入成交量柱状图
                • 2.8 美化+完整代码
                • 3. 结尾——这 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 页面,你会看到一条简单的折线,鼠标移动上去还会有交互效果!

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

                  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数据

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

                  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")
                  

                  效果展示:

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

                  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)
                  

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

                  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") 
                  

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

                  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(
                             php 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_jssize=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('gqfvqIW''
                                  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",
                   www.devze.com           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") 
                  

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

                  3. 结尾——这 K 线,有点意思!

                  一顿操作下来,我们终于用 pyecharts 画出了一个完整的 K 线图,包含了所有关键指标!

                  如果你是个数据分析师或者炒股爱好者,这样的 K 线图绝对是你的利器!

                  以上就是使用Python画一张完整的K线图的方法教程的详细内容,更多关于Python画K线图的资料请关注编程客栈(www.devze.com)其它相关文章!

                  0

                  上一篇:

                  下一篇:

                  精彩评论

                  暂无评论...
                  验证码 换一张
                  取 消

                  最新开发

                  开发排行榜