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

使用panel绘制子图

mplfinance的早期版本只支持两个面板,称之为“main”和“lower”。为了向后兼容,如果任何代码通过panel=‘main’,将被翻译为panel=0,而panel='lower' 将被翻译为panel=1。新版以后建议用户使用整数来标识面板。当前版本最多可以添加9个子图,即panel<=9,否则 或报错。

添加子图

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

class DataFinanceDraw(object):
    """
    获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
    """
    def __init__(self):
        self.data = pd.DataFrame()

    def my_data(self, file_name='002624.SZ.csv'):
        """
        获取数据,把数据格式化成mplfinance的标准格式
        """
        data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
        data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
        data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
        data.set_index('Date', inplace=True)
        self.data = data
        return data


    def panel_draw(self):
        """
        make_addplot 绘制多个子图
        """
        data = self.data.iloc[-90:]
        add_plot = [
            # 参数panel即是设置添加到第几个子图
            mpf.make_addplot(data, type='candle',panel=2)
        ]
        mpf.plot(data, type='candle',
                mav=(2, 5),
                addplot=add_plot,
                volume=True,
                figscale=1.5,
                title='Candle',
                 figratio=(16, 10), 
                 ylabel='price', 
                 ylabel_lower='volume',
                )

        plt.show()  # 显示
        plt.close()  # 关闭plt,释放内存

if __name__ == "__main__":
    candle = DataFinanceDraw()
    candle.my_data('002624.SZ.csv')
    candle.panel_draw()

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

修改子图的顺序

途中可以看到,子图的k线图在最下面,按照排序最上为主图0,下面依次为1,2,…,9。 当然你也可以打乱顺序,两个k线图对比的话,图表相连比较合适,修改如下:

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

class DataFinanceDraw(object):
    """
    获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
    """
    def __init__(self):
        self.data = pd.DataFrame()

    def my_data(self, file_name='002624.SZ.csv'):
        """
        获取数据,把数据格式化成mplfinance的标准格式
        """
        data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
        data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
        data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
        data.set_index('Date', inplace=True)
        self.data = data
        return data


    def panel_draw(self):
        """
        make_addplot 绘制多个子图
        """
        data = self.data.iloc[-90:]
        add_plot = [
            # 参数panel即是设置添加到第几个子图
            mpf.make_addplot(data, type='candle',panel=1)
        ]
        mpf.plot(data, type='candle',
                 mav=(2, 5),
                 addplot=add_plot,
                 volume=True,
                 figscale=1.5,
                 title='Candle', 
                 figratio=(16, 10),
                 ylabel='price', 
                 ylabel_lower='volume',
                 main_panel=0, 
                 volume_panel=2,
                )

        plt.show()  # 显示
        plt.close()  # 关闭plt,释放内存

if __name__ == "__main__":
    candle = DataFinanceDraw()
    candle.my_data('002624.SZ.csv')
    candle.panel_draw()

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

设置子图比例和数量

仍然是上面的代码案例,只需在plot中增加两个参数panel_ratios和num_panels,panel_ratios是用了设置子图和主图的比例,参数的顺序是按图序号来设置的,例如:panel_ratios(1,0.3,0.8) 即0号图比例是1,1号图比例是0.3,2号图是0.8,只是注意:是按面板的序号而并非第一个就是主图比例,因为0号面板默认是主图但不一定必然是主图!!可以通过main_panel = 2 将主图改变序号。 num_panels是用了显式设置有几个子图,这个用到的会比较少,比如我们只添加了两个子图,而num_panels设置为4,那么就会有一个空白图,而这里有个小坑就是,一旦设置了num_panels的数量,那么panel_ratios的参数个数必须与之对应,否则会报错:

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

class DataFinanceDraw(object):
    """
    获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
    """
    def __init__(self):
        self.data = pd.DataFrame()

    def my_data(self, file_name='002624.SZ.csv'):
        """
        获取数据,把数据格式化成mplfinance的标准格式
        """
        data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
        data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
        data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
        data.set_index('Date', inplace=True)
        self.data = data
        return data

    def panel_draw(self):
        """
        make_addplot 绘制多个子图
        """
        data = self.data.iloc[-90:]
        add_plot = [
            # 参数panel即是设置添加到第几个子图
            mpf.make_addplot(data, type='candle',panel=1)
        ]
        mpf.plot(data, type='candle',
                 mav=(2, 5),
                 addplot=add_plot,
                 volume=True,
                 figscale=1.5,
                 title='Candle',
                 figratio=(16, 10),
                 ylabel='price', 
                 ylabel_lower='volume',
                 main_panel=0, 
                 volume_panel=2,
                 panel_ratios=(1, 0.3, 0.8, 0.5), 
                 num_panels=4,
                )

        plt.show()  # 显示
        plt.close()  # 关闭plt,释放内存

if __name__ == "__main__":
    candle = DataFinanceDraw()
    candle.my_data('002624.SZ.csv')
    candle.panel_draw()

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

绘制macd子图

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

class DataFinanceDraw(object):
    """
    获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
    """
    def __init__(self):
        self.data = pd.DataFrame()

    def my_data(self, file_name='002624.SZ.csv'):
        """
        获取数据,把数据格式化成mplfinance的标准格式
        """
        data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
        data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
        data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
        data.set_index('Date', inplace=True)
        self.data = data
        return data

    def append_macd(self):
        """
        使用talib计算macd数据
        """
        data = self.data
        data['macd_dif'], data['macd_dea'], data['macd_macd'] = talib.MACD(data['Close'], fastperiod=12,
                                                                           slowperiod=26, signalperiod=9)
        data['macd_macd'] = 2 * data['macd_macd']
        self.data = data
        return data

    def panel_draw(self):
        """
        make_addplot 绘制多个子图
        """
        data = self.data.iloc[-120:]
        add_plot = [
            mpf.make_addplot(data['macd_macd'], type='bar', width=0.7, panel=2, color='dimgray', alpha=1,
                                    secondary_y=False),
            mpf.make_addplot(data['macd_dif'], panel=2, color='fuchsia', secondary_y=True),
            mpf.make_addplot(data['macd_dea'], panel=2, color='b', secondary_y=True)
        ]
        mpf.plot(data, type='candle',
                 mav=(2, 5),
                 addplot=add_plot,
                 volume=True,
                 figscale=1.5,
                 title='Candle', 
                 figratio=(16, 10), 
                 ylabel='price', 
                 ylabel_lower='volume',
                )

        plt.show()  # 显示
        plt.close()  # 关闭plt,释放内存

if __name__ == "__main__":
    candle = DataFinanceDraw()
    candle.my_data('002624.SZ.csv')
    candle.append_macd()
    candle.panel_draw()

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

这里只是一个macd的简单实例,如果你想要更漂亮的效果,比如macd柱线在0轴上下方不同颜色,或者在变长时一种颜色缩短时一种颜色,这些都是数据处理的问题了,把上面的柱线数据histogram按0分为两组数据即可,分组的时候注意为保证x轴坐标相同,分组后缺失的数据用0填充,make_addplot添加数据时多添加一组数据设置不同颜色即可。这里以按0轴上下分色为例修改代码,其他风格以此类推。 修改部分代码如下:

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

class DataFinanceDraw(object):
    """
    获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
    """
    def __init__(self):
        self.data = pd.DataFrame()

    def my_data(self, file_name='002624.SZ.csv'):
        """
        获取数据,把数据格式化成mplfinance的标准格式
        """
        data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
        data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
        data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
        data.set_index('Date', inplace=True)
        self.data = data
        return data

    def append_macd(self):
        """
        使用talib计算macd数据
        """
        data = self.data
        data['macd_dif'], data['macd_dea'], data['macd_macd'] = talib.MACD(data['Close'], fastperiod=12,
                                                                           slowperiod=26, signalperiod=9)
        data['macd_macd'] = 2 * data['macd_macd']
        self.data = data
        return data

    def panel_draw(self):
        """
        make_addplot 绘制多个子图
        """
        data = self.data.iloc[-120:]
        # 使用柱状图绘制快线和慢线的差值,根据差值的数值大小,分别用红色和绿色填充
        # 红色和绿色部分需要分别填充,因此先生成两组数据,分别包含大于零和小于等于零的数据
        bar_r = np.where(data['macd_macd'] > 0, data['macd_macd'], 0)
        bar_g = np.where(data['macd_macd'] <= 0, data['macd_macd'], 0)
        add_plot = [
            mpf.make_addplot(data['macd_dea'],  panel=2, color='b', secondary_y=False),
            mpf.make_addplot(data['macd_dif'], panel=2, color='fuchsia', secondary_y=True),
            # 使用柱状图填充(type='bar'),设置颜色分别为红色和绿色
            mpf.make_addplot(bar_r, type='bar', color='red',  panel=2),
            mpf.make_addplot(bar_g, type='bar', color='green',  panel=2)
        ]
        mpf.plot(data, type='candle',
                 mav=(2, 5),
                 addplot=add_plot,
                 volume=True,
                 figscale=1.5,
                 title='Candle', 
                 figratio=(16, 10), 
                 ylabel='price', 
                 ylabel_lower='volume',
                )

        plt.show()  # 显示
        plt.close()  # 关闭plt,释放内存

if __name__ == "__main__":
    candle = DataFinanceDraw()
    candle.my_data('002624.SZ.csv')
    candle.append_macd()
    candle.panel_draw()

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

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