用 Python 构建交易机器人:避免重复造轮子
当程序员第一次决定尝试量化交易时,一切通常从创建自己的脚本开始。脚本通过 REST API 请求 K 线数据,计算几个指标,然后发送订单。一个月后,这个项目就变成了一个庞大的结构,充斥着网络错误处理、套接字不同步以及订单控制的混乱变通方案。
与其从头编写所有内容,不如使用一个现成的框架。VeighNa 项目(前身为 VN.py)早在 2015 年就已出现,在 GitHub 上拥有超过 4.3 万颗星,至今仍在积极开发中。
平台概述
VeighNa 是一个开源的 Python 量化交易框架。内部架构围绕事件引擎构建。系统无需运行无限等待循环——它响应传入的行情数据、订单状态变化和系统定时器信号。
该项目面向机构用户。在中国,期货公司、资产管理公司和私募对冲基金都在使用它。这在代码库中留下了特定的印记。
大多数内置连接器都是为中国金融市场定制的(CTP、XTP、HT)。不过,也有针对 Interactive Brokers 的适配器用于与国际交易所对接。如果所需的交易所或加密平台不在列表中,则需要通过继承基础 Gateway 类来编写自己的网关。
解决实际问题的模块
系统架构由三个主要部分组成:核心、交易应用程序(apps)和数据适配器。
对于策略,系统提供了各种专业引擎:
- CTA 策略引擎处理单一品种的标准趋势和逆势交易。
- 价差交易引擎帮助实现配对交易和空间套利。
- 期权大师模块包含期权估值、波动率曲线构建和希腊值计算工具。
- 投资组合策略引擎专注于同时交易一篮子资产的策略。
一个贴心的特点是提供了现成的回测界面。要在历史数据上测试一个想法,不必非得打开 Jupyter Notebook。系统有一个基于 PyQt 的内置图形界面,可以在其中运行参数优化并立即查看权益曲线和回撤图表。
对于历史数据存储,支持 SQLite 和 MySQL 等常规关系型数据库,以及专门针对快速时间序列输入输出优化的 QuestDB 和 TDengine 等列式存储。
4.0 版本中的机器学习
第四代框架引入了模块 vnpy.alpha。开发者坦诚地表示他们受到了 Microsoft 的 Qlib 项目的启发。
该模块完善了机器学习策略的开发周期:
- 基于 Alpha158 因子表达式集进行特征生成和处理。
- 使用 LightGBM、Lasso 或多层感知器(MLP)训练预测模型。
- 从研究笔记本快速过渡到实盘或模拟账户执行。
仓库中包含现成的 Jupyter notebook 示例,因此熟悉数据准备和训练流程并不困难。
代码示例
启动带有所需模块集合的交易终端只需十几行代码。在下面的示例中,我们组装了一个带有 CTP 网关连接和两个模块的应用程序:CTA 策略执行和历史测试。
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():
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()
启动后,将打开一个完整的桌面窗口,包含订单表格、持仓、日志和 K 线图表。
生产环境是否值得使用
VeighNa 是一个庞大的平台。如果你只需要每天通过 REST API 向现货市场发送几个订单,这个框架会显得过于复杂。
然而,如果你正在寻找一个经过时间验证的事件驱动交易架构、计划编写自己的连接器,或者想要一个带有风险管理和回测功能的现成桌面终端,这个工具肯定会派上用场。最重要的是要做好准备,因为部分文档和社区评论是通过翻译工具从中文翻译过来的。
相关项目