Python期货量化交易

978-7-115-57727-6
作者: 祝学礼
译者:
编辑: 胡俊英

图书目录:

详情

近年来,Python?语言凭借其在数据分析领域的优势得以快速发展,众多软件厂商也相继推出了支持Python的量化交易平台。本书是介绍Python编程及其在量化交易领域的实践技巧的图书,旨在帮助读者掌握基本的Python编程技能,并顺利应用于期货量化交易实践。 本书内容分为两篇。第一篇是Python基础,通过13章内容介绍了Python编程的基础知识,如语法规则、数据类型、函数、类、装饰器、异常处理、进程和线程等;第二篇是期货量化交易,通过8章内容介绍了Python在期货量化交易中的应用,并基于天勤量化交易平台讲解开发实践,涉及pandas模块、TqSdk的接口、函数、量化策略的框架、图形化编程及时间序列相关的知识等。 本书适合对期货量化交易感兴趣的普通投资者和投资机构专业人员阅读,读者可以具备一定的?Python基础,也可以通过本书从头学习Python基础知识,再进一步延伸到期货量化交易的学习。

图书摘要

版权信息

书名:抢读版-Python期货量化交易

ISBN:978-7-115-57727-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    祝学礼

责任编辑 胡俊英

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


近年来,Python 语言凭借其在数据分析领域的优势得以快速发展,众多软件厂商也相继推出了支持Python的量化交易平台。本书是介绍Python编程及其在量化交易领域的实践技巧的图书,旨在帮助读者掌握基本的Python编程技能,并顺利应用于期货量化交易实践。

本书内容分为两篇。第一篇是Python基础,通过13章内容介绍了Python编程的基础知识,如语法规则、数据类型、函数、类、装饰器、异常处理、进程和线程等;第二篇是期货量化交易,通过8章内容介绍了Python在期货量化交易中的应用,并基于天勤量化交易平台讲解开发实践,涉及pandas模块、TqSdk的接口、函数、量化策略的框架、图形化编程及时间序列相关的知识等。

本书适合对期货量化交易感兴趣的普通投资者和投资机构专业人员阅读,读者可以具备一定的 Python基础,也可以通过本书从头学习Python基础知识,再进一步延伸到期货量化交易的学习。


我在期货市场从业多年,接触了众多投资者,大部分投资者对量化交易的印象是机器自动化交易比人工反应快,且机器不受个人情绪的影响更能坚决地执行交易指令。但机器不能像人那么“智能”,人可以准确地识别价格形态并根据市场变化及时做出调整,而机器却不能。因此,量化交易只是程序化交易的代名词,其分析能力则相对较弱,无法代替人工,这使得量化交易在国内尚未被多数人认可。

这也说明许多人对量化交易认识的一个盲区就是忽略了量化交易的量化分析部分,而只关注其程序化交易部分。因为量化分析需要较深的数学功底,只有少数专业投资者才具备这些功底,这可能是多数投资者忽视量化分析的主要原因。如今随着计算机的发展,MATLAB、Python等都可以轻松地实现数学分析,不需要人工去计算,而且金融领域相比于其他领域是更容易做数据分析的,因为价格、成交量等数据可以直接获得,所以普通投资者掌握机器分析也可以成为专业投资者。

量化交易在国外已经发展了几十年,形成了非常成熟的体系,随着近些年人工智能的发展,国外主要投资机构更是逐步用机器自动化交易替代人工交易,未来的交易市场不再是人与人的博弈,而是人与机器的博弈,量化交易打败纯手工交易将是市场发展的趋势。

量化交易在国内发展贫弱的重要原因是缺乏专业的量化平台,大多数投资者可选择的量化平台就是少数几家软件厂商推出的量化软件。这几款量化软件能实现的功能基本上都是程序化交易,而且所使用的程序语言是自编语言,只能实现相对简单的程序化,策略稍微复杂一些就难以实现,更难做到量化分析。几家软件厂商所使用的自编语言也互不相通,投资者的策略难以跨平台移植。

少数专业投资机构可以自己开发量化软件,但大多数投资者只能选择特定的几款软件,缺乏专业的量化平台,这也使得量化交易的概念难以在国内普及,大多数投资者在交易市场也只能处于劣势。

近年来,Python语言凭借其在数据分析领域的优势在国内快速发展,国内软件商也相继推出支持Python的量化平台,Python量化平台是软件商紧跟时代发展的革新。其中,信易科技推出的天勤量化(TqSdk)平台以其开源、高自由度的优势迅速获得了投资者的关注,TqSdk作为Python的一个第三方库使用,投资者可充分利用Python高级语言的优势,结合TqSdk编写各种复杂的策略,也可以基于TqSdk开发个性化的交易软件。原本大多数投资者只能选择有限的几款普通软件与专业机构竞争,但未来投资者将由劣势向优势转变。随着更多人对量化交易的了解不断深入,不仅国内投资者整体的专业性可以得到提升,也可以在国际投资市场上与其他投资机构竞争。

本书的读者对象包括:

☑ 正在寻找专业量化平台的普通投资者和投资机构专业人员;

☑ 有Python基础或Python零基础的投资者。

本书按内容逐级递进的层次进行编写,全书分两篇,共21章。

第一篇介绍Python基础。主要介绍Python编程的基础知识,共13章。

第1章主要介绍Python的语法规则。因为写一行代码就是写一条语句,所以先从语法规则介绍。

第2章介绍Python常用的数据类型。数据是要处理的对象,也是语句的组成部分。

第3章介绍函数。函数是代码重用的方式,我们编写的语句如果需要反复执行,就可以放进函数中,可把函数看作数据和各种语句的结合体。

第4章介绍常用数据类型的运算。数据是一个对象,对象具有方法(函数),我们可以用Python内置函数处理数据,也可以用数据自带的方法处理数据。

第5章介绍循环语句。Python语言的for循环和其他编程语言不同,Python的for循环是迭代执行可迭代对象,可迭代对象是Python语言的重要概念,特殊的可迭代对象生成器是异步协程的基础。

第6章介绍类的概念。类是面向对象编程的核心概念,类是数据的属性与方法的封装,类也是代码重用的方式,它便于我们处理同类的问题。类可以被看作各种语句与函数的结合体。

第7章介绍装饰器。装饰器也是代码重用的一种方式,装饰器可被看作“函数的继承”。

第8章介绍错误和异常的处理。学完前面几章的内容我们就可以写各种程序了,但程序在执行时可能遇到错误和异常,本章介绍了异常捕捉及错误处理的方法。

第9章介绍模块和包。模块是Python文件,我们写好的代码需要保存成Python文件,模块所在的文件夹称为包。

第10章介绍日期时间的处理。TqSdk业务数据的时间经常需要转换,我们也可能需要设置时间条件来选择执行量化策略。

第11~13章介绍实现异步任务的方法,分别是多进程、多线程和异步协程,这3章尽可能详尽地列出了量化中可能会用到的方法,TqSdk的代码比较依赖异步协程,读者应当掌握这部分内容。

第二篇介绍期货量化交易。主要介绍如何用TqSdk编写期货交易策略。

第14章介绍TqSdk的基本信息。

第15章介绍pandas模块。因为K线和tick数据是pandas的数据格式,所以有必要介绍pandas在数据处理中的使用。

第16章介绍TqSdk各接口如何使用,诸如账户登录、下单、生成图形化界面等。

第17章解读TqSdk的部分函数,深入了解这些函数才可以进行高级开发。

第18章介绍一些量化策略的框架,这些框架可用于多种策略场景中。

第19章和第20章介绍图形化编程。可以用PyQt5开发GUI程序,用
PyQtgraph绘制实时K线和技术指标。

第21章介绍时间序列的相关性检验方法,并作为量化分析的一个简单示例。

本书逐级递进展开,很适合没有Python基础的读者快速掌握Python基本内容,对于有Python基础的读者,可以直接看第二篇的内容,但还是建议至少从第13章开始看,这样可以加深对异步协程的理解,更快速地掌握TqSdk的用法。

本书以实用性为目标,尽可能做到每一个示例都能在读者学习量化相关技术的过程中给予启发。本书的示例可以运行,但一些量化策略示例仅作为模板参考,不建议直接用来做实盘交易。

感谢信易产品经理徐亦达对我使用天勤平台过程中提供的帮助。

感谢本书编辑对我的各种指导,使我的写作水平有了很大的提高。

感谢姐姐胡潇倢在我写作中给予的鼓励和帮助。

感谢在工作和生活中帮助过我的所有人,感谢你们,正是因为有了你们,才有了本书的面世。

虽然花了很多时间和精力去核对书中的文字和代码,但因水平有限,书中仍难免会有一些错误和纰漏。如果您发现什么问题,恳请反馈给我,相关信息可通过我的知乎账号私信发给我,昵称为“人世间”。如果您对本书有任何疑问或想与我探讨Python量化相关的技术,也可以在知乎与我交流。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供配套资源,请在异步社区本书页面中单击“配套资源”,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑虽尽最大努力来确保书中内容的准确性,但难免会存在疏漏之处。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/ selfpublish/submission即可)。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括但不限于对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近40年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号



人与人在沟通的时候,需要靠语言传递彼此的“思想”,没有语言,人们就无法相互理解对方,语言是承载其内涵的媒介。那么,什么样的语言才可以准确而有效地传递人们语言的内涵呢?

语言需要有一定的规则才能准确地传递“含义”,含混不清的规则轻则引发歧义,重则根本无法理解。卖羽绒服的店铺门上写着“包不掉毛”,便很容易引发歧义。虽然语言规则读得通顺,但左右方向不同的读法会令“含义”不同。如果门上写着“羽狗服,五木钱一条,欢迎抢座”,就是逻辑不通,完全不能了解其中的“含义”。

人类既可以通过声音表达语言,也可以通过图文表达语言。虽然声音和图文虽然形式不同,但都能承载相同的“含义”,并被人类理解。

人类的语言又可以细分为许多种,比如汉语、英语、日语等,人类以多种语言形式把“含义”传递给他人,可把语言定义为承载信息(“含义”)的媒介,并且语言可以有多种表现形式。

人类的语言又可以继续细分,比如数学语言,加号“+”表示求和,数值“5”表示数量为5,等号“=”表示计算结果或者两边的数值相等。“5”是数值,“+”

是计算方法,“=”是做比较或者求结果的方法,比如“5+3=8”这一个表达式由数值和方法组成,人们看到这个表达式就能理解其各个元素所承载的“含义”。

数值除了整数之外,还有分数、复数等;方法除了“+”“=”,还有“*”“/”“<”“>=”、微积分、正余弦等。以数学为例,我们可把数学语言定义如下:数学是用计算方法处理数值的语言。

人类发明了数学语言,规定了语言规则,以便于用数学语言解决实际问题,实现的过程便是用数学方法处理数值。

计算机语言也是语言的一种,它也承载了人类所要表达的“含义”,计算机语言类似于数学语言,它也是用一定的方法处理数据,因此,数据和处理数据的方法便组成了计算机语言。数据和方法是人类为计算机语言制定的规则。

可以把一定的数据和方法封装成一个整体,这个整体在计算机语言里称为对象。

比如洗衣机。为了便于理解,可以把洗衣机看作由“30分钟”和“搓洗”两个元素封装在一起的对象,“30 分钟”是数据,“搓洗”是方法。洗衣机被使用时,便会自动搓洗30分钟。当然,时间也可以修改,可以修改成40分钟或者60分钟等。因此,在使用洗衣机这个对象时,如果不设置时间,就会按默认值30分钟搓洗;如果设置时间,就会按新设置的时间搓洗。有的洗衣机可能不支持设置其他时间,只能按照默认时间搓洗。

时间又称为洗衣机这一对象的属性,对象的属性可能支持修改,也可能不支持修改,有的对象可能没有默认属性,有的对象可能只有默认属性却没有方法。

目前高级的计算机语言几乎都支持面向对象编程,由于某一类或某几类数据有一些共同的属性及共同的方法,便可把这类数据的共同属性和方法封装在一起形成一个对象,以后处理此类数据时调用对象即可,而不用编写重复的代码。这大大方便了编程工作。对象的概念在“类”的定义部分会再做介绍。

Python也是一种面向对象的高级计算机语言,Python有丰富的第三方库,使Python的生态遍及各种应用领域,只用少量的代码就能实现复杂的功能,也便于我们实现期货量化交易。

本书并没有深入介绍Python相关的内容,只是介绍读者需要了解的Python基础内容,这些内容在量化交易中会被用到,这些基础内容可以通过查阅Python资料进行更深入的学习。本书所有相关代码是在Windows 10系统下实现的。

Python有两个发行版本可以选择,一个是从Python官网下载的版本,该版本只有原生的Python,另一个是从Anaconda官网下载的版本,该版本集成了许多第三方科学计算库。Python原生版比较轻量化,并可以按需安装第三方库。如果不想自己筛选第三方库,则可以安装Anaconda版本,其集成了大部分做量化时会用到的第三方库。

具体安装方法可查看与Python环境安装有关的资料,这里只说明安装需要注意的事项,安装前最好先关闭电脑管家、杀毒软件等软件,防止安装进程被阻塞。以下是一些注意事项。

代码如下:

pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

这样就会通过清华源安装pyqt5库。用pip list可查看当前已安装的第三方库。

Python常用的编辑器有pycharm、vscode、Spyder、wing等,有的编辑器对Python异步协程库asyncio支持得还不是很好,推荐使用pycharm或vscode。本书采用的是vscode,它具有免费、简单、易用等特点。

交互式过程可用Windows系统自带的cmd或者PowerShell。例如,在cmd里输入python即可进入Python解释器,提示符“>>>”表示此处等待输入,输入“1+2”,按Enter键即会输出计算结果3,详情如下:

Microsoft Windows [版本6.1.7601] 
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>python
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information. 
>>> 1+2
3
>>>

因为在学习Python的时候需要随时和控制台交互,所以要先引入输入、输出语句,基本的输入、输出语句分别是input()print()

input()用来从控制台接收数据,接收到的数据会保存成字符串,例如,a=input('请在此输入内容并按Enter键:'),其中“请在此输入内容并按Enter键:”是提示信息,提示我们要做什么,执行该语句后控制台等待输入内容,输入“456abc”后按Enter键确认,代码如下:

>>> a=input('请在此输入内容并按Enter键:') 
 请在此输入内容并按Enter键:456abc
>>>

如果没有输入内容就直接按Enter键,则接收到的是空字符串。

print()用来向控制台输出内容,例如,print(a),执行该语句会在控制台输出a的值,代码如下:

>>> print(a) 
456abc
>>>

print函数的形式为print(*values: object, sep: Optional[Text]=..., end: Optional[Text]=..., file: Optional[_Writer]=..., flush: bool=...)

其常用形式为print(*values, sep=' ', end='\n')。其中,参数*values是需要输出的信息,*表示value数量是不固定的,多个value以英文逗号“,”隔开。参数sep是多个value在输出后的分隔符,默认以一个空格分隔。参数end是values全部输出完的结束符,默认以换行符结束。

代码如下:

想了解关于输入/输出更详尽的用法,可查阅Python相关资料。input()和print()是Python的内置函数,有关函数的概念会在第3章介绍。

Python的语句用换行表示语句的结束,但在语句后面加上英文分号“;”并不会报错,且英文分号可以作为语句分隔符,可以把多条语句写在同一行并用英文分号隔开。

有些以英文冒号“:”引导的语句可组成语句块,语句块的语句层次采用缩进的形式,同一级的语句缩进量要相同,缩进符号也要保持一致。按照Python编程规范,采用缩进四个空格的形式。

如果缩进语句块中只有一条语句,也可以写在英文冒号“:”之后。如果一条语句过长,可以用反斜杠“\”断开,将后续内容写在下一行,“\”之后不能有任何字符也不能有单行注释。对于各种括号,如( )、[ ]、{ }中的内容也可以写在多行,因为括号表示其中的内容是一个整体。

单行注释以#开头,Python在执行时会自动忽略#后面的内容。

多行注释用一对英文三单引号或一对英文三双引号包起来,多行注释不同于单行注释,其本身是一个字符串常量,是一个可执行语句,多行注释第一个英文三单引号或三双引号的缩进量要与其所在语句层次保持一致,否则会出现缩进错误。多行注释主要在函数或类的开头部分作为函数或类的解释说明,后面讲到函数的时候会再继续讲。

标识符是Python语言中用来表示对象的符号,主要用来作为变量名、函数名、类名等,标识符用下画线或者英文字母开头,其后可跟随下画线、数字或其他非空字符。标识符是大小写敏感的,并且标识符不能与Python内建的关键字同名。

一条语句也是一个表达式,表达式通常由对象和运算符组成。

在Python中,除了运算符和关键字,其他的皆是对象,对象既有属性也有方法。对象是Python语言的核心概念,想了解更深入的解析,可查阅Python相关资料。

变量在Python中的含义是对象引用,类似于一个标签,可以贴到各种类型的对象上,当被贴到了某个对象上,在使用该变量时便会使用该对象的值,因此在定义变量时不需要先声明变量的类型再给变量赋值。

“=”操作符在Python中表示把对象引用和内存中的对象进行绑定,“=”左边是对象引用,右边是对象。当右边的对象在内存中已经存在时,“=”直接将对象引用和对象绑定;当对象不存在时,“=”会先在内存中创建对象,再将对象和对象引用进行绑定。

本书会把对象引用和变量混用,不影响对内容的理解,“=”操作符称作赋值操作符,表示把右边的对象赋值给左边的变量,其深层含义可查阅Python相关资料。

a=3,该语句便定义了一个值为3的变量“a”,定义变量的过程也是给变量赋值的过程。同一个变量名可以被多次赋值,给变量重新赋值就是把变量与新的对象绑定。当变量被使用时,获取的是最新一次的赋值,而更早创建的对象若没有了变量绑定,会被Python的垃圾回收机制清理,不会继续占用内存。

变量只在其作用域中有效,不同作用域的变量即便名称相同,也不是同一个变量,作用域的概念会在函数部分更详细地介绍。

如表1-1所示,常用的数值运算符和数学里的运算含义是一样的,如2+3结果是5,4/10结果是0.4,%是取余运算符,5%3结果是2,//是取整运算符,5//3结果是1,**是乘方运算符,2**3结果是8。

表1-1

常用数值运算符

释义

**

乘方运算

//

取整运算

%

取余运算

/

除法运算

*

乘法运算

减法运算

+

加法运算

如表1-2所示,比较运算符也和数学里的含义相同,运算的结果是真或假,即True或False。

表1-2

比较运算符

释义

==

相等

!=

不等

>

大于

<

小于

>=

大于等于

<=

小于等于

在Python中,比较运算符可以连接使用,比如1<2<3==6,运算的结果为False,因为3不等于6。

如表1-3所示,not运算的对象只有一个,又称为一元运算符,表示对象的反面,非真为假,非假为真,其运算结果是TrueFalse

and运算符两边对象有一个为假,结果即假,且结果是第一个假值。当第一个值为假时,不再计算第二个值;当两边对象都为真,则结果为真,且结果是第二个真值,即需要计算第二个值并返回第二个值。

or运算符两边对象有一个为真,则结果即真,且结果是第一个真值。第一个为真时不再计算第二个值;当两边对象都为假,则结果为假,且结果是第二个假值,即需要计算第二个值并返回第二个值。

andor运算符返回的是决定了最终结果的对象值。

表1-3

逻辑运算符

释义

not

and

or

关系运算符是逻辑运算符的一种,其运算结果也是TrueFalse

如表1-4所示,isis not又被称为身份运算符,判断运算符两边是否为同一个内存地址,与==和!=不同,==和!=只是判断两边的值是否相等,值相等但可能处在不同的内存地址。量化交易中通常只比较值的大小,因此用==和!=即可,必须比较内存地址时才需选择isis not

innot in又称为成员运算符,用于判断一个对象是否在一个集合对象中,比如在多品种交易中,判断一个品种是否在需要交易的品种集合中。

表1-4

关系运算符

释义

is

is not

不是

in

在其中

not in

不在其中

如表1-5所示,运算符优先级从上到下依次降低,当一个表达式有多个运算符时,先算优先级高的后算优先级低的。比如2*3+5 < 9 and 3==4,要先算乘法再算加法,然后再做数值比较,最后再做逻辑与运算,结果是False。

运算符的结合性就是当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符,先执行左边的叫左结合性,先执行右边的叫右结合性。比如3*5/4*和/的优先级相同,*和/都具有左结合性,因此先执行左边的除法,再执行右边的乘法,结果是3.75。

表1-5

释义

运算符

优先级

结合性

小括号

( )

19

索引运算符

x[i]x[i:j[:k]]

18

属性访问

x.attribute

17

乘方

**

16

按位取反

~

15

符号运算符

+(正号)、(负号)

14

乘除

*、/、//、%

13

加减

+ 、-

12

位移

>>、<<

11

按位与

&

10

按位异或

^

9

按位或

|

8

比较运算符

==、!=、>、>=、<、<=

7

身份运算符

is、is not

6

成员运算符

in、not in

5

逻辑非

not

4

逻辑与

and

3

逻辑或

or

2

逗号运算符

x,y

1

当表达式比较长又包含多种运算符时,为使运算顺序更清晰可用小括号划定顺序,小括号里的要优先运算,最内层的小括号优先运算。

运算符用来参与运算,关键字除了内置常量和运算符,其他的主要用来引导语句和创建对象,它们本身都是为了实现某个功能的“方法”,用一两个符号就能实现运算,要比写一段代码简洁很多。

可用以下方法查看Python内建关键字:

    import keyword
    print(keyword.kwlist)
    '''输出结果为:
    ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try','while', 'with', 'yield']
    '''

下面介绍一部分关键字的含义。

pass:占位符语句,表示什么都不用做,暂时留出语句位置,Python 3中的省略号也有类似效果。

break:立即结束其所在语句层的whilefor循环。

continue:立即结束其所在语句层的当前whilefor循环,并进入下一次循环。

del:del var用于删除变量,del var[i]用于删除元素,del var.attribute用于删除属性。

def:创建函数对象,并赋值给函数名。

lambda:创建匿名函数。

return:结束函数,并返回一个值,默认返回None值,多个值以元组形式返回。

global:声明整个程序的全局变量,无论变量是否已赋值或已存在,由global声明的变量都作为全局变量使用。

nonlocal:声明嵌套函数的局部变量,无论变量是否已赋值或已存在,由nonlocal声明的变量都作为整个函数的局部变量使用。

yield:用在函数中,定义一个生成器函数。

class:创建类对象,并赋值给类变量。

import:导入模块。

from:import组合使用,从模块中导入常量、函数或类。

as:为对象重新命名。

with:上下文管理,当语句执行完会关闭其中的对象。

Python在执行时会自动忽略空格。Python语句的执行流程可分为三种情形:一是按顺序执行,二是按条件选择执行,三是循环执行。

通常,Python是按顺序从上到下,一行一行地执行语句,在执行到某个语句块时可能有选择地执行语句块里的语句,也可能循环执行语句块里的语句。如下一段代码是常见的语句结构:

a=1
b=2
c=3
d=10
if a>1:
    a=6
elif b is 2:
    b=5
elif not c:
    c=4
else:
    c=False

for i in range(10):
    if i <=b:
        continue
    else :break
else:d=20

while d > 0:
    d -= 1
    if d >5:
        continue
    else:break
else:
    d=11

对于上面的代码,Python从上到下,一行一行按顺序执行。当执行到第5行时,遇到条件语句块,在条件语句块中先执行条件判断。当条件为假时,忽略条件内的语句继续判断下一个条件;当条件为真时,执行条件内的语句,对之后的条件不再检验,直接结束条件语句块继续往下执行。当执行到循环语句块时,循环执行语句块里的内容。下面详细介绍条件语句和循环语句。

if语句的结构如下:

if条件1:
    表达式
elif条件2:
    表达式
elif条件3:
    表达式
else:
    pass

if语句块除了第一个条件用if引导,后面的条件都用elif引导。在执行时会逐条检查条件是否为真,当遇到条件为真时,执行该条件下的语句,然后结束if语句块,不再检查后续的条件。如果条件都为假,则执行else下的语句,else语句并不是必需的。当只有一个条件时,也可以只用if引导。关键字pass表示略过,常用来预留语句位置留待以后加入需要执行的语句,用缩进表示else是一个完整的语句块,只是当语句块里目前不需要做什么。

for循环的结构如下:

for i in可迭代对象:
    if条件:
        continue
    else :break
else:表达式

for循环与其他编程语言不同,会循环遍历某个可迭代对象。可迭代对象可以是一个序列对象,其中的元素具有某个唯一属性,比如元素所在的位置序号不同,或者元素所在的键不同,可以通过元素的属性依次选取元素,当for循环执行时会逐一按元素的属性遍历。可迭代对象也可以是一个迭代器,迭代器在每次循环(调用)时生成一个数据用于运算,迭代器一次只生成一个数据,可减少内存的占用。可迭代对象和迭代器会在第5章详细介绍。

continue是Python的内置关键字,当执行continue语句时,会忽略后续语句,再次开启新的循环。break也是Python的内置关键字,当执行break时,会跳出循环体,结束循环。当循环全部遍历完,正常结束时会执行else后的语句;若被break提前结束,则不会执行else后面的语句。

while循环的结构如下:

while条件1:
    修改条件1
    if条件2:
        continue
    else:break
else:
    d=11

while循环和其他编程语言类似,当条件为真时,执行语句块。但要注意在语句块中加入修改条件的语句,以使条件变为假,否则就会一直循环,形成死循环。

continuebreakelse语句与for循环中的类似,含义也是一样,当循环不是被break结束时会执行else语句。

语言是信息的载体,语言有着明确的规则才能准确传递信息。本章由计算机语言和自然语言的关系引出Python语言,Python语言也有自己的语法规则,例如,变量命名、注释语句、表达式语句及语句执行的顺序等。了解了Python语法的规则,我们就可以编写Python程序了,但在编写程序时还会用到各种各样的数据,下一章将介绍Python常用的数据类型。


Python解释器在启动时会创建None、True、False三个常量,None表示“无”,True表示“真”,False表示“假”。

None是NoneType类型的唯一值,表示缺少值或空值,例如,当函数没有返回值时会默认返回None值。

因为Python用“有”和“无”来表示“真”和“假”,“有”为真,“无”为假,所以None、0、空字符串、空列表、空字典都是假,非“空”数据则为真。

True和False是bool类型的值,True和False除了表示真和假,其本身也有值,True的值为1,False的值为0,可以与数值做计算。例如,5+True结果为6,3*False结果为0,1==True结果为True,1 is True结果为False,以上示例说明True的值为1,但True在内存中的地址和整数1的地址不同。

None、True、False这三个常量在量化策略中会经常用到。还有Ellipsis常量与省略号的字面含义相同,常用在注释当中。

在计算交易手数时需要用到整型,如1、2、3、4。

Python可以直接用整数进行计算,当在Python代码中输入整数数值时,Python会自动把输入的数值创建为整型。

当然,你也可以用整型类int()创建整数,给整型类int()传递数值参数,int()便会把数值参数转换为整型。例如,int(5.89)的结果是5,转换时只保留了整数部分;int('123')的结果是123,把字符串类型转换成了整数类型。

我们可能需要从本地文件中读取数据,比如保存在本地的成交数据,所读取的数据通常是字符串类型,要把字符串类型转换成整型才能参与相关计算。

整型可以是正数也可以是负数,如3和−3。在量化策略中可定义净持仓pos=3,表示净多头3手;定义pos= -3,表示净空头3手。

价格、保证金等属于浮点型数值,浮点型数值是带有小数点的小数。

类似于整型,Python可以直接用浮点型数值计算,也可以用浮点型类float()创建浮点型数值。例如,float(5)结果是5.0,在转换整数时增加了一个小数位;float('5.999')结果是5.999,把字符串转换成了浮点型数值。

整型和浮点型相加减,结果会转换成浮点型。如果在计算中想要保留两位小数,可以用round()函数,例如,a=5.946326598round(a,2)结果是5.95,经过四舍五入之后保留两位小数。

字符串是由一对英文单引号、一对英文双引号、一对英文三单引号或一对英文三双引号包围的字符,交易品种、账号、密码等都是字符串类型。例如,'账号'"123456"'''密码'''"""jkl"""都是合法的字符串。

字符串是序列类型的数据,字符串的字符有位置(索引)属性,从左到右字符的位置序号为0、1、2、3、4、5、6……从右到左的位置序号为−1、−2、−3、−4、−5、−6……

通常,字符串用一对英文单引号或一对英文双引号定义,英文三单引号或三双引号则用于多行注释。

如果一个字符串里需要有英文单引号,则应用英文双引号定义;如果一个字符串里需要有英文双引号,则应用英文单引号定义。此时的英文单引号和双引号为字符,而不是字符串的标识,例如,"ad'cd"'ef"gh',英文双引号或单引号组成一对,成为字符串的标识,字符串中的引号则作为字符以有别于字符串标识,不会出现“含义”冲突。

字符串中可以有空格,因为空格也是字符。Python用“有”和“无”来表示“真”和“假”,没有任何字符的字符串为假,有字符的字符串为真。例如,“没有字符,为假;”有空格字符,为真。

Python可以直接处理代码中的字符串,把字符串创建在内存中并保存为字符串类型,也可以用字符串类str()创建字符串。例如,str(123)结果为'123',把数值123转换成了字符串'123'

如果要在字符串中包含控制字符或有特殊含义的字符,就需要使用转义字符,常用的转义字符如表2-1所示。

表2-1

常用转义字符

描述

\n

换行

\r

按Enter键

\r\n

按Enter键 + 换行

\t

制表符(Tab)

\

反斜杠(\)

\'

单引号字符串中的单引号

\"

双引号字符串中的双引号

例如,print("abc\"de")输出abc"de,中间的英文双引号被\转义成字符,不会再与第一个英文双引号组成字符串标识。

当在字符串前加上r或R,此时字符串为原始字符串,字符串中的“\”便不再是转义字符,而是“\”本身。但字符串的最后一个字符不能是“\”,原始字符串主要用在文件路径中。

代码如下:

>>> print(r'C:\new\T0002\export\MA.csv')
C:\new\T0002\export\MA.csv

>>> print(r'C:\new\T0002\export\')
  File "<stdin>", line 1
    print(r'C:\new\T0002\export\')
                                 ^
SyntaxError: EOL while scanning string literal

Python语言有许多的结构数据类型,最常用的有列表、元组、字典,列表和元组是序列类型,它们的元素有位置(索引)属性,而字典是集合类型,其元素没有位置属性。

列表是以方括号“[ ]”包围的数据集合,不同元素间以英文逗号“,”隔开,列表的元素可以是任意数据类型,也可以是列表,例如,[1][1,][1, 2, 'a', [1,3], 'bcd']都是合法的列表。

列表的元素有位置属性,从左到右元素的位置序号为0、1、2、3、4、5、6……从右到左的位置序号为−1、−2、−3、−4、−5、−6……

Python可以直接处理代码中的列表,Python会自动创建列表,也可以用列表类list()创建列表。例如,a=list()创建空列表,给list()传递的参数必须是可迭代的,list()会按照参数的元素创建列表。例如,list('adffgghjj')结果是['a', 'd', 'f', 'f', 'g', 'g', 'h', 'j', 'j'],字符串的每个字符被创建为列表的元素。

列表是可变的数据类型,对列表中的元素进行修改时会直接修改原列表,而不是生成一个新列表。

元组可看成特殊的列表,元组是以小括号“( )”包围的数据集合,不同元素间以英文逗号“,”隔开,元组的元素可以是任意数据类型,也可以是元组,例如,(1,)(1, 2, 'a', (1,3), 'bcd')都是合法的元组。当元组的元素只有一个时也不能省略英文逗号,否则小括号便不是元组的标识,而是语句运算,例如,(1,)是元组,而(1)则是数值1。

同列表一样,元组的元素有位置属性,元素从左到右的位置序号为0、1、2、3、4、5、6……从右到左的位置序号为−1、−2、−3、−4、−5、−6……

Python可以直接处理代码中的元组,Python也会把以英文逗号隔开的对象创建为元组,代码如下:

>>> 1,2,3,4,5
(1, 2, 3, 4, 5)

Python也可以用元组类tuple()创建元组,例如,a=tuple()创建空元组,给tuple()传递的参数必须是可迭代的。tuple()会按照参数的元素创建元组,例如,tuple(['a', 'd', 'f', 'f', 'g'])的结果是('a', 'd', 'f', 'f', 'g'),把列表转换成了元组。

元组是不可变数据类型,对元组中的元素进行修改会创建一个新的元组,而不是直接修改原来的元组。若需要创建一组不可变的数据对象,可用元组创建。

元组主要用在变量定义中,代码如下:

>>> a,b,c=1,2,3
>>> a;b;c
1
2
3

在上述代码中,等号右边的“1,2,3”是元组,Python会自动按位置顺序把1赋值给a,把2赋值给b,把3赋值给c

字典是以大括号“{ }”包围起来的数据集合,数据以“键:值”对的形式存在,“值”可以是任意类型的数据,但“键”必须是不可变数据。不可变数据又称为可哈希的数据,可哈希数据具有唯一性,能产生唯一映射关系,因此,字典中元素的“键”都是不同的,可以通过“键”来访问字典中的元素。例如,{'a':1,'b':2,3:'c'}{'a':1,'b':2,c:[1,2]}都是合法的字典。

Python可以直接处理代码中的字典,也可以用字典类dict()创建字典,因为字典的元素是以“键:值”对的形式存在,所以传给dict()的参数应是关键字形式,代码如下:

>>> dict(h=1,i=2,j=3,k=4)
{'h': 1, 'i': 2, 'j': 3, 'k': 4}

字典是集合类型,因此字典中的元素没有位置属性,元素是无序的,可以通过元素的键访问元素,不能通过位置访问元素。字典是可变的数据类型,修改元素的值或增删元素会直接改变原字典。

本章介绍了Python常用的数据类型,也是期货量化交易中常用的数据类型。例如,交易手数是整型,价格是浮点型,交易账号和密码是字符串型,多品种一般以列表表示,业务数据一般是字典类型,等等。

我们在编写的程序中可能需要对某段代码重复使用,如果每次使用代码都重新编写,那么效率会比较低,因此需要有新的语法规则能以更简洁的方式重用代码,下一章介绍的函数式编程便是代码重用的方式之一。


相关图书

Rust游戏开发实战
Rust游戏开发实战
仓颉编程快速上手
仓颉编程快速上手
深入浅出Go语言编程从原理解析到实战进阶
深入浅出Go语言编程从原理解析到实战进阶
JUnit实战(第3版)
JUnit实战(第3版)
Go语言编程指南
Go语言编程指南
Scala速学版(第3版)
Scala速学版(第3版)

相关文章

相关课程