本小节的内容讲解如何使用Python绘制K线图,主要包括两个部分:
- 使用
tushare获取股票数据 - 使用
mplfinance来绘制K线图,mplfinance是Matplotlib中用来实现金融数据可视化的模块,现在已经独立维护
在使用两个库之前,首先需要安装这两个库,这里使用 pip 安装的方式
如果用 Windows 系统的命令行进行安装,则打开 cmd 命令行,逐句输入以下代码然后按下回车
pip install tushare mplfinance
如果用 Jupyter Notebook 编辑器进行安装,则在 Notebook 代码框中输入以下代码并运行(注意感叹号是英文格式)
!pip install tushare mplfinance
获取股票数据¶
首先使用tushare获取股票数据
#!pip install tushare
Tushare是一个国内知名的资本市场数据支持API,在之前版本是完全免费且免于注册,但在2023年升级之后,需要用户注册个人信息并获取Token,所以在本地使用需要注册相关个人信息。可以从下面的链接进入Thshare官网完成,也可以通过搜索引擎完成注册。
https://tushare.pro/weborder/#/login?reg=127781
完成注册后,可以在个人中心——账号与Token页面获得个人token,并复制到下面代码中,完成本地登陆。
# 导入 tushare 库
import tushare as ts
ts.set_token('**************************************')#请替换为您自己的 tushare token
#或者直接使用下面方法进行登录
#pro = ts.pro_api('your token here')
pro = ts.pro_api('601ed750c87db32d3f17889b4fd56f9c1ba45e0aa49891f5fa52c93d')
# 获取股票数据
data = pro.daily(ts_code='600036.SH', start_date='20260101', end_date='20260501')# 获取600036股票2026-01-01到2026-05-01之间的数据
#老版本命令,已失效。
#ts.get_k_data('600036',start="2022-03-01",end="2022-06-01")
data.head()
| ts_code | trade_date | open | high | low | close | pre_close | change | pct_chg | vol | amount | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 600036.SH | 20260430 | 38.40 | 38.51 | 38.12 | 38.27 | 38.50 | -0.23 | -0.5974 | 1169574.10 | 4477499.783 |
| 1 | 600036.SH | 20260429 | 38.91 | 39.02 | 38.34 | 38.50 | 39.60 | -1.10 | -2.7778 | 2533117.17 | 9780526.575 |
| 2 | 600036.SH | 20260428 | 39.38 | 39.63 | 39.26 | 39.60 | 39.38 | 0.22 | 0.5587 | 669305.20 | 2637104.794 |
| 3 | 600036.SH | 20260427 | 39.52 | 39.99 | 39.32 | 39.38 | 39.38 | 0.00 | 0.0000 | 926168.43 | 3669782.211 |
| 4 | 600036.SH | 20260424 | 39.74 | 39.80 | 39.36 | 39.38 | 39.81 | -0.43 | -1.0801 | 629414.38 | 2485978.699 |
data = data.sort_values(by="trade_date",ascending=True)
data.head()
| ts_code | trade_date | open | high | low | close | pre_close | change | pct_chg | vol | amount | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 76 | 600036.SH | 20260105 | 42.48 | 42.80 | 42.27 | 42.35 | 42.10 | 0.25 | 0.5938 | 840829.64 | 3571507.107 |
| 75 | 600036.SH | 20260106 | 42.45 | 42.79 | 42.09 | 42.73 | 42.35 | 0.38 | 0.8973 | 923714.82 | 3918152.819 |
| 74 | 600036.SH | 20260107 | 42.75 | 43.02 | 42.14 | 42.15 | 42.73 | -0.58 | -1.3574 | 880559.52 | 3735889.227 |
| 73 | 600036.SH | 20260108 | 42.20 | 42.25 | 41.30 | 41.58 | 42.15 | -0.57 | -1.3523 | 1115726.92 | 4642639.925 |
| 72 | 600036.SH | 20260109 | 41.54 | 41.76 | 41.12 | 41.30 | 41.58 | -0.28 | -0.6734 | 985470.74 | 4069939.125 |
如果网络出现问题,无法使用以上接口下载数据,也可以使用本地保存的数据
# 运行以下代码将数据存储到本地
# data.to_csv("data1.csv", index=False)
# 运行以下代码从本地文件读取数据
# import pandas as pd
# data = pd.read_csv("data1.csv")
# data.head()
K 线图绘制¶
股票 K 线图基本知识¶
K 线图是由股票的四个价格来绘制的柱状图,包括了:
- 开盘价:当天开始交易(9:30,AM)时的股票价格
- 收盘价:当天结束交易(3:00,PM)时的股票价格
- 最高价:当天股票达到最高点时的价格
- 最低价:当天股票达到最低点时的价格
基于这四个价格可绘制 K 线图,K 线图由包括阴线和阳线在内两种不同颜色的柱体组成,并且中国使用的颜色与美国相反
- 阳线:当股票某天的收盘价高于开盘价时,说明股票上涨,用红色的阳线绘制
- 阴线:当股票某天的收盘价低于开盘价时,说明股票下跌,用绿色的阴线绘制
具体开盘价、收盘价、最高价、最低价在 K 线图绘制过程中所起的作用如下
通常 K 线图下方会有一个交易量图。交易量指的是特定时间段内交易的股票总量,在 K 线图中也就是当天交易的股票总量。每一根 K 线的下方都对应了一根交易量柱,代表了这一天产生的交易量
绘制股票 K 线图¶
使用 mplfinance 绘制 K 线图之前,还对所使用的数据有一些要求。首先数据必须是 Dataframe 格式,其次 Dataframe 数据的索引必须设置为 DatetimeIndex 格式的日期数据,才能够被mplfinance中绘制 K 线图的函数使用,因此先用 Pandas 调整数据的格式
# 导入 pandas 库转换数据
import pandas as pd
# 原有数据已经是 Dataframe 格式,这里将索引转换为 DatetimeIndex 格式
data.index = pd.DatetimeIndex(data['trade_date'])
data = data[['open','high','low','close','vol']]
还需要设置 K 线图的绘制方式为红色上涨、绿色下跌等样式
# 导入 mplfinance 库
import mplfinance as mpf
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 不显示
mpf.plot(data)
mpf.plot(data,type='candle')
data = data.rename(columns={"vol":"volume"})
data
| open | high | low | close | volume | |
|---|---|---|---|---|---|
| trade_date | |||||
| 2026-01-05 | 42.48 | 42.80 | 42.27 | 42.35 | 840829.64 |
| 2026-01-06 | 42.45 | 42.79 | 42.09 | 42.73 | 923714.82 |
| 2026-01-07 | 42.75 | 43.02 | 42.14 | 42.15 | 880559.52 |
| 2026-01-08 | 42.20 | 42.25 | 41.30 | 41.58 | 1115726.92 |
| 2026-01-09 | 41.54 | 41.76 | 41.12 | 41.30 | 985470.74 |
| ... | ... | ... | ... | ... | ... |
| 2026-04-24 | 39.74 | 39.80 | 39.36 | 39.38 | 629414.38 |
| 2026-04-27 | 39.52 | 39.99 | 39.32 | 39.38 | 926168.43 |
| 2026-04-28 | 39.38 | 39.63 | 39.26 | 39.60 | 669305.20 |
| 2026-04-29 | 38.91 | 39.02 | 38.34 | 38.50 | 2533117.17 |
| 2026-04-30 | 38.40 | 38.51 | 38.12 | 38.27 | 1169574.10 |
77 rows × 5 columns
mpf.plot(data,type='candle',mav=(3,6,9),volume=True)
# 调用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\_price_{1}$,前一天的收盘价为 $c\_price_{2}\cdots$ 前四天的收盘价为 $c\_price_{5}$。则 5 日均线上,当天的值为
$$\frac{c\_price_{1} + c\_price_{2}+c\_price_{3}+c\_price_{4}+c\_price_{5}}{5}$$计算每一日的前5日收盘价均值,之后连接成一条平滑的曲线就是 5 日均线
通过在绘制 K 线图的函数中添加 mav 参数,指定绘制的均线图的天数,即可绘制出带均线图的 K 线图。同时均线的颜色方面,这里将 5 日均线绘制为蓝色,10 日均线绘制为黄色,20 日均线绘制为紫色。通过修改绘图风格的参数设置均线颜色
style = mpf.make_mpf_style(
# K 线颜色
marketcolors=color,
# 显示中文
rc={'font.family': 'SimHei'},
# 显示网格
gridaxis = 'both',
gridstyle = '-.',
# 按照均线的绘制顺序,设置颜色分别为蓝色、黄色、紫色
mavcolors = ['dodgerblue', 'goldenrod', 'm']
)
# 调用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);