持续行动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)
说说题外话,关于“延迟满足”。
延迟满足,相对于即时满足。似乎延迟满足是一种正确。但仔细想想底层逻辑不对。
尽管不提倡“人生苦短,及时行乐”。但苦行僧般的日子着实没有必要,中间取一个平衡为宜。那个“棉花糖”实验被证实是不准确的。
我们应该意识到短期、长期的收益的不对称性。
小结一下:
无论是基准分析,还是投资组合回测结果分析,无外乎时间序列,风险收益,指标分析,相关性分析等等。
一图胜千言,可视化作为基础功能,我们提前给它实现一下,对我们后续高效投研有很大帮助。