第六章 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:>])
相关推荐
阿_旭2 小时前
基于YOLO26深度学习的【无人机视角DaMa检测】与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
python·深度学习·无人机
ccice012 小时前
python爬虫——爬取全年天气数据并做可视化分析
开发语言·爬虫·python
m0_743623922 小时前
如何用 removeChild 与 remove 方法从页面 DOM 中移除元素
jvm·数据库·python
userxxcc2 小时前
Ginthon是用Python+Web写的“视图窗口+稳定服务”的桌面端(Win、Mac、Linux)多功能程序基座。开箱即用但有一定上手门槛。
python·pyinstaller·pywebview·桌面应用基座
InfinteJustice2 小时前
JavaScript中null与undefined在双等号下的特殊性
jvm·数据库·python
m0_678485452 小时前
如何处理SQL空值填充_利用IFNULL函数保证数据完整性
jvm·数据库·python
一生了无挂2 小时前
Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
大数据·python·信息可视化
m0_684501982 小时前
实现一个可精确定位、支持左右移动与删除的文本光标系统
jvm·数据库·python
weixin_408717772 小时前
HTML能写样式吗_style属性与内联样式风险【解答】
jvm·数据库·python