分享

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

 AI量化实验室 2023-10-12 发布于北京

持续行动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./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./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)

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

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

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

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

小结一下:

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

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多