mplfinance是专用于金融数据的可视化分析模块
mplfinance基本用法
import mplfinance as mpf
import akshare as ak
#使用akshare获取数据
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20210301", end_date='20230907', adjust="qfq")
df = df.rename(
columns={'日期': 'date', '开盘': 'open', '收盘': 'close', '最高': 'high', '最低': 'low', '成交量': 'volume', '成交价': 'amount',
'振幅': 'change', '换手率': 'ratio'})
#行索引必须是pandas.DatetimeIndex
df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['date'], drop=True)
mpf.plot(df)
type=‘candle’、type=‘line’、type=‘renko’ 或 type=‘pnf’
使用mav关键字绘制移动平均线
绘制成交量volume=True
设置图像的标题title=‘candle’
设置主副图Y轴标题ylabel=‘price’,ylabel_lower=‘volume’
设置图像大小类型,使用figratio设置图像的纵横比,使用figscale设置图像的缩小或者放大比例,figscale=2,就是放大2倍 figratio=(6,4),figscale=0.8
mpf.plot(df[100:200],type='candle',mav=(5,10,30),volume=True,title='candle',ylabel='price',ylabel_lower='volume',figratio=(10,4),figscale=1.2)

make_addplot()函数使用
make_addplot可以接受一个pandas、numpy、array以及list格式的数据(tuple不可以),和**kwargs参数;需要注意的是:传递给make_addplot的数据参数必须与将来画图传递给plot的数据参数行数相同,**kwargs参数将全部传递到polt方法中。
如果要给图表添加多个数据绘制,可以采用dataframe数据直接用传入make_addplot即可如:
add_plot = mpf.make_addplot(data[['Upper', 'Lower']]
#在原数据基础上增加布林线数据,tb为ta-lib模块
import talib as tb
df['upper'], df['Middler'], df['Lower'] = tb.BBANDS(df['close'], timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
df.fillna(method='bfill',inplace=True) # 用下一个非空值向上填充
#选择布林线的lower绘制在主图中
add_plot = mpf.make_addplot(df['Lower'][100:200])
mpf.plot(df[100:200],type='candle',mav=(5,10,30),volume=True,addplot=add_plot,ylabel='price',ylabel_lower='volume',figratio=(10,4),figscale=1.2)

把数据分析的结果标记到图像中
数据分析和可视化的目的是有分析结果,直接把结果展示的图表上将更加直观。先做个简单的数据分析,并把分析结果赋值到两个列表中,然后在绘图时标记到图表中,因为这里是标记,并非连续的线,此时可以在make_addplot方法中使用marker,以及markersize和color设置标记的大小和颜色,这些参数都是直接传递给plot方法的,关键字参数scatter=True是绘制散点图的意思,新版更新为:type=‘scatter’,旧版绘制模式只有两种scatter=True或者line=True,而新版更新后增加了三种样式:‘bar’, ‘ohlc’, and ‘candle’,
list1 =[20,np.nan,20,np.nan,17,16,15,np.nan,17,18,2,20,17,18,np.nan,np.nan,20,19]
list1.append(np.nan) #补齐数据
list1.append(np.nan) #补齐数据
add_plot = [
mpf.make_addplot(list1, type='scatter', markersize=200, marker='^', color='y'),
mpf.make_addplot(list1, type='line', markersize=200, marker='v', color='r'),
mpf.make_addplot(df[['Upper', 'Lower']][100:120])]
mpf.plot(df[100:120],type='candle',mav=(5,10,30),volume=True,addplot=add_plot,ylabel='price',ylabel_lower='volume',figratio=(10,4),figscale=1.2)
在副图中绘制
默认是panel=0的,主图面板为0,附图为1,新版可以绘制多个附图!最多绘制9个附图,当同一个副图绘制的图形超过两个时,可用secondary_y参数(使用Y轴标),其有三个参数,True、False,auto,默认为auto,与上面的更新对应。绘制1、2、3…多个附图,在plot时可以设置附图的比例,plot中增加了参数:panel_ratios=(1, 1)来设置主图和附图的比例为1:1,第一个参数数主图,往后依次是附图,如果有两个附图,比如:panel_ratios=(1, 1,0.5)表示主图,第一附图及第二附图的比例为1:1:0.5。默认情况下主图高度是附图 的2.5倍。
figscale 设置图像的缩小或放大,1.5就是放大50%,最大不会超过电脑屏幕大小
add_plot = [
mpf.make_addplot(list1, type='scatter', markersize=200, marker='^', color='y'),
mpf.make_addplot(list2, type='line', markersize=200, marker='v', color='r'),
mpf.make_addplot(df[['Upper','Lower']][100:120]),
mpf.make_addplot(df['Lower'][100:120], panel=1, color='g', secondary_y='auto'),
mpf.make_addplot(df['Upper'][100:120], panel=2, color='g', )]
mpf.plot(df[100:120], type='candle', addplot=add_plot, volume=True,panel_ratios=(1,1,0.5))
plt.show() # 显示
修改主图Y轴刻度位置和设置线形
在绘图plot函数中使用关键字参数style='sas’可以把主图Y左边放到右边,默认是‘default’,
设置线型是参数linestyle('dashdot', 'dotted')
add_plot = [
mpf.make_addplot(list1, type='scatter', markersize=200, marker='^', color='y'),
mpf.make_addplot(list2, type='line', markersize=200, marker='v', color='r'),
mpf.make_addplot(df[['Upper','Lower']][100:120]),
mpf.make_addplot(df['Lower'][100:120], panel=1, color='g', linestyle='dashdot',secondary_y='auto'),
mpf.make_addplot(df['Upper'][100:120], panel=2, color='g', linestyle='dotted')]
mpf.plot(df[100:120], type='candle', addplot=add_plot, volume=True,style = 'sas',panel_ratios=(1,1,0.5))
plt.show() # 显示
marketcolors和mpf_style以及其他常用设置
make_marketcolors() 设置k线颜色
:up 设置阳线柱填充颜色
:down 设置阴线柱填充颜色
:edge 设置蜡烛线边缘颜色 'i' 代表继承k线的颜色
:wick 设置蜡烛上下影线的颜色
:volume 设置成交量颜色
:inherit 是否继承, 如果设置了继承inherit=True,那么edge即便设了颜色也会无效
make_mpf_style(base_mpf_style,base_mpl_style,marketcolors,mavcolors,facecolor,edgecolor,figcolor,gridcolor,gridaxis,gridstyle,y_on_right,rc)base_mpf_style 使用mplfinance中的系统样式 , 可以在make_marketcolors方法中使用,也可以在make_mpf_style中使用
base_mpl_style 可以同时使用matplotlib中的系统样式,比如:base_mpl_style=‘seaborn’
marketcolors 使用自定义样式
mavcolors 设置ma均线颜色,必须使用列表传参
facecolor 设置前景色
edgecolor 图像边缘线颜色
figcolor 图像外周围填充色
gridcolor 网格线颜色
gridaxis 设置网格线方向,both/ ‘horizontal’/ ‘vertical’
gridstyle 设置网格线线型 ‘-’/‘solid’, ‘–’/‘dashed’, ‘-.’/‘dashdot’, ‘:’/‘dotted’, None/’ ‘/’’
y_on_right 设置y轴位置是否在右
rc 使用rcParams的dict设置样式,如果内容与上面的自定义设置相同,那么自定义设置覆盖rcParams设置
解决中文输出乱码
首先解决matplotlib中文输出乱码: plt.rcParams['font.sans-serif']=['simHei'] # 以黑体显示中文 plt.rcParams['axes.unicode_minus']=False # 解决保存图像符号“-”显示为放块的问题 ,其次在mpf.plot()函数的style参数,添加rc={'font.family':'SimHei'}
x轴刻度旋转 - xrotation
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
title='Candle', ylabel='price', ylabel_lower='volume',
)
设置x轴刻度日期格式 datetime_format
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
title='Candle', ylabel='price', ylabel_lower='volume',
)
紧密布局:tight_layout
增加紧密布局 tight_layout=True 后,不仅仅是整个画布布局紧凑了,标题已经到了图表内部,主要的是图表的左右两侧没有之前的空白了,跟平时交易软件的风格相同。
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
tight_layout=True,
title='Candle', ylabel='price', ylabel_lower='volume',
)
填充颜色 fill_between
fill_between的基础用法
使用关键字fill_between直接赋值一个与x轴数据长度相同的数据(比如收盘价close),那么plot就会以从x轴想上填充颜色到收盘价的高度。
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
tight_layout=True,
fill_between=data['Close'].values,
title='Candle', ylabel='price', ylabel_lower='volume',
)
设置填充颜色
关键字fill_between也可以i使用字典传参,比如增加填充颜色和透明度,字典传参的时候注意关键字y1是必填的,否则会报错。
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
tight_layout=True,
fill_between=dict(y1=data['Close'].values, alpha=0.5, color='g'),
title='Candle', ylabel='price', ylabel_lower='volume',)
设置填充颜色的Y轴区间
设置填充颜色的空间或者说Y轴区间需要使用两个关键字参数y1和y2传递给fill_between:
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
tight_layout=True,
fill_between=dict(y1=125, y2=data['Close'].values, alpha=0.5, color='g'), # 方式1
# fill_between=dict(y1=data['Open'].values, y2=data['Close'].values), # 方式2
# fill_between=dict(y1=125, y2=132, alpha=0.5, color='g'), # 方式3
title='Candle', ylabel='price', ylabel_lower='volume',
)
设置填充颜色的X轴区间
这里注意,设置y轴填充区间用y1和y2,填充x轴区间可不是x1和x2,这样会报错没有x1和x2这个关键字参数,设置x轴区间稍微有点麻烦,使用关键字参数where,where是一个与x轴数据长度相同的一组可迭代数据的布尔值,要使用x轴区间限制,需要增加并修改如下代码,
# 增加计算的代码,用来确定x轴方向的时间范围
dates_df = pandas.DataFrame(data.index)
buy_date = pandas.Timestamp('2011-08-08')
sell_date = pandas.Timestamp('2011-08-30')
where_values = pandas.notnull(dates_df[(dates_df >= buy_date) & (dates_df <= sell_date)])['Date'].values
#
mplfinance.plot(data, type='candle',
mav=(2, 5),
volume=True,
figscale=1.5,
xrotation=15,
datetime_format='%Y-%m-%d',
tight_layout=True,
fill_between=dict(y1=y1values, y2=y2value, where=where_values, alpha=0.5),
title='Candle', ylabel='price', ylabel_lower='volume',
)
通过上面的代码使用where限制了x轴填充的范围在2011-08-08至2011-08-30之间,而上面如果输出计算后的where_values,可以是数据格式是:[False False False True True True … False False] ,数据类型type是 nampy.ndarray, 当然强制转换为列表或者元组都不影响效果。