VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 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线图(推荐)

  1. 什么是mplfinance?
    mplfinance是基于Matplotlib的金融数据可视化库,专门用于绘制K线图、成交量图和均线图,语法简单,功能强大。
  2. 实战代码
    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线图(进阶)

  1. 实战代码
    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


相关教程