python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)

06_01用mplfinance金融数据可视化(上)

1. mplfinance模块说明

mplfinance是专用于金融数据的可视化分析模块,是基于matplotlib的实用模块程序。
基于前面的介绍,可以确定使用前必须确保已经安装了matplotlib和pandas。
mplfinance使用是简直太方便,绘制个均线什么的一个关键字参数解决,剔除停盘时间段的空白不用你想它已经自动做了,还有时间坐标都是自动完成的,比如显示的是当天k线就只显示时间,跨天就自动带上日期,跨年就自动带上年份,哇,mplfinance在使用上不要太方便、太人性化!

2. mplfinance安装

pip install --upgrade mplfinance

github地址

3.mplfinance模块plot基本用法¶

import mplfinance as mpf

mpf.plot(data)

这里需要强调的是参数data的类型,data必须是pandas.DataFrame数据类型,对所包含的列也有要求,必须包含’Open’, ‘High’, ‘Low’ 和 ‘Close’ 数据(注意:首字母是大写的),而且行索引必须是pandas.DatetimeIndex,行索引的名称必须是’Date‘(同理注意首字母大写),此外还有一列是’Volume’,这一列不是必须的,可选项(前提是你不想绘制成交量的话)。

 

import os
import pandas as pd
import mplfinance as mpf

filename = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
df = pd.read_csv(filename)
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
df.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df = df[4300:]

mpf.plot(df)

 

输出结果:python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第1张图片

修改plot绘图类型

通过参数type修改绘图类型,默认是ohlc,可修改为:type=‘candle’ 或者 type=‘line’,这个想必不用解释直接上结果:

mpf.plot(df, type='candle')

输出:python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第2张图片

增加绘制均线

关键字参数 mav=(2, 5, 10),多条均线使用元组,只绘制一条均线,可以mav=10;

mpf.plot(df, type='candle', mav=(2, 5, 10))

输出:

python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第3张图片

绘制成交量

关键字参数, volume=True

mpf.plot(df, type='candle', mav=(2, 5, 10), volume=True)

输出:

python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第4张图片

mpf.plot()接口主要参数 

mpf.plot()接口参数 描述
type 绘制图线的种类
ylabel y轴标签
style 风格样式
title 图表标题
mav 均线,格式为一个元组,如(5, 10)表示绘制5日均线和10日均线
volume 是否绘制量柱图,默认为False,表示不绘制。
figratio 图像横纵比,如(5,3)表示图像长比宽为5:3。
ylabel_lower 表示底部图像的标签(一般是量柱图)
savefig 如果需要将图像保存为一个图片文件,则通过该参数指定文件路径即名字即可。不指定则默认不保存,但是图像会显示出来。如果指定了则图像不会直接显示出来。
xrotation x轴刻度旋转度
datetime_format 设置x轴刻度日期格式

4. make_addplot的基本用法

在金融数据分析中,我们要通过数据可视化展示的不仅是’Open’, ‘High’, ‘Low’, 'Close’和最常见‘ma’,还有一些其他分析数据,那么就要用到make_addplot()方法了,make_addplot可以接受一个pandas、numpy、array以及list格式的数据(tuple不可以),和**kwargs参数;需要注意的是:传递给make_addplot的数据参数必须与将来画图传递给plot的数据参数行数相同,**kwargs参数将全部传递到polt方法中。

import os
import pandas as pd
import mplfinance as mpf
import talib
import matplotlib.pyplot as plt

filename = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
df = pd.read_csv(filename)
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
df.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume', ]
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['Close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
print(df.tail())

df = df[5760:]

add_plot = mpf.make_addplot(df[['lower']])
mpf.plot(df, addplot=add_plot, type='candle', mav=(2, 5, 10), volume=True)

准备了一组数据:python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第5张图片

输出结果:python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第6张图片

如果要给图表添加多个数据绘制,直接用列表传入make_addplot即可,例如:

add_plot = mpf.make_addplot(df[['lower', 'upper']])  
mpf.plot(df, addplot=add_plot, type='candle', mav=(2, 5, 10), volume=True)

输出结果:python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第7张图片

把数据分析的结果标记到图像中
数据分析和可视化的目的是有分析结果,直接把结果展示的图表上将更加直观。先做个简单的数据分析,并把分析结果赋值到两个列表中,然后在绘图时标记到图表中,因为这里是标记,并非连续的线 ,此时可以在make_addplot方法中使用marker,以及markersize和color设置标记的大小和颜色,这些参数都是直接传递给plot方法的。

import os
import pandas as pd
import mplfinance as mpf
import talib
import matplotlib.pyplot as plt
import numpy as np

filename = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
df = pd.read_csv(filename)
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
df.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume', ]
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['Close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
print(df.tail())
df = df[5700:]


def data_analyze(data: pd.DataFrame):
    """
    简单的数据分析,并把返回数据分析结果列表,分析的逻辑不重要,主要看如何绘制到图形中。
    """
    if data.shape[0] == 0:
        data = data
    s_list = []
    b_list = []
    b = -1
    for i, v in data['High'].iteritems():
        if v > data['upper'][i] and (b == -1 or b == 1):
            b_list.append(data['Low'][i])
            b = 0
        else:
            b_list.append(np.nan)  # 这里添加nan的目的是,对齐主图的k线数量
        if data['Low'][i] < data['lower'][i] and (b == -1 or b == 0):
            s_list.append(v)
            b = 1
        else:
            s_list.append(np.nan)
    return b_list, s_list


b_list, s_list = data_analyze(df)
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(df[['upper', 'lower']])]
mpf.plot(df, addplot=add_plot, type='candle', mav=(2, 5, 10), volume=True)

输出结果:

python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第8张图片

在副图中绘制
plot绘图时是可以直接通过参数添加成交量副图的,如果想在副图中绘制数据可以在make_addplot中使用参数panel,直接上代码

import os
import pandas as pd
import mplfinance as mpf
import talib
import numpy as np

filename = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
df = pd.read_csv(filename)
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
df.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume', ]
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df['mavol'] = talib.MA(df['Volume'], timeperiod=10, matype=0)
df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['Close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
print(df.tail())
df = df[5700:]


def data_analyze(data: pd.DataFrame):
    """
    简单的数据分析,并把返回数据分析结果列表,分析的逻辑不重要,主要看如何绘制到图形中。
    """
    if data.shape[0] == 0:
        data = data
    s_list = []
    b_list = []
    b = -1
    for i, v in data['High'].iteritems():
        if v > data['upper'][i] and (b == -1 or b == 1):
            b_list.append(data['Low'][i])
            b = 0
        else:
            b_list.append(np.nan)  # 这里添加nan的目的是,对齐主图的k线数量
        if data['Low'][i] < data['lower'][i] and (b == -1 or b == 0):
            s_list.append(v)
            b = 1
        else:
            s_list.append(np.nan)
    return b_list, s_list


b_list, s_list = data_analyze(df)
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(df[['upper', 'lower']]),
    mpf.make_addplot(df['mavol'], panel='lower', color='y', secondary_y='auto'),
]
mpf.plot(df, addplot=add_plot, type='candle', mav=(2, 5, 10), volume=True)

输出结果:

python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第9张图片

5. marketcolors和mpf_style以及其他常用设置

marketcolors设置图表颜色

"""
make_marketcolors() 设置k线颜色
:up 设置阳线柱填充颜色
:down 设置阴线柱填充颜色
:edge 设置蜡烛线边缘颜色 'i' 代表继承k线的颜色
:wick 设置蜡烛上下影线的颜色
:volume 设置成交量颜色
:inherit 是否继承, 如果设置了继承inherit=True,那么edge即便设了颜色也会无效
"""
my_color = mplfinance.make_marketcolors(up='cyan', down='red', edge='black', wick='black', volume='blue')

添加图表样式

这里的设置应该在plot方法之前设置,而设置完成marketcolors后需要使用mpf_style添加设置,最后plot()方法的关键字参数style=my_style 才会生效。下面添加mpf_style,最后一起展示效果。

"""
make_mpf_style() 设置mpf样式
:gridaxis:设置网格线位置,both双向
:gridstyle:设置网格线线型
:y_on_right:设置y轴位置是否在右
"""
my_style = mplfinance.make_mpf_style(marketcolors=my_color, gridaxis='both', gridstyle='-.', y_on_right=Tru

mpf.make_mpf_style()方法可以使用的参数:  

mpf.make_mpf_style()参数 描述
base_mpf_style 要继承的mplfinance风格
base_mpl_style 要继承的matplotlib风格
marketcolors 用于设置K线的颜色。使用mpf.make_marketcolors()方法生成。
mavcolors 移动平均线的颜色
facecolor 图像的填充颜色。指的是坐标系内侧的部分的颜色。
edgecolor 坐标轴的颜色。
figcolor 图像外周边填充色。
gridcolor 网格线颜色。
gridstyle 设置网格线样式,可以是’-', ‘–’, ‘-.’, ‘:’, ‘’, offset, on-off-seq
gridaxis 网格线的方向,可以是’vertical’, ‘horizontal’, 或 ‘both’
y_on_right 设置y轴的位置是否在右边
rc 设置字体相关。中文和负号的正常显示问题都需要操作该参数。以字典形式传入。
legacy_rc 也是用于设置字体格式的,不过与rc不同的是,rc仅会将rc中传入的值更新进字典,并保留原有其他字体参数。而legacy_rc会将所有原字典删除,而仅仅使用legacy_rc。
style_name 风格名字,可以在使用mpf.write_style_file(style,filename)方法写自定义风格样式文件时使用。

mplfinance系统样式的使用

系统样式有哪些

# 输出全部系统样式
print(mplfinance.available_styles()) 

输出结果:

'blueskies', 'brasil', 'charles', 'checkers', 'classic', 'default', 'mike', 'nightclouds', 'sas','starsandstripes', 'yahoo'

继承系统样式并局部自定义修改 其实就是在继承系统样式的基础上按自己喜好进行 一些自定义修改的叠加:

my_color = mplfinance.make_marketcolors(up='cyan', down='red', edge='black', wick='i',volume={'up': 'blue', 'down': 'orange'}, ohlc='cyan')

my_style = mpf.make_mpf_style(base_mpf_style='blueskies', marketcolors=my_color, gridaxis='both',gridstyle='-.', y_on_right=True)

首先是自定义一组样式my_color,在make_mpf_style方法传参时先使用关键字base_mpf_style传参一个系统样式,再使用marketcolors=my_color,这样自定义设置之外的样式全部使用系统样式了。
另外,这里需要在提一下make_marketcolors方法的关键字参数edge/wick/volume/ ohlc四个关键字参数除了设置i自动继承up和down外,也可以使用字典模式分别自定义,比如上面的volume={‘up’: ‘blue’, ‘down’: ‘orange’}。

代码如下:

import os
import pandas as pd
import mplfinance as mpf
import talib
import numpy as np
import matplotlib.pyplot as plt

# 文件路径和名称
filename = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
# 读取CSV文件
df = pd.read_csv(filename)
# 取需要的数据
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
# 重命名
df.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume', ]
# 转换Date为日期格式
df['Date'] = pd.to_datetime(df['Date'])
# 设置Date为索引
df.set_index('Date', inplace=True)
# 用talib计算成交量MA
df['mavol'] = talib.MA(df['Volume'], timeperiod=10, matype=0)
# 用talib计算BOLL
df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['Close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
print(df.tail())
# 数据太多,切片使用5800之后的数据
df = df[5800:]


def data_analyze(data: pd.DataFrame):
    """
    简单的数据分析,并把返回数据分析结果列表,分析的逻辑不重要,主要看如何绘制到图形中。
    """
    if data.shape[0] == 0:
        data = data
    s_list = []
    b_list = []
    b = -1
    for i, v in data['High'].items():
        if v > data['upper'][i] and (b == -1 or b == 1):
            b_list.append(data['Low'][i])
            b = 0
        else:
            b_list.append(np.nan)  # 这里添加nan的目的是,对齐主图的k线数量
        if data['Low'][i] < data['lower'][i] and (b == -1 or b == 0):
            s_list.append(v)
            b = 1
        else:
            s_list.append(np.nan)
    return b_list, s_list


b_list, s_list = data_analyze(df)

"""
make_marketcolors() 设置k线颜色
up: 设置阳线柱填充颜色
down: 设置阴线柱填充颜色
edge: 设置蜡烛线边缘颜色 'i','in' 代表继承k线的颜色
wick: 设置蜡烛上下影线的颜色
volume: 设置成交量颜色
inherit: 是否继承, 如果设置了继承inherit=True,那么edge即便设了颜色也会无效
"""
my_color = mpf.make_marketcolors(up='red', down='green',
                                 edge='in', wick='in', volume='in')

# matplotlib默认不支持中文字体,设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

"""
base_mpf_style:    要继承的mplfinance风格
base_mpl_style:    要继承的matplotlib风格
marketcolors:    用于设置K线的颜色。使用mpf.make_marketcolors()方法生成。
mavcolors:    移动平均线的颜色
facecolor:    图像的填充颜色。指的是坐标系内侧的部分的颜色。
edgecolor:    坐标轴的颜色。
figcolor:    图像外周边填充色。
gridcolor:    网格线颜色。
gridstyle:    设置网格线样式,可以是’-', ‘–’, ‘-.’, ‘:’, ‘’, offset, on-off-seq
gridaxis:    网格线的方向,可以是’vertical’, ‘horizontal’, 或 ‘both’
y_on_right:    设置y轴的位置是否在右边
rc:    设置字体相关。中文和负号的正常显示问题都需要操作该参数。以字典形式传入。
legacy_rc:    也是用于设置字体格式的,不过与rc不同的是,rc仅会将rc中传入的值更新进字典,并保留原有其他字体参数。而legacy_rc会将所有原字典删除,而仅仅使用legacy_rc。
style_name:    风格名字,可以在使用mpf.write_style_file(style,filename)方法写自定义风格样式文件时使用。
"""
my_style = mpf.make_mpf_style(base_mpf_style='mike', marketcolors=my_color, gridaxis='both',
                              gridstyle='-.', y_on_right=True, rc={'font.family': 'SimHei'})

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(df[['upper', 'lower']]),
    mpf.make_addplot(df['mavol'], panel='lower', color='y', secondary_y='auto'),
]

"""
plot绘图的部分参数
type:    绘制图线的种类
ylabel:    y轴标签
style:    风格样式
title:    图表标题
show_nontrading:  True 显示非交易日(k线之间有间隔),False 不显示交易日,k线之间没有间隔
mav:    均线,格式为一个元组,如(5, 10)表示绘制5日均线和10日均线
volume:    是否绘制量柱图,默认为False,表示不绘制。
figratio:    图像横纵比,如(5,3)表示图像长比宽为5:3。
ylabel_lower:    表示底部图像的标签(一般是量柱图)
xrotation:    x轴刻度旋转度
datetime_format:    设置x轴刻度日期格式
savefig:    如果需要将图像保存为一个图片文件,则通过该参数指定文件路径即名字即可。不指定则默认不保存,但是图像会显示出来。如果指定了则图像不会直接显示出来。
"""
mpf.plot(df, type='candle', addplot=add_plot, volume=True, mav=(2, 5, 10), figscale=1.5, style=my_style, title='报价',
         figratio=(5, 5), ylabel='价格', ylabel_lower='成交量', datetime_format='%Y-%m-%d')

输出结果:

python金融数据分析和可视化--06_01用mplfinance金融数据可视化(上)_第10张图片

你可能感兴趣的:(python,数据分析,信息可视化)