37 | Kafka & ZMQ:自动化交易流水线
景霄
该思维导图由 AI 生成,仅供参考
你好,我是景霄。
在进行这节课的学习前,我们先来回顾一下,前面三节课,我们学了些什么。
第 34 讲,我们介绍了如何通过 RESTful API 在交易所下单;第 35 讲,我们讲解了如何通过 Websocket ,来获取交易所的 orderbook 数据;第 36 讲,我们介绍了如何实现一个策略,以及如何对策略进行历史回测。
事实上,到这里,一个简单的、可以运作的量化交易系统已经成型了。你可以对策略进行反复修改,期待能得到不错的 PnL。但是,对于一个完善的量化交易系统来说,只有基本骨架还是不够的。
在大型量化交易公司,系统一般是分布式运行的,各个模块独立在不同的机器上,然后互相连接来实现。即使是个人的交易系统,在进行诸如高频套利等算法时,也需要将执行层布置在靠近交易所的机器节点上。
所以,从今天这节课开始,我们继续回到 Python 的技术栈,从量化交易系统这个角度切入,为你讲解如何实现分布式系统之间的复杂协作。
中间件
我们先来介绍一下中间件这个概念。中间件,是将技术底层工具和应用层进行连接的组件。它要实现的效果则是,让我们这些需要利用服务的工程师,不必去关心底层的具体实现。我们只需要拿着中间件的接口来用就好了。
这个概念听起来并不难理解,我们再举个例子让你彻底明白。比如拿数据库来说,底层数据库有很多很多种,从关系型数据库 MySQL 到非关系型数据库 NoSQL,从分布式数据库 Spanner 到内存数据库 Redis,不同的数据库有不同的使用场景,也有着不同的优缺点,更有着不同的调用方式。那么中间件起什么作用呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何使用 Kafka 和 ZMQ 实现自动化交易流水线。作者首先回顾了前几节课的内容,包括通过 RESTful API 下单、使用 Websocket 获取交易所的 orderbook 数据以及实现策略和历史回测。随后,文章详细介绍了中间件的概念和消息队列作为一种中间件的特点和作用。通过 ZMQ 的实现和 Kafka 的比较,读者可以了解到消息队列的优势和适用场景。最后,文章讨论了基于消息队列的 Orderbook 数据流以及在真实项目设计中的应用和思考题。整体而言,本文通过实例和讨论,帮助读者快速了解了消息队列在自动化交易流水线中的应用,以及 ZMQ 和 Kafka 的特点和使用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》,新⼈⾸单¥59
《Python 核心技术与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(17)
- 最新
- 精选
- Jingxiao置顶第一个问题,大家的回复很正确,time.sleep(1) 后置,则第一条消息会丢失,因为建立连接需要时间,建立成功之前的所有消息都会丢失。 第二个问题,在 linux socket 中, 一个连接就是一个 socket , 但在 ZMQ 中, 一个 socket 上可以承载多个数据连接. 这里 socket 和connection不再是同个层次上的等价词汇, 要把socket理解为程序员访问数据连接的一个入口。因此,我们在绑定一个 socket 之后,可以让多个发布者连接到这里即可,和多个订阅者的使用是同样的方式。2019-08-19322
- 秋天的透明雨🌧️本机环境python 3.7.6, 需要把context = zmq.Context() 改成 context = zmq.Context.instance()
作者回复: 👍
2020-04-013 - Skrpy我以为实战篇会有量化交易平台的实现的…可是老师只讲了一些 Kafka 的概念,39讲的 Django 也只是官方文档的例子…老师有没有更好的实战教程?2019-08-08434
- SCAR思考题 1.如果把time.sleep(1)放在while 循环的最后,订阅者会接收不到发布者发布的第一个消息‘server cnt 1’,因为订阅者和发布者建立连接需要时间,连接好后已经是在第一个消息发布之后了,自然订阅者会手不到第一个消息的。 2.多个发布者的话,不同的发布者使用不同的端口,而后订阅者根据匹配的端口读取消息。2019-08-029
- hlz-123思考题 1.如果把time.sleep(1)放在while循环最后,订阅者接收不到发布者的第一条消息,因为,发布者和订阅者建立连接需要时间,在我的电脑中,建立连接的时间不低于0.5秒,并且通过程序运行表明,只在发布者while循环中第一次执行sleep(1),以后每次循环不执行sleep(1),接收者也能正常接收到发布者信息, 至于具体原因,需要老师讲解一下。 2.如果有多个发布者,每个发布者应该绑定一个socket 例如,发布者1,socket.bind('tcp://*:6666') 发布者2,socket.bind('tcp://*:6667') 对于接收者来讲,可以接收一个或多个发布者的消息, 接收发布者1消息,socket.connect('tcp://127.0.0.1:6666') 接收发布者2消息,socket.connect('tcp://127.0.0.1:6667')2019-08-0217
- 宝仔把发布者的time.sleep(1)放到循环语句后面,会导致第一条消息(server cnt 1)丢失。原因是此时发布者应该还没有和zmq完全建立通讯通道,导致消息丢失2019-08-026
- 教授老师,我用pyzmq,发布者/订阅者模式,发现有一个订阅者突然接收不到信息了,之前能接收,请老师指点一下2021-02-082
- 宝仔把time.sleep(1)放到while后面,消费者第一个数据包(server cnt 1)收不到2019-08-022
- Carl我理解新增一个发布者2,将bind方法改为connect,但是测试发现并不能够接收到发布者2发布的信息2020-03-231
- 建强思考题: (1)time.sleep(1)放到循环最后,发布者第一次发送的消息,没有被订阅者接受到。 由于对zmq知之甚少,个人肤浅理解:可能是zmq的发布者在绑定端口时,中间件可能会做一系列的检测,如检测网络,检查端口的可用性等等,会有一定的延迟,因此需要在端口绑定后延迟一秒。 (2)对于有多个发布者,zmq要求不同的发布者绑定到不同的端口,多个发布者还是可以正常发送信息,而对于订阅者,需要绑定对应的发布者端口才能接受到发布者发送的信息。 以上见解,有错误之处请老师指正。2020-03-071
收起评论