本周发布了VeighNa的3.7.0版本,本次更新的主要内容是增加了量化交易容器解决方案VeighNa Docker,为Linux和Mac系统用户提供类似VeighNa Studio的快速安装部署功能。
在此首先要对社区用户【eis】表示感谢!正是他在社区论坛中分享的xhost图形界面输出方案,帮助我们找到了如何基于Docker容器运行GUI程序的技术方向。
对于已经安装了VeighNa Studio的用户,可以使用快速更新功能完成自动升级。对于没有安装的用户,请下载VeighNa Studio-3.7.0,体验一键安装的量化交易Python发行版,下载链接:
https://download.vnpy.com/veighna_studio-3.7.0.exe
是否需要学习Docker
开始正文内容之前想要说明下:对比VeighNa Studio,使用VeighNa Docker需要掌握更高水平的开发技术知识,并不一定适合所有用户。
这里梳理一些VeighNa Docker适合的应用场景:
实盘交易中使用Linux系统,希望实现更低的tick-2-trade延时;
需要分布式部署的程序基础设施,解决策略并发数量上限的瓶颈;
交易团队已经有一定规模,需要标准化的量化投研环境部署管理。
如果你有上述需求,那么强烈推荐继续往下看。
认识Docker容器技术
从互联网上普遍能搜索到的描述定义来看,Docker是一套开源的应用容器引擎,采用操作系统级别的虚拟化技术来对【软件应用】及其【依赖的运行时环境】进行打包,并将打包完成的轻量级容器快速部署到各种不同环境中高效运行。
看完这段有点绕口的文字,不知道大家的感觉如何?反正当我第一次接触Docker的时候挺晕的,所以这里试着通过类比的方式来帮大家更加容易地理解。
不管是投研回测还是实盘交易,想要成功运行起来一个VeighNa量化平台的程序,必须确保当前的系统上已经安装好了:
Python解释器(3.7-3.10版本)
依赖的三方库(NumPy、TA-Lib、Plotly、PySide6等)
VeighNa核心框架和功能插件
上述三块内容中,3就是前文中的【软件应用】,而1和2加在一起则是【依赖的运行时环境】。那么为了实现这三块内容的快速安装部署,在Windows系统上的解决方案就是VeighNa Studio,运行exe安装包后几次点击就能自动完成整个安装流程。
由于Linux系统上软件安装方式的区别:例如系统自带Python(影响1)、底层依赖库的全局影响(影响2)等,导致无法直接照搬VeighNa Studio的方案,更好的选择是采用类似虚拟机的形式将1-3整体打包后进行分发部署(直接不用安装了)。
在还没有VeighNa Studio的1.0版本时代,我们就曾经推出过基于VirtualBox的虚拟机镜像,但大家用下来普遍反馈虚拟机对比实体机的性能损耗还是挺明显。背后的原因可以参考上图的右侧部分,虚拟机中的应用程序和底层硬件中间,隔着有Hypervisor(虚拟硬件层)和Guest OS(虚拟机内系统)两层组件,带来了显著的开销(分钟级的启动耗时)。
2013年发布的Docker带来了更加轻量级的方案。参考上图的左侧部分,在宿主机的操作系统上仅需运行Docker守护进程来负责对Docker容器进行运维管理,省去了臃肿的虚拟机内系统,从而实现更高的运行效率:节省大量系统资源、毫秒级的启动耗时、接近原生运行的性能水平。
本次3.7.0版本中新增的VeighNa Docker,就是打包了Python解释器、底层依赖库和VeighNa量化平台的完整量化容器镜像,仅需几行命令就能实现自动下载和运行启动。
Docker安装流程
运行Docker容器之前需要先安装Docker引擎,这里重点介绍在Linux(Ubuntu 22.04)服务器上的安装流程,不清楚的地方推荐参考
官方文档中的安装教程。sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 运行hello-world镜像验证安装成功:
sudo docker run hello-world
apt-get install x11-xserver-utils
9. 启动xhost(注意该命令每次重启系统后都要运行):
对于Windows和Mac系统用户直接从Docker官网下载安装Docker Desktop即可,Windows上推荐启用WSL2环境。完成Docker引擎的安装配置后,运行VeighNa Docker就相当简单了。
在用户目录下创建一个空文件夹(这里假设为/home/user/trader),在其中放置run.py启动脚本文件,内容为:from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
docker run \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/user/trader:/home \
veighna/veighna:3.7 python3 run.py
如果是第一次运行,Docker引擎会自动从Docker Hub网站上下载拉取veighna/veighna:3.7镜像(大约几分钟的时间,取决于网络带宽),并在下载完成后直接启动容器,此时就可以看到熟悉的VeighNa Trader界面了:
尽管容器和虚拟机在底层实现上有着挺大区别,但是对于其中运行的程序来说整体环境相当类似,在容器中同样存在运行程序时的默认用户目录/home。运行docker run命令时,我们通过参数【-v /home/user/trader:/home】,将之前在操作系统中新建的/home/user/trader(包括其中的文件)挂载到了容器内的/home目录下,从而保证在容器内运行【python3 run.py】命令时能够成功找到run.py文件。在VeighNa Trader的运行过程中,临时文件(JSON配置文件、SQLite数据库文件等)会被写入到容器内的/home/.vntrader文件夹中,由于前面的挂载机制等同于外部系统中的/home/user/trader/.vntrader文件夹。该文件夹中的内容即使关闭Docker容器后也依旧存在,从而满足程序运行过程中的数据持久化需求。
目前VeighNa Docker中已经打包的模块包括:
- 除了vnpy_excelrtd以外的所有开源应用模块
除了上文中展示的VeighNa Trader外,VeighNa Docker还支持更多其他的运行方式,例如Jupyter Lab交互式投研环境、VS Code容器内代码开发、no_ui交易服务运行等,我们将会在后续的文章中详细讲解,欢迎关注。
新增沪股通和深股通交易所枚举值
增加vnpy_tap对于Linux系统的支持
增加vnpy_rqdata对于新型主力合约数据支持(切换前一日收盘价比例复权)
vnpy_ctastrategy/vnpy_ctabacktester加载策略类时,过滤TargetPosTemplate模板
vnpy_ctp连接登录过程中,只有在授权码错误的情况下,才禁止再次发起认证
vnpy_uft增加对广期所GFEX的支持
vnpy_tqsdk增加对于output日志输出功能的支持
vnpy_dolphindb允许指定用户自行配置具体的数据库实例
vnpy_rqdata优化对于郑商所期货和期权合约的查询代码转换规则
vnpy_rqdata增加对广期所GFEX的支持
vnpy_portfoliostrategy增加回测爆仓检查
vnpy_portfoliostrategy策略模板增加合约乘数查询函数get_size
vnpy_portfoliostrategy回测加载日线和小时线数据时,不使用分段加载
修复vnpy_rpcservice中,RPC接口对于推送数据的vt前缀相关字段错误问题
修复vnpy_mini中,对于INE交易所今昨仓位的特殊处理
修复vnpy_datamanager中,批量数据更新时缺失output函数的问题
修复vnpy_spreadtrading中,回测加载数据时优先从数据服务获取历史数据的问题,改为优先从本地数据库加载