第六章 Matplotlib案例股票K线图绘制

案例 股票K线图绘制

案例背景

本小节的内容讲解如何使用Python绘制K线图,主要包括两个部分:

  • 使用tushare获取股票数据
  • 使用mplfinance来绘制K线图,mplfinanceMatplotlib中用来实现金融数据可视化的模块,现在已经独立维护

在使用两个库之前,首先需要安装这两个库,这里使用 pip 安装的方式

如果用 Windows 系统的命令行进行安装,则打开 cmd 命令行,逐句输入以下代码然后按下回车

bash 复制代码
pip install tushare mplfinance

如果用 Jupyter Notebook 编辑器进行安装,则在 Notebook 代码框中输入以下代码并运行(注意感叹号是英文格式)

bash 复制代码
!pip install tushare mplfinance

获取股票数据

首先使用tushare获取股票数据

python 复制代码
# 导入 tushare 库
import tushare as ts
python 复制代码
# 获取股票数据
data = ts.get_k_data('600036',start="2022-03-01",end="2022-06-01") # 获取600036股票2022-03-01到2022-06-01之间的数据
data.head()
复制代码
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2

| | date | open | close | high | low | volume | code |
| 35 | 2022-03-01 | 46.74 | 46.98 | 47.24 | 46.10 | 406454.0 | 600036 |
| 36 | 2022-03-02 | 46.54 | 46.21 | 46.97 | 46.18 | 397076.0 | 600036 |
| 37 | 2022-03-03 | 46.32 | 46.47 | 46.71 | 46.19 | 311290.0 | 600036 |
| 38 | 2022-03-04 | 45.99 | 45.44 | 46.13 | 45.24 | 577897.0 | 600036 |

39 2022-03-07 44.75 43.50 45.00 43.24 1014354.0 600036

如果网络出现问题,无法使用以上接口下载数据,也可以使用本地保存的数据

python 复制代码
# 运行以下代码将数据存储到本地
# data.to_csv("data.csv", index=False)

# 运行以下代码从本地文件读取数据
# import pandas as pd

# data = pd.read_csv("data.csv")
# data.head()

K 线图绘制

股票 K 线图基本知识

K 线图是由股票的四个价格来绘制的柱状图,包括了:

  • 开盘价:当天开始交易(9:30,AM)时的股票价格
  • 收盘价:当天结束交易(3:00,PM)时的股票价格
  • 最高价:当天股票达到最高点时的价格
  • 最低价:当天股票达到最低点时的价格

基于这四个价格可绘制 K 线图,K 线图由包括阴线和阳线在内两种不同颜色的柱体组成,并且中国使用的颜色与美国相反

  • 阳线:当股票某天的收盘价高于开盘价时,说明股票上涨,用红色的阳线绘制
  • 阴线:当股票某天的收盘价低于开盘价时,说明股票下跌,用绿色的阴线绘制

通常 K 线图下方会有一个交易量图。交易量指的是特定时间段内交易的股票总量,在 K 线图中也就是当天交易的股票总量。每一根 K 线的下方都对应了一根交易量柱,代表了这一天产生的交易量

绘制股票 K 线图

使用 mplfinance 绘制 K 线图之前,还对所使用的数据有一些要求。首先数据必须是 Dataframe 格式,其次 Dataframe 数据的索引必须设置为 DatetimeIndex 格式的日期数据,才能够被mplfinance中绘制 K 线图的函数使用,因此先用 Pandas 调整数据的格式

python 复制代码
# 导入 pandas 库转换数据
import pandas as pd
python 复制代码
# 原有数据已经是 Dataframe 格式,这里将索引转换为 DatetimeIndex 格式
data.index = pd.DatetimeIndex(data['date'])

还需要设置 K 线图的绘制方式为红色上涨、绿色下跌等样式

python 复制代码
# 导入 mplfinance 库
import mplfinance as mpf
python 复制代码
color = mpf.make_marketcolors(
    # K 线阳线颜色
    up='r',
    # K 线阴线颜色
    down='g',
    # K 线边缘颜色
    edge='i',
    # 交易量颜色根据当天和前一天的收盘价变化
    vcdopcod=True,
    inherit=True
)
style = mpf.make_mpf_style(
    # K 线颜色
    marketcolors=color, 
    # 显示中文
    rc={'font.family': 'SimHei'},
    # 显示网格
    gridaxis = 'both',
    gridstyle = '-.'
)
# 标题内容及位置
title = {'title':'招商银行(600036)', 'y':0.93}

最后用mplfinanceplot 函数绘制K线图

plot 函数的参数:

  • data: 用于绘制 K 线图的数据
  • style: 自主设置的绘图风格,例如阴阳线颜色
  • type: 绘制图表的种类,这里 'candle' 表示 K 线图
  • width_adjuster_version: 交易量柱状图的间隔
  • volume: 设置为 True 显示交易量,False 不显示
  • title: 图表的标题
  • show_nontrading: 设置为 True 显示非交易日,False 不显示
python 复制代码
# 调用mplfinance提供的方法绘制k线图
mpf.plot(
    data, 
    style=style, 
    type='candle', 
    width_adjuster_version='v0',
    volume=True, 
    title=title, 
    show_nontrading=False
)

均线图绘制

K 线图中往往还同时绘制一些折线,也就是均线图。均线图是根据每一天前一段时间(数天)内的收盘价平均值来绘制的曲线图,常见的有根据五天平均收盘价绘制的 5 日均线(MA5),以及类似的 10 日均线(MA10)和 20 日均线(MA20)

以 5 日均线为例,假设当天收盘价为 c_price1c\price{1}c_price1,前一天的收盘价为 c_price2⋯c\price{2}\cdotsc_price2⋯ 前四天的收盘价为 c_price5c\price{5}c_price5。则 5 日均线上,当天的值为

c_price1+c_price2+c_price3+c_price4+c_price55\frac{c\price{1} + c\price{2}+c\price{3}+c\price{4}+c\price{5}}{5}5c_price1+c_price2+c_price3+c_price4+c_price5

计算每一日的前5日收盘价均值,之后连接成一条平滑的曲线就是 5 日均线

通过在绘制 K 线图的函数中添加 mav 参数,指定绘制的均线图的天数,即可绘制出带均线图的 K 线图。同时均线的颜色方面,这里将 5 日均线绘制为蓝色,10 日均线绘制为黄色,20 日均线绘制为紫色。通过修改绘图风格的参数设置均线颜色

python 复制代码
style = mpf.make_mpf_style(
    # K 线颜色
    marketcolors=color, 
    # 显示中文
    rc={'font.family': 'SimHei'},
    # 显示网格
    gridaxis = 'both',
    gridstyle = '-.',
    # 按照均线的绘制顺序,设置颜色分别为蓝色、黄色、紫色
    mavcolors = ['dodgerblue', 'goldenrod', 'm']
)
python 复制代码
# 调用mplfinance提供的方法绘制k线图
title = {'title':'招商银行(600036)', 'y':0.93}
mpf.plot(data, 
         style=style, 
         # 绘制 5 天、10 天、20 天的均线,颜色按照设置的顺序
         mav=(5, 10, 20), 
         type='candle', 
         width_adjuster_version='v0',
         volume=True, 
         title=title, 
         show_nontrading=False,
         returnfig=True)
复制代码
(<Figure size 800x575 with 4 Axes>,
 [<Axes:ylabel='Price'>, <Axes:>, <Axes:ylabel='Volume  $10^{6}$'>, <Axes:>])
相关推荐
右耳朵猫AI12 小时前
Python技术周刊 2026年第14周
开发语言·python·okhttp
2501_9012005312 小时前
MongoDB事务会产生多少性能损耗
jvm·数据库·python
zh15702312 小时前
CSS如何通过Sass循环生成辅助类_批量创建颜色或间距样式
jvm·数据库·python
加号312 小时前
【Python】 实现 HTTP 网络请求功能入门指南
网络·python·http
神明93112 小时前
golang如何实现滚动更新方案_golang滚动更新方案实现实战
jvm·数据库·python
CLX050512 小时前
mysql复杂查询语句如何调优_通过改写子查询为JOIN连接
jvm·数据库·python
m0_6091604912 小时前
Redis怎样在Spring中执行批量Pipeline指令
jvm·数据库·python
2301_7838486512 小时前
如何实现SQL动态字段选择查询_利用反射或动态拼接字符串
jvm·数据库·python
2303_8212873812 小时前
SQL如何检查字符串是否存在:INSTR与LOCATE函数使用
jvm·数据库·python
2401_8242226912 小时前
如何在 Firebase Storage 中批量获取所有媒体文件的下载链接
jvm·数据库·python