Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
12645 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

37 | Kafka & ZMQ:自动化交易流水线

景霄 2019-08-02

你好,我是景霄。

在进行这节课的学习前,我们先来回顾一下,前面三节课,我们学了些什么。

第 34 讲,我们介绍了如何通过 RESTful API 在交易所下单;第 35 讲,我们讲解了如何通过 Websocket ,来获取交易所的 orderbook 数据;第 36 讲,我们介绍了如何实现一个策略,以及如何对策略进行历史回测。

事实上,到这里,一个简单的、可以运作的量化交易系统已经成型了。你可以对策略进行反复修改,期待能得到不错的 PnL。但是,对于一个完善的量化交易系统来说,只有基本骨架还是不够的。

在大型量化交易公司,系统一般是分布式运行的,各个模块独立在不同的机器上,然后互相连接来实现。即使是个人的交易系统,在进行诸如高频套利等算法时,也需要将执行层布置在靠近交易所的机器节点上。

所以,从今天这节课开始,我们继续回到 Python 的技术栈,从量化交易系统这个角度切入,为你讲解如何实现分布式系统之间的复杂协作。

中间件

我们先来介绍一下中间件这个概念。中间件,是将技术底层工具和应用层进行连接的组件。它要实现的效果则是,让我们这些需要利用服务的工程师,不必去关心底层的具体实现。我们只需要拿着中间件的接口来用就好了。

这个概念听起来并不难理解,我们再举个例子让你彻底明白。比如拿数据库来说,底层数据库有很多很多种,从关系型数据库 MySQL 到非关系型数据库 NoSQL,从分布式数据库 Spanner 到内存数据库 Redis,不同的数据库有不同的使用场景,也有着不同的优缺点,更有着不同的调用方式。那么中间件起什么作用呢?

© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • Jingxiao 置顶
    第一个问题,大家的回复很正确,time.sleep(1) 后置,则第一条消息会丢失,因为建立连接需要时间,建立成功之前的所有消息都会丢失。
    第二个问题,在 linux socket 中, 一个连接就是一个 socket , 但在 ZMQ 中, 一个 socket 上可以承载多个数据连接. 这里 socket 和connection不再是同个层次上的等价词汇, 要把socket理解为程序员访问数据连接的一个入口。因此,我们在绑定一个 socket 之后,可以让多个发布者连接到这里即可,和多个订阅者的使用是同样的方式。
    2019-08-19
    2
  • Skrpy
    我以为实战篇会有量化交易平台的实现的…可是老师只讲了一些 Kafka 的概念,39讲的 Django 也只是官方文档的例子…老师有没有更好的实战教程?
    2019-08-08
    1
    14
  • SCAR
    思考题
    1.如果把time.sleep(1)放在while 循环的最后,订阅者会接收不到发布者发布的第一个消息‘server cnt 1’,因为订阅者和发布者建立连接需要时间,连接好后已经是在第一个消息发布之后了,自然订阅者会手不到第一个消息的。
    2.多个发布者的话,不同的发布者使用不同的端口,而后订阅者根据匹配的端口读取消息。
    2019-08-02
    3
  • 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-02
    1
  • 宝仔
    把发布者的time.sleep(1)放到循环语句后面,会导致第一条消息(server cnt 1)丢失。原因是此时发布者应该还没有和zmq完全建立通讯通道,导致消息丢失
    2019-08-02
    1
  • hel793
    需安装 pyzmq
    2019-09-14
  • 小侠龙旋风
    socket.bind('tcp://*:6666')这句话里域名写成*是不是指任意域名?
    2019-08-04
  • 宝仔
    把time.sleep(1)放到while后面,消费者第一个数据包(server cnt 1)收不到
    2019-08-02
  • Claywoow
    老师,celery这个消息队列和您讲述的这两种有什么区别嘛?生产环境大多哪种消息队列比较实用和高效
    2019-08-02
    2
  • tt
    今天谈到了数据结构,我想请教一下老师,数据结构如果是基于链表的,在其它语言中会大量使用指针和引用,但是基于python语言变量含义的特殊性及参数传递的特性,在实现链表结构的时候有没有比较明确的指导呢?

    感觉9咱们专栏有很多点都和数据结构的实现有关,但是比较分散。
    2019-08-02
    1
收起评论
10
返回
顶部