在Python数据分析领域,金融数据的可视化是重要的一环。mplfinance是一个基于matplotlib、专用于金融数据可视化的模块,它简化了K线图、成交量图等的绘制流程。本文将详细介绍如何从mpl-finance迁移到mplfinance,并通过在线和本地两种数据源,逐步讲解绘制专业K线图的完整过程。
1. 从 mpl-finance 迁移到 mplfinance
由于mpl-finance(带短横线)模块已停止维护,官方推荐使用其替代品mplfinance。
1.1 安装 mpl-finance 模块(已废弃)
早期的教程可能会要求安装旧模块,执行以下命令:
pip install mpl-finance
安装过程命令行输出示例如下:

图1:使用 pip 安装旧版 mpl-finance 模块
1.2 导入 mpl_finance 模块出现警告
如果仍尝试导入旧模块,会收到明确的废弃警告。
import mpl_finance as mpf

图2:导入 mpl_finance 时产生的弃用警告
警告信息明确指出:mpl_finance 已被废弃,请使用 mplfinance(无短横线和下划线)。
1.3 安装正确的 mplfinance 模块
因此,我们应该安装并使用新的mplfinance模块。
pip install mplfinance
1.4 安装 pandas_datareader 模块
为了获取在线金融数据,我们同时安装pandas-datareader。
pip install pandas-datareader
2. 获取在线数据并绘制K线图
2.1 利用 datareader 读取在线股市数据
我们以雅虎财经为例,获取IBM公司股票在2020年8月的数据。
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2020, 8, 1)
end = datetime.datetime(2020, 8, 31)
df = web.DataReader('IBM', 'yahoo', start, end)
print(df.head())
2.2 利用 mplfinance 的 plot() 绘制K线图
使用mplfinance的plot函数可以轻松绘制基础的K线图。
import mplfinance as mpf
mpf.plot(df, type='candle')
2.3 修改绘图类型
type参数支持多种图表类型,如‘line’(折线)、‘ohlc’(美国线)、‘renko’(砖形图)等。
mpf.plot(df, type='line') # 绘制收盘价折线图
2.4 增加绘制移动平均线
通过mav参数可以快速添加移动平均线。
# 添加5日和10日简单移动平均线
mpf.plot(df, type='candle', mav=(5, 10), volume=True)
2.5 绘制成交量
设置volume=True即可在主图下方显示成交量柱状图。
mpf.plot(df, type='candle', volume=True)
2.6 自动剔除非交易日空白
默认情况下,show_nontrading为False,会自动压缩非交易日(如周末)的空白区域,使图表更紧凑。
2.7 绘制IBM公司股票2020年9月K线图
综合以上参数,绘制一个带均线和成交量的完整K线图。
start_sep = datetime.datetime(2020, 9, 1)
end_sep = datetime.datetime(2020, 9, 30)
df_sep = web.DataReader('IBM', 'yahoo', start_sep, end_sep)
mpf.plot(df_sep, type='candle', mav=(3,6,9), volume=True, title='IBM Sep 2020', ylabel='Price($)')
3. 读取本地数据并绘制K线图
3.1 查看本地数据
假设本地有一个CSV文件stock_data.csv,包含Date、Open、High、Low、Close、Volume等标准列。
3.2 读取本地数据
使用pandas读取CSV文件。
import pandas as pd
df_local = pd.read_csv('stock_data.csv')
df_local.head()
3.3 将索引类型更改为 DatetimeIndex
mplfinance要求数据的索引必须是DatetimeIndex类型。
df_local['Date'] = pd.to_datetime(df_local['Date'])
df_local.set_index('Date', inplace=True)
3.4 绘制K线图并剔除非交易时段
mpf.plot(df_local, type='candle', volume=True)
3.5 绘制K线图并显示非交易时段
设置show_nontrading=True可以保留时间序列中的空白(如周末)。
mpf.plot(df_local, type='candle', volume=True, show_nontrading=True)
4. 设置 plot() 函数的 addplot 参数
addplot参数允许我们在主K线图上叠加自定义的图表,实现更复杂的分析可视化。
4.1 读取IBM公司2020年10月部分数据
start_oct = datetime.datetime(2020, 10, 1)
end_oct = datetime.datetime(2020, 10, 23)
df_oct = web.DataReader('IBM', 'yahoo', start_oct, end_oct)
4.2 利用 make_addplot() 函数定义 addplot 参数值
假设我们计算一个“中值”(最高价与最低价的平均值)并希望将其绘制在图上。
df_oct['MidValue'] = (df_oct['High'] + df_oct['Low']) / 2
ap = mpf.make_addplot(df_oct['MidValue'])
4.3 绘制K线图并增加MidValue列对应的曲线
mpf.plot(df_oct, type='candle', addplot=ap, volume=True)
4.4 绘制K线图并添加多条曲线
可以同时叠加最高价、中值和最低价曲线。
ap_multi = mpf.make_addplot(df_oct[['High', 'MidValue', 'Low']])
mpf.plot(df_oct, type='candle', addplot=ap_multi, volume=True)
4.5 在结果图上添加标记
make_addplot支持scatter(散点)、marker(标记)等类型,用于高亮特定点。
# 标记出收盘价高于中值的日期
df_oct['Signal'] = df_oct['Close'] > df_oct['MidValue']
markers = df_oct[df_oct['Signal']].index
ap_marker = mpf.make_addplot(df_oct.loc[markers, 'High'], type='scatter', markersize=50)
mpf.plot(df_oct, type='candle', addplot=[ap, ap_marker], volume=True)
5. pandas_datareader 补充说明
pandas_datareader是数据分析与人工智能领域获取金融数据的强大工具,其数据源不仅限于雅虎财经。
5.1 可访问的公司与机构
除了‘yahoo’,它还支持‘fred’(美联储经济数据)、‘iex’(IEX Cloud)、‘stooq’等众多数据源。
5.2 访问谷歌金融数据(注:谷歌金融接口已不稳定)
# df_google = web.DataReader('IBM', 'google', start, end) # 可能已失效
5.3 访问纳斯达克交易符号定义
可以获取股票代码与公司名的对应列表。
import pandas_datareader.nasdaq_trader as nasdaq
sym = nasdaq.get_nasdaq_symbols()
print(sym.head())
5.4 访问世界银行数据(如人均GDP)
from pandas_datareader import wb
indicator = wb.download(indicator='NY.GDP.PCAP.KD', country=['US', 'CN'], start=2000, end=2020)
print(indicator.head())
6. 实战总结
本文系统介绍了使用mplfinance模块绘制专业金融K线图的完整流程。关键步骤包括:
- 正确安装:弃用
mpl-finance,安装mplfinance和pandas-datareader。
- 数据准备:掌握从在线API(如雅虎财经)和本地CSV文件读取并格式化数据的方法。
- 基础绘图:使用
plot()函数绘制不同样式的K线图,并添加移动平均线、成交量。
- 高级定制:利用
addplot参数叠加自定义指标曲线或标记,实现个性化分析图表。
通过掌握这些技巧,你可以基于算法与数据结构分析得出的结论,轻松地将金融数据转化为直观、专业的可视化图表,有效提升数据分析报告的质量与说服力。