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核心技术与实战
登录|注册

34 | RESTful & Socket: 搭建交易执行层核心

景霄 2019-07-26
你好,我是景霄。
上一节,我们简单介绍了量化交易的历史、严谨的定义和它的基本组成结构。有了这些高层次的基本知识,接下来我们就分模块,开始讲解量化交易系统中具体的每部分。
从这节课开始,我们将实打实地从代码出发,一步步设计出一套清晰完整、易于理解的量化交易系统。
一个量化交易系统,可以说是一个黑箱。这个黑箱连接交易所获取到的数据,通过策略运算,然后再连接交易所进行下单操作。正如我们在输入输出那节课说的那样,黑箱的特性是输入和输出。每一个设计网络交互的同学,都需要在大脑中形成清晰的交互状态图:
知道包是怎样在网络间传递的;
知道每一个节点是如何处理不同的输入包,然后输出并分发给下一级的。
在你搞不明白的时候,可以先在草稿纸上画出交互拓扑图,标注清楚每个节点的输入和输出格式,然后想清楚网络是怎么流动的。这一点,对网络编程至关重要。
现在,我假设你对网络编程只有很基本的了解。所以接下来,我将先从 REST 的定义讲起,然后过渡到具体的交互方式——如何通过 Python 和交易所进行交互,从而执行下单、撤单、查询订单等网络交互方式。

REST 简介

什么是 REST API?什么是 Socket?有过网络编程经验的同学,一定对这两个词汇不陌生。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • Jingxiao 置顶
    思考题答案:事实上,在要求不是很严格的低频交易中,timestamp 是可以作为 nonce 存在的,它满足单调递增不重复的特性,比如一小时只会发送几个交易请求的波段策略中,timestamp 完全没问题。但是,在频率较高的交易中,timestamp 可能就不是那么适合。如果你使用协程来编程,或者使用类似 node.js 这样的异步编程工具或语言,那么你的代码很可能在发送的时候,并不是按照你想要的顺序发送给服务器,就会出现 timestamp 更大的请求反而更早发送。其次,在网络传输中,不同的包也可能有完全不同的抵达顺序,虽然你可以通过一些编程技巧来实现按顺序传输,但是如果你需要多台机器进行较为高频的交易。而且需要对同一个仓位(同一个 API Key)进行操作,就可能会变得比较麻烦。
    2019-08-01
    1
    13
  • 自由民 置顶
    为注册sandbox的账号折腾了半天,停在创建账号那里就不动了。不知道是不是墙的原因,挂了梯子终于注册好了,但是却要验证手机号码,开始我瞎填的美国加州,用网上的美国手机号接收验证码也不行。最后用另一个邮箱注册了,可以选中国的,手机也能接收到验证码。
    思考题:应该不行,对并发程序,先运行的未必时间戳在前,而用递增序列则可以确保先开始的顺序一定在前。
    课程的练习代码: https://github.com/zwdnet/PythonPractice

    作者回复: 谢谢

    2019-10-24
    1
  • SCAR
    思考题:
    1. 纯粹使用timestamp应该不行,虽然timestamp也是递增的,但是在python里timestamp是float而不是int。
    2.但如果基于timestamp抽取出部分应该是可以,比如老师例子中的:
       payload_nonce = str(int(time.mktime(t.timetuple())*1000))
       改成:
       payload_nonce = str(int(t.timestamp())*1000)
       结果应该是一致的。
    2019-07-26
    9
  • 小侠龙旋风
    知识点很多,整理一下。
    1. 非对称加密:
        加密:公钥加密,私钥解密;
        签名:私钥签名,公钥验签。
    2. hmac.new(key, str, digestmod)
        key是密钥;str是欲加密的串;digestmod是hmac加密算法
    3. 最后一句打印语句可以写成如下看着更清晰:
        print(json.dumps(new_order, indent=4))
    4. 在草稿纸上画出交互拓扑图
    5. 如何设计符合RESTful特征的API
    6. Keep-Alive: timeout=5, max=100

    思考题:
    测试了一下timestamp效果,代码如下:
    import time
    import datetime
    current_time = datetime.datetime.now()
    print(int(datetime.datetime.timestamp(current_time)*1000))
    print(int(time.mktime(current_time.timetuple())*1000))

    同样都是时间戳,timestamp是带毫秒的,具备单调递增、加密混乱的特质。
    文中有句话是这么说的:"当某个后来请求的nonce比上一个成功收到的请求的nonce小或者相等的时候,Gemini便会拒绝这次请求"。
    说明Gemini不希望http请求在一秒内发生多次。应该是反爬用的吧~
    用timestamp是可以精确到毫秒的,意味着每毫秒可以请求发送的nonce都不一样。

    另外,作为taker第二次运行该代码就报出下面的错:
    {
        "result": "error",
        "reason": "InsufficientFunds",
        "message": "Failed to place buy order on symbol 'BTCUSD' for price $3,633.00 and quantity 5 BTC due to insufficient funds"
    }

    作者回复: 👍

    参考出错原因,你的账户余额中 BTC 不够 5,下单失败。

    2019-07-27
    7
  • Monroe He
    我想问一下老师,有针对国内股票的虚拟交易平台吗
    可以提供一下相关方面的书籍资料吗
    2019-07-26
    2
    3
  • kang
    請問大家都是怎麼註冊Genimi 的? 我的註冊國家都被阻擋
    2019-08-23
    2
    2
  • 瞳梦
    请问gemini sandbox账号怎么注册呢?我在官网只找到了Open a Personal Account和I Represent an Institution

    作者回复: https://sandbox.gemini.com

    2019-07-26
    2
    1
  • 许童童
    老师讲得好啊,妙啊!
    2019-07-26
    1
  • Geek_adeba6
    想请问如果想实现秒级别的市场行情获取,生产环境下的最佳实践是什么?
    2019-07-26
    1
    1
  • Xg huang
    哈哈,深入浅出,赞一个

    不过有个地方是否写错?"而小宝在某一天中午 11:59:00,告诉交易所,我要挂一个单子,数量为 0.1 比特币,价格为 10000 美元,低于这个价格不卖。"

    是不是1000才对?

    编辑回复: 是的,我修改了

    2019-07-26
    1
  • furuiyang
    为啥大宝要买回复给了小明 小宝要卖回复给了小强 ...😵
    2019-10-18
  • 三件事
    非常喜欢老师的授课风格!
    2019-10-15
  • 扶幽
    应该不能。
    原因:因为nonce只有在被接收成功时才会增量,失败时未必会递增(我的假设,具体还待大佬们纠正)。但是使用时间戳的话,肯定是递增的,在一定程度上无法解决重复订单问题。
    2019-10-14
  • 鱼鱼鱼培填
    请教老师一个问题:在Gemini注册账号之后用生成key和secret实现代码,结果一直出现InvalidSignature
    试了两种方式:
    1、一开始以为是key setting的问题,结果三种都试过还是一样的结果
    2、重新生成key和secret,也还是一样的结果
    Google查找后发现有人也是一样的结果,但是没有找到解决方案
    2019-08-27
  • 江南皮革厂研发中心保安队长
    为什么我不是IT大牛,因为我没有小明这样的妈妈。[滑稽]
    2019-08-06
  • csn
    gemini_api_key是什么?
    2019-07-30
  • 蜉蝣
    大家为什么都不运行一下 `time.mktime(datetime.datetime.now().timetuple())` 就在说不能代替的问题
    2019-07-26
  • code2
    HTTP 协议是 Hyper Text Transfer Protocolv翻译过来不是超文本传输协议,提出这个协议的作者在其博士论文中有明确说明。
    2019-07-26
  • 程序员人生
    timestamp应该不能代替nonce。
    当某个后请求的nonce,比上一个成功收到请求的nonce小或者等于时候,服务器会拒绝接收。
    但timestamp不行,因为后请求的timestamp,可能会由于各种原因先到服务器,先请求的可能会晚到,并不能体现先后次序。
    不知道我理解是否正确?
    2019-07-26
  • SuQiu
    timestamp也属于自增长,猜测是由于他的可预见性,所以不能代替nonce
    2019-07-26
收起评论
20
返回
顶部