Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 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核心技术与实战
登录|注册

35 | RESTful & Socket: 行情数据对接和抓取

景霄 2019-07-29
你好,我是景霄。
上一节课,我们介绍了交易所的交易模式,数字货币交易所 RESTful 接口的常见概念,以及如何调用 RESTful 接口进行订单操作。众所周知,买卖操作的前提,是你需要已知市场的最新情况。这节课里,我将介绍交易系统底层另一个最重要的部分,行情数据的对接和抓取。
行情数据,最重要的是实时性和有效性。市场的情况瞬息万变,合适的买卖时间窗口可能只有几秒。在高频交易里,合适的买卖机会甚至在毫秒级别。要知道,一次从北京发往美国的网络请求,即使是光速传播,都需要几百毫秒的延迟。更别提用 Python 这种解释型语言,建立 HTTP 连接导致的时间消耗。
经过上节课的学习,你对交易应该有了基本的了解,这也是我们今天学习的基础。接下来,我们先从交易所撮合模式讲起,然后介绍行情数据有哪些;之后,我将带你基于 Websocket 的行情数据来抓取模块。

行情数据

回顾上一节我们提到的,交易所是一个买方、卖方之间的公开撮合平台。买卖方把需要 / 可提供的商品数量和愿意出 / 接受的价格提交给交易所,交易所按照公平原则进行撮合交易。
那么撮合交易是怎么进行的呢?假设你是一个人肉比特币交易所,大量的交易订单往你这里汇总,你应该如何选择才能让交易公平呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • Jingxiao 置顶
    思考题答案:
    Websocket 可能丢包。TCP 协议保证了所有的包按顺序抵达(即使是乱序抵达,在前面的包收到之前,TCP 协议下的底层程序也会讲先到达的靠后的包缓存,直到前面的包抵达,才送给上层的应用程序),但是并不能保证不可恢复的错误发生的时候,包不会丢失。这种情况发生的时候,就会出现 Orderbook 中一个或多个(价格,数量)信息没得到及时更新。这种错误越积攒越多的情况下,就会导致本地的 Orderbook 充满垃圾信息,变得完全不可靠。因此一个很好的做法是,可以设置一个时间间隔,通过 RESTFul 或者其他方式重新抓一下 Orderbook 的 Snapshot,然后和本地的 Orderbook 进行比对,纠正错误。
    2019-08-01
    10
  • tt
    websocket包的安装使用如下命令:

    pip -m install websocket_client安装。

    pip -m install websocket会安装另外一个完全不同的包
    2019-07-29
    13
  • SCAR
    思考题:
    1. websocket基于tcp的,虽然协议上有纠错,重传和等待的机制,但一些特殊的情况还是可能会有丢包的情况,比如同时有超过服务器负载的客户端在请求数据。
    2.如果丢包的情况发生时,类似开大会会场人人都发微信图片,看着WiFi信号满格,却发不出去,差不多一样的道理爬虫也是收不到数据的。
    3.查了下websocket的WebSocketApp的函数,有个参数on_error,是websocket发生错误的时候触发的,那么我们可以编写这个对应的回调函数来让服务器重发或者其他有效的处理。

    作者回复: 👍

    2019-07-29
    11
  • tux
    干布球和tt 的提示,解决了报错。
    import websocket #pip install websocket-client
    import _thread as thread

    在查找资料时,看到了:
    import websocket
    try:
        import thread
    except ImportError:
        import _thread as thread
    2019-07-29
    4
  • SCAR
    尝试回答下Destroy的问题:
    查看WebsocketApp函数:
    on_message: callable object which is called when received data.
     on_message has 2 arguments.
     The 1st argument is this class object.
     The 2nd argument is utf-8 string which we get from the server.
    你如果直接on_message = self.on_message,那么会缺少第一个参数,因为class Crawler类里on_message(self,message)是缺少如最上面老师例子def on_message(ws, message)里的ws的。所以
    on_message = lambda ws, message: self.on_message(message)是通过lambda补上第一个参数ws。
    2019-07-29
    2
    4
  • 干布球
    第二段代码少了个import time,python3里面thread用import _thread,不知是不是这样?
    2019-07-29
    1
    3
  • ttttt
    websocket资料
    https://pypi.org/project/websocket_client/

    作者回复: 👍

    2019-07-29
    2
  • hel793
    Latency is 2630.9838048 ms
    2019-09-05
    1
  • Claywoow
    老师,请教个问题,为什么我把这两个类分成两个模块来测试的时候,程序会进入无响应的状态,好像一直在运行,这会是什么原因呢?
    2019-08-04
    1
  • Geek_adeba6
    想请问是否可以使用STOMP协议与Gemini这样的交易平台通信, 像消息队列rabbitmq 有 stomp的plugins

    作者回复: 理论上他可以这么做,但是 Gemini 目前官方只支持 RESTFul 和 Websocket,以及金融工程中经常用到的 FIX 协议,这些协议都有着广泛支持的开源库和经过充分时间验证的安全性,切换到新的协议没有太大必要,但是以后的事情谁也说不定呢

    2019-07-30
    1
  • Merlin
    对于web socket的编程,可以用asyncio,我觉得用asyncio来开发web socket更为方便

    作者回复: 嗯嗯

    2019-11-26
  • 小侠龙旋风
    最近在复习js的相关知识,js中socket.io库封装了websocket,同时也包含了其他连接方式,比如ajax。socket.on(event_name, callback)中的内置事件名有10种。https://socket.io/docs/client-api/
    2019-09-01
  • 小侠龙旋风
    会丢包,在on_error(ws, error)回调函数中做处理
    2019-08-03
  • jxs1211
    请问老师,下面代码中select.select是什么意思,这段代码主要起到什么作用
    class Dispatcher:
        def __init__(self, app, ping_timeout):
            self.app = app
            self.ping_timeout = ping_timeout

        def read(self, sock, read_callback, check_callback):
            while self.app.sock.connected:
                r, w, e = select.select(
                        (self.app.sock.sock, ), (), (), self.ping_timeout)
                if r:
                    if not read_callback():
                        break
                check_callback()
    2019-08-03
  • jxs1211
    实测on_message = self.on_message没有问题,源码中_callback中只是对回调函数做了类型判断,self.on_message是和method,所以直接将返回data给了形参message,执行接受数据的处理
    2019-08-03
  • _stuView
    我之前看到Linux公众号讲python并不是一个解释型语言,而是一个运行在虚拟机上的语言https://mp.weixin.qq.com/s/Yqwk_eXO1t5N2cjRz_u0sw

    作者回复: 如果一定要回答 Python 是不是解释型语言,那么答案是它是部分编译型语言。它和 Java 类似,不会像 C++ 一样编译到机器语言,而是编译成字节码来提高执行速度。https://stackoverflow.com/questions/6889747/is-python-interpreted-or-compiled-or-both

    2019-07-31
    1
  • enjoylearning
    既然是网络传输就一定会丢包,所以需要建一个队列
    2019-07-30
  • Destroy、
    因此,应该你注意到了,它的第一个参数是 self,这里如果直接写成 on_message = self.on_message 将会出错。
    为了避免这个问题,我们需要将函数再次包装一下。这里我使用了前面学过的匿名函数,来传递中间状态,注意我们只需要 message,因此传入 message 即可。
    这段没看懂,老师或者哪位大神能解释一下?
    2019-07-29
    1
  • jutsu
    有没有异步非阻塞这类的,非得websocket吗
    2019-07-29
  • 无法言喻.
    1.会丢包
    2.timeout错误
    3.用每次请求的数据量和数据时间进行对比
    不知道有没有说对1个:)
    2019-07-29
收起评论
20
返回
顶部