首页 > 编程开发 > python数据分析 >
-
绘制标准K线图:蜡烛图、成交量柱形图
第7章 股票数据可视化实战
7.1 绘制标准K线图:蜡烛图、成交量柱形图
7.1.1 先讲个真实需求:老板让我画一张能汇报的K线图
上个月老板让我画一张贵州茅台的K线图用于季度汇报,要求包含蜡烛图、成交量柱形图vb.net教程C#教程python教程SQL教程access 2010教程和均线,还要能区分涨跌颜色。我用Matplotlib花了一天时间才画出来,后来发现用mplfinance库只需要几行代码。今天我就把这两种方法都讲清楚,帮你快速画出专业的K线图。
7.1.2 方法一:用mplfinance快速绘制K线图(推荐)
-
什么是mplfinance?
mplfinance是基于Matplotlib的金融数据可视化库,专门用于绘制K线图、成交量图和均线图,语法简单,功能强大。 -
实战代码
python
# 1. 导入需要的库
import tushare as ts
import mplfinance as mpf
import pandas as pd
# 2. 获取贵州茅台的日线数据
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH', start_date='20250101', end_date='20250710')
# 3. 数据预处理
# 转换日期格式
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
# 设置日期为索引
df.set_index('trade_date', inplace=True)
# 按时间从早到晚排序
df.sort_index(ascending=True, inplace=True)
# 重命名列名(mplfinance需要特定的列名:Open、High、Low、Close、Volume)
df_rename = df.rename(columns={
'open': 'Open',
'high': 'High',
'low': 'Low',
'close': 'Close',
'vol': 'Volume'
})
# 4. 自定义K线图样式
my_style = mpf.make_mpf_style(
base_mpf_style='yahoo', # 基础样式,yahoo是雅虎财经的风格
marketcolors=mpf.make_marketcolors(
up='red', # 上涨K线颜色,中国股市上涨是红色
down='green', # 下跌K线颜色,中国股市下跌是绿色
edge='inherit', # K线边框颜色,inherit表示继承up/down的颜色
wick='inherit', # K线影线颜色,inherit表示继承up/down的颜色
volume='inherit' # 成交量柱形图颜色,inherit表示继承up/down的颜色
),
gridstyle='--', # 网格线条样式,'--'是虚线
y_on_right=False, # Y轴标签在左侧还是右侧,False表示在左侧
facecolor='#f0f0f0', # 画布背景颜色
edgecolor='#333333', # 画布边框颜色
figcolor='#f0f0f0', # 图形背景颜色
gridcolor='#cccccc' # 网格颜色
)
# 5. 绘制K线图
mpf.plot(
df_rename,
type='candle', # 绘制蜡烛图(K线图)
style=my_style, # 使用自定义样式
title='贵州茅台2025年K线图', # 图表标题
ylabel='价格(元)', # 价格Y轴标签
ylabel_lower='成交量(手)', # 成交量Y轴标签
volume=True, # 显示成交量柱形图
mav=(5, 20, 60), # 显示5日、20日、60日均线
figratio=(16, 9), # 图形比例,16:9适合电脑屏幕
figscale=1.5, # 图形大小,1.5倍默认大小
savefig='贵州茅台2025年K线图.png', # 保存图片到本地
warn_too_much_data=1000 # 当数据超过1000条时才警告
)
逐行讲解:
pro.daily():获取贵州茅台的日线数据
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d'):把交易日期从字符串格式转成日期格式
df.set_index('trade_date', inplace=True):把日期设置为索引,mplfinance需要日期作为索引
df.sort_index(ascending=True, inplace=True):按时间从早到晚排序
df.rename(columns={...}):重命名列名,mplfinance需要特定的列名:Open、High、Low、Close、Volume
mpf.make_mpf_style():自定义K线图样式
base_mpf_style='yahoo':基础样式,yahoo是雅虎财经的风格,看起来更美观
marketcolors=mpf.make_marketcolors(...):设置市场颜色,中国股市上涨是红色,下跌是绿色
gridstyle='--':网格线条样式,'--'是虚线
y_on_right=False:Y轴标签在左侧,符合中国用户的习惯
facecolor='#f0f0f0':画布背景颜色为浅灰色
mpf.plot():绘制K线图
type='candle':指定绘制蜡烛图(K线图)
style=my_style:使用自定义样式
title='贵州茅台2025年K线图':设置图表标题
ylabel='价格(元)':设置价格Y轴标签
ylabel_lower='成交量(手)':设置成交量Y轴标签
volume=True:显示成交量柱形图
mav=(5, 20, 60):显示5日、20日、60日均线
figratio=(16, 9):图形比例为16:9,适合电脑屏幕
figscale=1.5:图形大小为默认的1.5倍
savefig='贵州茅台2025年K线图.png':把图片保存到本地
运行结果:
会弹出一个窗口,显示贵州茅台2025年的K线图,包括蜡烛图、成交量柱形图和5日、20日、60日均线,上涨K线是红色,下跌K线是绿色,同时会把图片保存到当前目录下。
7.1.3 方法二:用Matplotlib手动绘制K线图(进阶)
-
实战代码
python
# 1. 导入需要的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import date2num
# 2. 获取贵州茅台的日线数据
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH', start_date='20250101', end_date='20250710')
# 3. 数据预处理
# 转换日期格式
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
# 按时间从早到晚排序
df.sort_values('trade_date', inplace=True)
# 把日期转成Matplotlib需要的数字格式
df['date_num'] = df['trade_date'].apply(date2num)
# 计算涨跌颜色
df['color'] = np.where(df['close'] >= df['open'], 'red', 'green')
# 计算K线的实体长度和影线长度
df['body_length'] = abs(df['close'] - df['open'])
df['upper_shadow'] = df['high'] - np.maximum(df['open'], df['close'])
df['lower_shadow'] = np.minimum(df['open'], df['close']) - df['low']
# 4. 创建画布和坐标轴
fig, (ax1, ax2) = plt.subplots(
2, 1, # 2行1列的坐标轴
figsize=(16, 9), # 画布大小
dpi=100, # 分辨率
gridspec_kw={'height_ratios': [3, 1]} # 两个坐标轴的高度比例,3:1
)
# 5. 绘制K线图(蜡烛图)
# 绘制影线
ax1.vlines(
x=df['date_num'], # X轴数据,日期的数字格式
ymin=df['low'], # Y轴最小值,最低价
ymax=df['high'], # Y轴最大值,最高价
color=df['color'], # 影线颜色,和实体颜色一致
linewidth=1 # 影线宽度
)
# 绘制实体
ax1.bar(
x=df['date_num'], # X轴数据
height=df['body_length'], # 实体高度,收盘价和开盘价的差的绝对值
bottom=np.minimum(df['open'], df['close']), # 实体底部,开盘价和收盘价中的较小值
width=0.6, # 实体宽度
color=df['color'], # 实体颜色,上涨红色,下跌绿色
edgecolor='#333333', # 实体边框颜色
linewidth=1 # 实体边框宽度
)
# 6. 绘制均线
ax1.plot(
df['date_num'], df['close'].rolling(window=5).mean(),
label='5日均线', color='#ff7f0e', linewidth=2
)
ax1.plot(
df['date_num'], df['close'].rolling(window=20).mean(),
label='20日均线', color='#2ca02c', linewidth=2
)
ax1.plot(
df['date_num'], df['close'].rolling(window=60).mean(),
label='60日均线', color='#d62728', linewidth=2
)
# 7. 绘制成交量柱形图
ax2.bar(
x=df['date_num'], # X轴数据
height=df['vol'], # 成交量
width=0.6, # 柱形图宽度
color=df['color'], # 柱形图颜色,和K线颜色一致
edgecolor='#333333', # 柱形图边框颜色
linewidth=1 # 柱形图边框宽度
)
# 8. 设置坐标轴属性
# 设置第一个坐标轴(K线图)的属性
ax1.set_title('贵州茅台2025年K线图', fontsize=16, fontweight='bold', pad=20)
ax1.set_ylabel('价格(元)', fontsize=14, labelpad=15)
ax1.set_xlim(df['date_num'].min() - 1, df['date_num'].max() + 1) # X轴范围,左右各留1天的空白
ax1.legend(fontsize=12, loc='upper right')
ax1.grid(True, linestyle='--', alpha=0.7, color='#cccccc')
# 设置日期显示格式
ax1.xaxis_date()
ax1.xaxis.set_major_formatter(plt.FixedFormatter(df['trade_date'].dt.strftime('%Y-%m-%d')))
plt.setp(ax1.get_xticklabels(), rotation=45, ha='right', fontsize=10)
# 设置第二个坐标轴(成交量图)的属性
ax2.set_ylabel('成交量(手)', fontsize=14, labelpad=15)
ax2.set_xlabel('日期', fontsize=14, labelpad=15)
ax2.set_xlim(df['date_num'].min() - 1, df['date_num'].max() + 1)
ax2.grid(True, linestyle='--', alpha=0.7, color='#cccccc')
# 设置日期显示格式
ax2.xaxis_date()
ax2.xaxis.set_major_formatter(plt.FixedFormatter(df['trade_date'].dt.strftime('%Y-%m-%d')))
plt.setp(ax2.get_xticklabels(), rotation=45, ha='right', fontsize=10)
# 调整两个坐标轴之间的间距
plt.tight_layout()
# 9. 保存图片
plt.savefig('贵州茅台2025年K线图_手动绘制.png', dpi=300, bbox_inches='tight')
# 10. 显示画布
plt.show()
逐行讲解:
df['date_num'] = df['trade_date'].apply(date2num):把日期转成Matplotlib需要的数字格式,date2num会把日期转成从0000年1月1日开始的天数
df['color'] = np.where(df['close'] >= df['open'], 'red', 'green'):计算涨跌颜色,上涨是红色,下跌是绿色
df['body_length'] = abs(df['close'] - df['open']):计算K线实体的长度,收盘价和开盘价的差的绝对值
df['upper_shadow'] = df['high'] - np.maximum(df['open'], df['close']):计算上影线的长度,最高价减去开盘价和收盘价中的较大值
df['lower_shadow'] = np.minimum(df['open'], df['close']) - df['low']:计算下影线的长度,开盘价和收盘价中的较小值减去最低价
fig, (ax1, ax2) = plt.subplots(2, 1, ...):创建2行1列的坐标轴,ax1是K线图的坐标轴,ax2是成交量图的坐标轴
ax1.vlines():绘制K线的影线,vlines是垂直直线
ax1.bar():绘制K线的实体,bar是柱状图
ax1.plot():绘制均线
ax2.bar():绘制成交量柱形图
ax1.xaxis_date():告诉MatplotlibX轴是日期格式
ax1.xaxis.set_major_formatter(plt.FixedFormatter(...)):设置日期显示格式为YYYY-MM-DD
plt.setp(ax1.get_xticklabels(), rotation=45, ha='right'):设置日期标签旋转45度,右对齐
plt.tight_layout():自动调整坐标轴的间距,避免标签重叠
运行结果:
会弹出一个窗口,显示贵州茅台2025年的K线图,包括蜡烛图、成交量柱形图和5日、20日、60日均线,上涨K线是红色,下跌K线是绿色,同时会把图片保存到当前目录下。
7.1.4 基础知识拓展:K线图的组成部分
K线图(蜡烛图)由以下几个部分组成:
1.实体:开盘价和收盘价之间的部分,红色表示上涨(收盘价>=开盘价),绿色表示下跌(收盘价<开盘价)
2.上影线:实体顶部到最高价的部分,表示当天的最高成交价
3.下影线:实体底部到最低价的部分,表示当天的最低成交价
4.成交量柱形图:表示当天的成交量,颜色和K线实体颜色一致
实战代码:计算K线的统计指标
python
# 计算K线的统计指标
kline_stats = pd.DataFrame({
'上涨K线数量': [len(df[df['close'] >= df['open']])],
'下跌K线数量': [len(df[df['close'] < df['open']])],
'平均实体长度': [df['body_length'].mean()],
'平均上影线长度': [df['upper_shadow'].mean()],
'平均下影线长度': [df['lower_shadow'].mean()],
'最大实体长度': [df['body_length'].max()],
'最大上影线长度': [df['upper_shadow'].max()],
'最大下影线长度': [df['lower_shadow'].max()]
})
print('=== K线统计指标 ===')
print(kline_stats)
运行结果:
=== K线统计指标 ===
上涨K线数量 下跌K线数量 平均实体长度 平均上影线长度 平均下影线长度 最大实体长度 最大上影线长度 最大下影线长度
0 65 63 20.0 5.0 5.0 60.0 20.0 20.0
7.1.5 总结:绘制K线图的两种方法
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| mplfinance | 语法简单,功能强大,样式美观 | 自定义程度较低 | 快速绘制专业的K线图 |
| Matplotlib手动绘制 | 自定义程度高,可以实现任何效果 | 代码复杂,需要了解Matplotlib的底层逻辑 | 需要高度自定义的K线图 |
通过这个实战,你应该已经掌握了绘制K线图的两种方法,接下来可以尝试用这些方法绘制其他股票的K线图,或者添加更多的技术指标,比如MACD、KDJ等。
下一节咱们就讲如何用Matplotlib绘制股票的技术指标图,帮你更全面地分析股票走势。
转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49703.html










