• pandas_bokeh:投资量化平台可视化的利器


    持续行动1期 51/100,“AI技术应用于量化投资研究”。

    今天花点时间说说GUI以及序列可视化。

    有人说python的GUI功能不强,这个可能指的是内置的thinter框架。wxPython和pyQt基本是可以媲美C#的。当然若说易用性,没有哪个winform框架可以超越C# winform。那真是相当完美,wxPython也带了一个formbuilder,也挺方便的,尤其对于复杂的,控件多的界面。

    控件功能的使用相对简单,最复杂当属控件布局、对齐等。

    另外是回测结果可视化,本质也是时间序列的分析, 我们选择的框架是bokeh。

    01 bokeh

    python语言可视化的框架很多。

    最传统的matplotlib,seaborn属于“静态”绘图,与pandas结合得非常好。

    pyecharts, pyG2,pyplotly,bokeh等对于js绘图框架的封装,可以绘出漂亮的动态图。

    而且基于网页的特性,可以把多张图融到一起,可以动态查看布局信息。

    我选择的框架是bokeh

    qlib里内置的分析框架是plotly,就点类似 xwPython vs pyQt,pyQt很强大,但相对复杂,在基础功能相当的情况下,选择简单的东西。——我们一直都是这个原则——因为之于量化交易,因子和策略才是最重要的。

    https://docs.bokeh.org/en/latest/

    pip install bokeh 就可以安装最新版本,bokeh最新的版本是2.4.3。

    导入bokeh.io,可以输出到notebook或者文件。

    画出折线图:

    可以看出来,使用非常简单,如果你熟悉matlab的话,会觉得比较类似。

    02 pandas_bokeh

    由于我们的数据大部分在pandas的dataframe,我们主要使用的库是pandas_bokeh。

    它构建在bokeh之上,可以使用pandas的dataframe直接绘图,会更加方便。

    安装指令:pip install pandas-bokeh

    帮助文档:https://patrikhlobil.github.io/Pandas-Bokeh/

    导入方式类似:

    使用真实的数据看下效果:

    代表A股的沪深300指数 vs 代表美股的标普500指数,时间从2007-2022年,跨度15年。

    其实A股并不输美股,年化均是7%左右(未包含现金分红),当然A股的波动大。

    详细代码如下:

    import pandas_bokeh
    
    from bokeh.models.widgets import DataTable, TableColumn
    from bokeh.models import ColumnDataSource
    from bokeh.plotting import figure, save
    
    class BokehUtils:
        def __init__(self):
            pandas_bokeh.output_file(DATA_DIR_BKT_RESULT.joinpath('bkt_result.html'))
    
        def add_table(self, df_ratio, height=300):
            print(df_ratio)
            data_table = DataTable(
                columns=[TableColumn(field=Ci, title=Ci) for Ci in df_ratio.columns],
                source=ColumnDataSource(df_ratio),
                height=height,
            )
            return data_table
    
        def add_equity(self, df_equity, title='时间序列'):
            p = df_equity.plot_bokeh(rangetool=True, show_figure=False, )
            return p
    
        def add_yearly(self, df_years):
            p_bar = df_years.plot_bokeh.bar(
                ylabel="年度收益率",
                title="年度收益率",
                alpha=0.6,
                show_figure=False,
            )
            return p_bar
    
        def show(self, df_equity, df_ratio, df_yearly, df_corr):
            p = pandas_bokeh.plot_grid([[self.add_equity(df_equity), self.add_yearly(df_yearly)],
                                    [self.add_table(df_ratio), self.add_table(df_corr)],
                                    ],show_plot=False
                                   )
    
            save(p)

    核心代码讲解:

    pandas_bokeh用plot_grid可以把多个图表组合起来。

    每个子图需要设置show_fiture=False。

    show_plot=False确保只生成html,而不打开浏览器窗口。

    bokeh其实还有非常丰富的功能,支持tabs,各种widgets,但目前量化可视化而言,这些就够用了。

    03 wxpython的布局

    wxpython的控件布局,使用BoxSizer。

    BoxSize可以使用水平、垂直两种模式,类似css里的盒模型。

    def layout(self):
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
    
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox)
    
        hbox.Add(wx.StaticText(self,label='请选择基准:'))
        combo_benchmarks = wx.ComboBox(self, size=(180, 25))
        combo_benchmarks.SetItems(['沪深300指数(000300.SH)','标普500指数(SPY)'])
        hbox.Add(combo_benchmarks)

    说说题外话,关于“延迟满足”。

    延迟满足,相对于即时满足。似乎延迟满足是一种正确。但仔细想想底层逻辑不对。

    尽管不提倡“人生苦短,及时行乐”。但苦行僧般的日子着实没有必要,中间取一个平衡为宜。那个“棉花糖”实验被证实是不准确的。

    我们应该意识到短期、长期的收益的不对称性。

    小结一下:

    无论是基准分析,还是投资组合回测结果分析,无外乎时间序列,风险收益,指标分析,相关性分析等等。

    一图胜千言,可视化作为基础功能,我们提前给它实现一下,对我们后续高效投研有很大帮助。

  • 相关阅读:
    springboot集成mybatis步骤
    mysql根据条件导出表数据(`--where=“文本“`)
    QT-事件机制学习笔记
    二层交换机和三层交换机区别
    7年坚定投身“高清头显”,纳德光学聚焦打造高清头显领导品牌
    Java 8中stream流处理(入门教程)
    JS算法与树(二)
    强制关机后进不了系统
    [拒绝高深莫测] 区块链与比特币0基础科普
    Webpack 和 Rollup:一样但又不同
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126950001