matplotlib的finance库包含不少可视化的金融图表,由于几代更新迭代,finance库也发生了变化。
从2.2.0版本前调用:
import matplotlib.finance as mpf
到2.2.0版本后调用:
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
但会出现如下警告:
D:\download\python\lib\site-packages\mpl_finance.py:22: DeprecationWarning:
=================================================================
WARNING: `mpl_finance` is deprecated:
Please use `mplfinance` instead (no hyphen, no underscore).
To install: `pip install --upgrade mplfinance`
For more information, see: https://pypi.org/project/mplfinance/
=================================================================
category=DeprecationWarning)
再到现在的mplfinance。总的来说,新模块mplfinance使用更加便捷。
mplfinance是专门用于金融数据分析的可视化分析模块,在安装mplfinance之前,需要安装matplotlib库和pandas。
使用mplfinance可以很快绘制均线、剔除停盘时间段空隙,时间坐标自动完成,非常方便、人性化。
DOS下安装如下:
pip install --upgrade mplfinance
import mplfinance as mpf
mpf.plot(data)
这里,data类型必须是pandas.DataFrame数据类型,必须包含’Open’, ‘High’, ‘Low’ 和 ‘Close’ 数据。
这里我们以调用雅虎近5年股票价格数据为例,更进一步描述上述内容:
import datetime
import matplotlib.pyplot as plt
import pandas_datareader.data as web
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2020, 6, 16)
# 读取数据
df = web.DataReader('XOM', 'yahoo', start, end)
print(df)
打印得到的股票行情如下:
High Low Open Close Volume Adj Close
Date
2014-12-31 93.129997 92.059998 92.419998 92.449997 11337200.0 73.701263
2015-01-02 93.050003 91.809998 92.250000 92.830002 10220400.0 74.004189
2015-01-05 92.400002 89.500000 92.099998 90.290001 18502400.0 71.979301
2015-01-06 91.410004 89.019997 90.239998 89.809998 16670700.0 71.596634
2015-01-07 91.480003 90.000000 90.650002 90.720001 13590700.0 72.322098
... ... ... ... ... ... ...
2020-06-10 53.500000 50.599998 53.500000 50.650002 31156800.0 50.650002
2020-06-11 48.840000 46.099998 47.529999 46.180000 39183000.0 46.180000
2020-06-12 48.619999 45.910000 48.040001 47.169998 30968800.0 47.169998
2020-06-15 47.759998 44.750000 45.349998 47.139999 27929300.0 47.139999
2020-06-16 49.750000 47.240002 49.570000 48.200001 26203400.0 48.200001
[1374 rows x 6 columns]
import datetime
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import mplfinance as mpf
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2020, 6, 16)
# 读取数据
df = web.DataReader('XOM', 'yahoo', start, end)
# print(df)
mpf.plot(df)
由于5年的股票数据,很难看出一些细节情况,这时,我们通过查看近一个月情况来感受细节。
通过mpf.plot中修改绘图类型,可更加直观感受mplfinance的真谛。
types中默认类型为ohlc,另外还有candle,line类型。
1)ohlc类型
start = datetime.datetime(2020, 6, 1)
end = datetime.datetime(2020, 6, 28)
# 读取数据
df = web.DataReader('XOM', 'yahoo', start, end)
# 修改plot绘图类型
# 通过参数types修改绘图类型,默认是ohlc,可以修改为candle,line。
mpf.plot(df)
2)修改为candle类型:
mpf.plot(df, type='candle')
3)修改为line类型:
mpf.plot(df, type='line')
mav可增加均线个数,mav=10,mav=(2,5,10)
mpf.plot(df, type='candle', mav=(2, 5, 10))
mpf.plot(df, type='candle', mav=10)
# 添加成交量
mpf.plot(df, type='candle', mav=(2, 5, 10), volume=True)
关键字参数默认show_nontrading=False
只看到停盘的时间段,show_nontrading=True
# 自动剔除非交易日空白
'''
关键字参数默认show_nontrading=False
只看到停盘的时间段,show_nontrading=True
'''
mpf.plot(df, type='candle', mav=(2, 5, 10), volume=True, show_nontrading=True)
停盘的时间段就不会显示数据信息。
要分析金融数据中的Open,High,Low,Close,ma以外,还需要分析一些其他数据,需要使用make_addplot()方法。
make_addplot接受一个pandas,numpy,array以及list格式的数据(tuple不可以),和**kwargs参数。
注意:传递给make_addplot的数据参数必须要和将来画图传递给plot的数据参数行数要一致。
# make_addplot用法
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2020, 6, 16)
# 读取数据
df = web.DataReader('XOM', 'yahoo', start, end)
add_plot = mpf.make_addplot(df['Volume'])
mpf.plot(df, addplot=add_plot)
plt.show()
给图标添加多个数据绘制,直接将列表中传入参数即可。
# 绘制多个数据的图表,直接在列表传入至make_addplot中即可。
add_plot = mpf.make_addplot(df[['Volume', 'Adj Close']])
mpf.plot(df, addplot=add_plot)
plt.show()
数据分析和可视化的目的,是为了要分析结果,并直观的在图表上展示结果。
例如:使用marker,以及markersize和color设置标记的大小和颜色
# 将分析结果显示到图像中
def data_analyze(data: pandas.DataFrame):
'''
简单的数据分析,并返回数据分析的结果列表,具体算法随便写写的
:param data:
:return:
'''
if data.shape[0] == 0:
data = data
s_list = []
b_list = []
b = -1
for i, v in data['High'].iteritems():
if v > data['Open'][i] and (b == -1 or b == 1):
b_list.append(data['Low'][i])
b = 0
else:
b_list.append(numpy.nan) # 添加nan的目的是,对齐主图的k线数量
if data['Close'][i] < data['Open'][i] and (b == -1 or b == 0):
s_list.append(v)
b = 1
else:
s_list.append(numpy.nan)
return b_list, s_list
# make_addplot用法
start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2020, 6, 16)
# 读取数据
data = web.DataReader('XOM', 'yahoo', start, end)
b_list, s_list = data_analyze(data)
add_plot = [
mpf.make_addplot(b_list, scatter=True, markersize=200, marker='^', color='y'),
mpf.make_addplot(s_list, scatter=True, markersize=200, marker='v', color='r'),
mpf.make_addplot(data[['Adj Close', 'Volume']]),
mpf.make_addplot(data['Close'], panel='lower', color='g', secondary_y='auto')
]
mpf.plot(data, type='candle', addplot=add_plot, volume=True)
plt.show()
修改y轴刻度盘的位置和设置线型
# 修改主图y轴刻度盘位置和设置线形
# 在绘制plot函数中使用关键字参数style='sas'
# 可以把主图y左边放到右边,默认是default,设置线型是参数linestyle
start = datetime.datetime(2019, 6, 1)
end = datetime.datetime(2020, 6, 16)
# 读取数据
data = web.DataReader('XOM', 'yahoo', start, end)
b_list, s_list = data_analyze(data)
add_plot = [
mpf.make_addplot(b_list, scatter=True, markersize=200, marker='*', color='y'),
mpf.make_addplot(s_list, scatter=True, markersize=200, marker='s', color='r'),
mpf.make_addplot(data[['Adj Close', 'Volume']], linestyle='dashdot'),
mpf.make_addplot(data['Close'], panel='lower', color='g', secondary_y='auto'),
mpf.make_addplot(data['Adj Close'], color='b', linestyle='dotted', secondary_y=True)
]
mpf.plot(data, type='candle', addplot=add_plot, volume=True, figscale=1.5, style='default')
plt.show()