mplfinance 一个堪称完美python量化金融可视化工具详析


1.mplfinance安装

使用清华源快速安装mplfinance库,执行以下命令即可:

pip install mplfinance -i https://pypi.tuna.tsinghua.edu.cn/simple

2.获取数据(从tushare接口)

使用tushare的接口获取金融数据,将数据格式化后,并保存为csv文件。
从tushare获取数据需要密匙,具体可以去tushare官网注册账号获取。
我们获取数据后,需要将其索引设置为时间序列的数据,并将列名更改为mplfinance库适用的格式,即下边的’trade_date’, ‘open’, ‘high’, ‘low’, ‘close’, ‘vol’。
最后将时间倒序排列。
获取数据需要传入的参数是股票代码,此外为了便于识别数据文件对应的上市公司,我们也获取了股票列表以根据股票代码匹配上市公司名字。考虑到文件命名不能存在星号*,但是被警告或将退市的上市公司的名字前边可以冠以*ST或**ST。当遇到这样的情况时,将星号改为汉字“星之”即可。
以平安银行的数据为例,平安银行对应的股票代码为"000001.SZ"。获取其数据并保存为csv文件。
现新建一个get_data.py文件,并编辑代码如下:

import tushare as ts
import pandas as pd

tokenn = 'Your token'
pro = ts.pro_api(tokenn)
# 获取股票列表,以便提取股票名称
stock_list = pro.stock_basic()


def get_data(tscode):
    df = pro.daily(ts_code=tscode)
    df = df.loc[:, ['trade_date', 'open', 'high', 'low', 'close', 'vol']]
    df.rename(columns={
    
    
        'trade_date': 'Date',
        'open': 'Open',
        'high': 'High',
        'low': 'Low',
        'close': 'Close',
        'vol': 'Volume'
    },
        inplace=True)       # 重定义列名,方便统一规范操作。
    df['Date'] = pd.to_datetime(df['Date'])  # 转换日期列的格式,便于作图
    df.set_index(['Date'], inplace=True)  # 将日期列作为行索引
    df = df.sort_index()
    return df


def get_name(ts_code):
    name = stock_list.name[stock_list['ts_code'] == ts_code].values[0]
    if name[0] == '*':
        name = '星之' + name[1:]
    return name


ts_code = '000001.SZ'
data = get_data(ts_code)
name = get_name(ts_code)
data.to_csv(name + '日线行情.csv')

保存好的数据如下图所示:
     在这里插入图片描述


3. 获取数据(从本地csv)

读取完数据后,如果直接对上边的变量data进行操作也是可以的,data已经满足mplfinance对数据要求的规范。
但是考虑到代码不断调试的过程,我们还是新建一个demo.py文件对上边获取到的'平安银行日线行情.csv'文件进行重新读取。
且读取后的数据,需要再对索引稍微做一点格式化。(即将时间列转换为时间序列数据格式,并设置为索引)

import mplfinance as mpf
import pandas as pd


def read_data(filename):
    df = pd.read_csv(filename)
    df['Date'] = pd.to_datetime(df['Date'])
    df.set_index(['Date'], inplace=True)
    return df

# 此时的数据,才满足mplfinance的数据的使用规范
df = read_data('平安银行日线行情.csv')
print(df)

符合规范的数据格式如下图所示
(不论你是怎么获取数据的,只要数据格式规范如此,即可继续随文章向下进行):
         在这里插入图片描述


4. mplfinance可视化

使用mplfinance库绘图,所有命令浓缩于mpf.plot()接口。故只需了解该接口的参数即可。
现将mpf.plot()接口主要参数示例如下。

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

其中参数type可以的取值有

type取值 描述
candle 蜡烛图
ohlc OHLC图,也称“美国线”。即用一根垂直的线段表示一天的行情,在开盘和收盘价格处划一笔刻度。
line 直线,即近绘制收盘价曲线
renko 砖形图
pnf pnf图,由圈和叉构成

(如果对图像有疑问可以百度了解,也可以自行测试)


其中参数style可以的取值有

style 描述
‘binance’ 币安风格
‘blueskies’ 蓝天风格
‘brasil’ 巴西风格
‘charles’ 查理风格
‘checkers’ 跳棋风格
‘classic’ 古典风格
‘default’ 默认风格
‘mike’ 迈克风格
‘nightclouds’ 夜云风格
‘sas’ SAS风格
‘starsandstripes’ 星条旗风格
‘yahoo’ 雅虎风格

这些参数值分别对应着不同的风格。此外还可以自定义风格,具体方法会在下边说到。


以 对平安银行2022年6-8月份行情数据,绘制一幅简单的蜡烛图 为例。使用蓝天风格(“blueskies”)。
并使用mav参数添加上5日均线和10日均线,以及附带上量柱图。

mpf.plot(df.loc['2022-6':'2022-8'],
         type='candle',
         ylabel="price",
         style='blueskies',
         title='PINGANBank from 2022-6-1 to 2022-8-31',
         mav=(5, 10),
         volume=True,
         figratio=(5, 3),
         ylabel_lower="Volume")

图像输出效果如下:
在这里插入图片描述
一幅美观的图表就这样绘制出来了。


5. 自定义风格样式

我们也可以使用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)方法写自定义风格样式文件时使用。

其中,关于颜色的参数,也可以是rgb的格式,不过要求把元组变为字符串写入,形如figcolor=‘(107, 195, 224)’

下边绘制

import mplfinance as mpf
import pandas as pd


def read_data(filename):
    df = pd.read_csv(filename)
    df['Date'] = pd.to_datetime(df['Date'])
    df.set_index(['Date'], inplace=True)
    return df

# 获取数据
df = read_data('平安银行日线行情.csv')

# 设置线元素的颜色
my_color = mpf.make_marketcolors(
    up="red",  # 上涨K线的颜色
    down="green",  # 下跌K线的颜色
    edge="black",  # 蜡烛图箱体的颜色
    volume="purple",  # 成交量柱子的颜色
    wick="black"  # 蜡烛图影线的颜色
)


# 自定义风格
my_style = mpf.make_mpf_style(
    base_mpf_style='nightclouds',
    # base_mpl_style='seaborn',  # 也可以试试matplotlib的seaborn等风格。
    marketcolors=my_color,
    figcolor='(0, 0.8, 0.85)',
    gridcolor='(0.9, 0.9, 0.9)',
    rc={
    
    'font.family': 'SimHei', 'axes.unicode_minus': 'False'}
)


# 选择平安银行2022年8月的数据进行绘图
mpf.plot(df.loc['2022-6':'2022-8'],
         type='candle',
         ylabel="price",
         style=my_style,
         title='平安银行6-8月 日线行情',
         mav=(5, 10),
         volume=True,
         figratio=(5, 3),
         ylabel_lower="Volume")

图像输出效果如下:
   在这里插入图片描述


6. 添加其他线条

mplfinance提供了添加多条线的方式。即通过mpf.plot()接口的addplot参数。
以添加唐奇安通道(20日唐奇安)的三条线为例,代码如下:

import mplfinance as mpf
import pandas as pd


def read_data(filename):
    df = pd.read_csv(filename)
    df['Date'] = pd.to_datetime(df['Date'])
    df.set_index(['Date'], inplace=True)
    return df


df = read_data('平安银行日线行情.csv')

# 设定上、下、中通道线初始值
upboundDC = pd.Series(0.0, index=df.Close.index)
downboundDC = pd.Series(0.0, index=df.Close.index)
midboundDC = pd.Series(0.0, index=df.Close.index)

# 求唐奇安上、中、下通道
for i in range(20, len(df.Close)):
    upboundDC[i] = max(df.High[(i-20):i])
    downboundDC[i] = min(df.Low[(i-20):i])
    midboundDC[i] = 0.5 * (upboundDC[i] + downboundDC[i])


df['upboundDC'] = upboundDC
df['downboundDC'] = downboundDC
df['midboundDC'] = midboundDC
data = df.loc['2022-5':'2022-8']


my_color = mpf.make_marketcolors(
    up="red",  # 上涨K线的颜色
    down="green",  # 下跌K线的颜色
    edge="black",  # 蜡烛图箱体的颜色
    wick="black",  # 蜡烛图影线的颜色
    volume="inherit"  # 继承up和down的颜色
)

# 设置图表的背景色 
my_style = mpf.make_mpf_style(
    base_mpl_style='seaborn',
    marketcolors=my_color,
    rc={
    
    'font.family': 'SimHei', 'axes.unicode_minus': 'False'}
)


add_plot = [
    mpf.make_addplot(data['upboundDC']),
    mpf.make_addplot(data['midboundDC']),
    mpf.make_addplot(data['downboundDC'])]

mpf.plot(data,
         type='candle',
         ylabel="price",
         style=my_style,
         title='平安银行5-8月 日线行情',
         addplot=add_plot,
         mav=(5, 10),
         volume=True,
         figratio=(5, 3),
         ylabel_lower="Volume")

输出图像效果如下:
   在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/weixin_48964486/article/details/126711045
今日推荐