Python金融大数据分析——第五章数据可视化(2)金融学图表
5.2 金融学图表
5.2.1 mplfinance
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具有快速绘图功能,并能有效去除停市时段的缺口;同时会自动完成时间轴的标注。整个操作过程简洁流畅且富有人性化体验。
mplfinance安装
DOS下安装如下:
pip install --upgrade mplfinance
代码解读

mplfinance模块用法简介
import mplfinance as mpf
mpf.plot(data)
代码解读
此处要求数据类型的格式应为pandas.DataFrame,并且该数据集必须包含以下字段:开盘价、最高价、最低价以及收盘价。
这里我们以调用雅虎近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)
代码解读

基于详实的股票市场历史数据而言,在分析五年内的市场走向时难以直接识别关键细节。为此,在此期间我们持续关注近期市场动态的变化趋势。
通过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)
代码解读

添加成交量volume=True
# 添加成交量
mpf.plot(df, type='candle', mav=(2, 5, 10), volume=True)
代码解读

自动剔除非交易日空白
默认情况下该关键字参数设置为False;当设置为True时,则仅能获取停市时间信息。
# 自动剔除非交易日空白
'''
关键字参数默认show_nontrading=False
只看到停盘的时间段,show_nontrading=True
'''
mpf.plot(df, type='candle', mav=(2, 5, 10), volume=True, show_nontrading=True)
代码解读

停盘的时间段就不会显示数据信息。
make_addplot概述
为了分析金融数据中的开市价、最高价、最低价、收盘价以及移动平均线之外的数据时序图特征,并应调用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()
代码解读

