转自:苍山日暮
最近梳理了策略库和以后的投研方向,系统性地回顾了下以前收集的、跟量化投资相关的各种开源库,初步构思了一个满足自己投研需求的系统框架。在被坑了两年的代码量后,已经无力一行行敲,所以这套框架会尽可能地使用这些开源工具。
即便如此,开发进展也很慢,毕竟还有其他的工作;这不几个期权交易策略要上线了,连个称手的监控工具都没有,期权这玩意儿光看价格交易是会疯了。所以不得不把期权监控模块的开发提前,原本只是框架中Monitor的一个应用的。
期权交易监控必要的几个部分:T型报价、Greeks、波动率曲面、vix、波动率锥、期限结构、偏度、以及构建的信号指标等。
数据和指标计算等这些就不用说了,大差不差,今天说下监控界面的开发问题。
(什么?你要用终端、横竖切几块、里面绿色字符不断闪烁?是很酷,但我选择赚钱❗️)
Qt
说到界面开发,当然不得不提Qt(Python自带的Tkinter就别提了)。软件UI开发首选利器,不过这个玩意儿有点重,代码量略大;更重要的是——默认风格丑、图表交互性差,把matplotlib绘图嵌入Qt里曾经也是部门里遗留的一个小难题。而且matplotlib的图,交互性简直不能忍,别说它的widgets,谁写谁用谁知道。
作为交易性的市场监控工具,图表交互的重要性就不用提了,所以Qt这个选项直接排除了。
(当年要不是开发环境陈旧、封闭,我是断不可能点开Qt技能树杈的。)
Flask
跳过Qt,技术方向一下子就到网页了。现在网页工具那么发达,Chrome OS都有了,网页开发还有什么干不了的。
首先说说美观和交互,echarts和D3.js直接把网页的图标交互提升了几个层次,虽然不会JavaScript,但Python厉害就厉害在生态上,对应的pyecharts和plotly马上就出来的,做起Dashboard来那是一个酷炫。
再来说说市场监控工具的使用场景,通常都是一台服务器负责主要运算,投资经理和交易员等直接开网页跟踪、监控就好了,部署起来内外网、权限控制都很容易,省了软件发行版每个应用程序都去取数据计算的问题(当然,软件发行版后面用REST或者RPC也能实现计算的服务器隔离)。
Flask作为Python网页开发的轻量级框架,用来做这种监控应用绰绰有余。但Flask作为框架,前端方面还是要用其他技术的,现在的问题是,作为纯门外汉,开发起来有不少东西得现学现用,太耗时,所以Flask往后面排了,等主要的应用都做完了,可能会用Flask统一后,进行网站开发和部署。
BTW,看到知乎上有人开发了vnpy的网页版UI,一下子就把PyQt 4/5的问题绕过去了,UI观感、易用性和扩展都提高了不少。
Bokeh和Dash
预期去学Flask、HTML、CSS、Vue等一堆东西,还不如找找轻量级的整合工具。于是Bokeh和Dash这俩货进入了最终PK;但差别还是很明显的:Bokeh是以Web浏览器为展示平台的交互式可视化Python库,而Dash是在纯Python环境中构建数据可视化Web APP的开源库。
在从交互式图表到网页应用的坐标轴上,Bokeh更靠近左边,Dash更靠近右边。Dash基于Flask、Plotly.js和React构建,提供了抽象层;对标上Bokeh更接近Plotly,但提供了网页app的封装,dash在网页布局和设置上提供了更好的灵活性,毕竟把html和交互式widgets做了几乎一对一的封装,而图表可视化则外包给了Plotly。
最后选Dash,除了文档和众多demo案例外,主要是考虑到监控页面的图表较多,需要布局和跨widgets交互。虽然bokeh也能实现,但是bokeh在图表内部的被动式交互(比如鼠标悬停提示)需要自己写HoverTool、数据还得映射到自带的数据类型,单个页面不宜太复杂;不过bokeh也有优点,其多tab跟浏览器tab切换一样方便,适合不同监控的切换,dash这方面的multipages还是有些难看的。
对Bokeh有兴趣的可以参考下面的案例,做K线展示的:
https://zhuanlan.zhihu.com/p/47761108
https://zhuanlan.zhihu.com/p/50995405
https://zhuanlan.zhihu.com/p/53032803
接下来,重点介绍Dash。
主要的特征:
- Plotly强大的交互式可视化图表;
- dash-html-components完整封装了html元素和属性;
dash-core-components提供了丰富的空间、图表组件的高级支持,连markdown都有; app结构简单清晰:一个用html.Div定义的layout,一堆回调函数;
支持多页面、支持动态更新;
状态和数据保留在浏览器的设计能最大程度保持多用户的独立,虽然对于某些开发场景来说有点难受,但也提供了几种共享数据的方式; dash本身就是用的Flask框架,app可以轻易整合到Flask应用中,方便以后的统一; 发展迅速,plot.ly确实比较良心。
最后看看官方gallery里几个金融应用: 左上销售情况展示; 右上是美国国债收益率历史期限结构的3-D曲面; 左下交互式投资报告; 右下经济衰退对各行业的就业影响。
其他行业诸如能源交通、生命科学的应用更加屌;不过这些咱都用不上,下面说下两个跟交易最相关的demo:
1,波动率曲面
就是封面图和文章前面那张图 2,网页交易
简单的 行情展示和交易功能,虽然数据是本地的,不过技术点都介绍到了。 ~~~~~~~~~ 自己用的期权监控比这些例子要复杂点,目前也只是完成了计算部分的代码和页面大致布局。数据源和衍生数据的持久化还有点问题,剩下的就是页面优化了。 即使dash干了这么多活,要想弄个舒适的监控界面,还是得了解点html和CSS的知识,然后不断调整。 (这里吐槽下现在某些炒股软件和金融终端,UI太繁琐、视觉冲击太大、无效信息太多,引起极度不适。) |