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

案例 股票K线图绘制

案例背景

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

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

在使用两个库之前,首先需要安装这两个库,这里使用 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}

最后用mplfinance 的 plot 函数绘制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:>])
相关推荐
蜗牛互联网9 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
statistican_ABin9 小时前
中国国际旅游发展分析报告—基于世界银行国际旅游数据的多维度分析
python·机器学习·旅游
青少儿编程课堂10 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
code2cat10 小时前
【随笔】MCP工具注解的信任边界:四个提示如何参与调用决策
python·ai agent·mcp
慢云智慧空间10 小时前
从设备智能到空间理解,慢云科技如何重新定义智慧建筑
python·科技
浮链序10 小时前
用 Claude Haiku 5.5 做子智能体路由,把 Agent 成本砍掉六成
人工智能·python·llm
冯一川10 小时前
安装Pyside 6
python
估值探索者11 小时前
【Python量化系统工程实战 #08】从脚本到生产:量化系统上线 checklist 的最小闭环
java·开发语言·jvm·python·数据挖掘·数据·股票数据api接口
李可以量化11 小时前
如何开通基于 AI 打造的 A 股量化策略(下):特征工程与大模型决策落地
python
万年咸鱼11 小时前
解决C语言的内存释放机制
java·c语言·python