【本文比较长,有4000多字和大量配图,并且需要实际操作,建议在电脑端打开】
前面,我们讲了为什么要做量化交易,什么是量化交易,以及量化交易的解决方案。作为一个屌丝,这里我们选择开源(Bu Yao QIan)的解决方案:VN.PY来开始我们的量化交易旅程。然而要想使用VN.PY你得懂一点Python,不用太多,一点就好。
在之前和很多搞金融的同学交流的时候,很多人都是因为觉得要花上几个月学编程,所以打消了对量化的兴趣。
其实是姿势不对,我们不是必须把编程学的很溜才能搞量化,我们只要“会一点点”就可以了,这才是快速入门量化的正确方法。
所以,今天给大家带来一个3小时快速入门Python的教程。
在这里声明,这篇文章目的是为了让没有编程经验的同学,能够快速入门,所以内容是最小知识集(真的不用懂太多)。按照本文边看边做,3个小时内肯定能够学会Python的基础编程。
有Coding基础的同学,本文可以略过。请出门右转到京东购买《Python金融大数据分析》,学习进阶内容。
一、Python是什么?
Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合网页编程的JavaScript语言等等,Python就是其中一种。
Python的优势,一是容易上手,二是完成同一个工作,编写的代码量小。比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。
废话不多说,我们进入学习环节。
二、Python和Anaconda的安装和使用
要学习Python,你得先安装Python和对应的编辑器。这里有人已经帮我们做好了打包的软件,anaconda。只要装上这个,Python和对应的编辑器就都有了,还附带了很多进行科学计算的package,可谓是金融分析利器。
如果从国外官网下载会比较慢,这里推荐到清华镜像地址下载,你可以百度“anaconda 清华镜像”找到下载地址,或者在公众号后台回复“清华镜像”获得下载地址。
这里以Windows为例。为了便于后面安装VN.PY,我们下载4.0的32位版本,如下图:
安装完毕后,点击开始菜单在Anaconda里面找到,Jupyter NoteBook,点击打开后就能开始Python编程了。
我们可以进入桌面文件夹,建立自己的第一个Notebook文件,这样比较好找一点。
建立NoteBook后,就能看到我们的编程界面了:
到这里我们的工具就准备好了。
三、编程语言要学习的内容
一种编程语言的学习,入门的基本包括几个方面:
1、基本的类型,拿汽车来打比方,你可以理解为构成汽车的各个部件
2、各种容器,可以理解为能装很多东西的部件,就像汽车的后备箱
3、控制逻辑,可以理解为汽车的方向盘,用来控制程序的运行
4、函数,可以理解为把一连串经常要用的指令进行组合,这样我们不需要每次都重新写,只需要调用一个函数就可以了。
5、面向对象,可以理解为函数已经满足不了需求,通过对象可以把更多东西组合在一起,方便我们调用和他人理解。
四、Python的基本类型
Python的基本类型其实不多,也就是整数(int)、浮点数(float)、布尔值(bool)、字符串(str)这几种。Python是一种强类型语言,所以我们要注意对象的类型,可以使用type()函数来显示对象的类型。使用Jupyter NoteBook进行编程,显示如下:
基本类型是我们在Python中用来表述数据最小的颗粒度.
五、Python的容器
容器是用来记录数据的,Python中的常用容器有列表、集合、元组、字典。
1.列表
列表(list)是一种有序的容器,可以对元素进行增、删、改操作,例如:
2.集合
集合(set)是一种无序的而且元素不重复的容器。对上面的列表用set()做一个转化,会发现,之前重复的Lily没有了。
3.元组
元组(tuple)和list非常类似,但是tuple一旦初始化就不能修改。因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
4.字典
字典(dict)在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
大家可能对这些容器没有什么概念,但当你要存一个股票的N天收盘价时,你就会用到列表;当你要存股票名字和代码的对应关系的时候,你就会用到字典。容器就是我们用来装金融数据的篮子。
六、Python的控制逻辑
Python是通过缩进排版来组织代码逻辑的,通过Tab键或者空格代表缩进。
有相同所及的代码属于同一代码块,如果使用if、while、for、def或者class等关键字开始的代码行,要以冒号结束,并且其后所有代码缩进相同的量,直到这个代码片段结束。
1.条件判断
计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。
比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现:如果if判断是true ,则执行if下缩进的语句;如果if判断是False,就不执行if的内容,而去else下缩进的语句;此外可以用elif来加入多类别判断:
2.与、或、非
在Python中 逻辑运算符与、或、非是用and、or和not来代表的,这一点比较接近英文
3.for循环
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。for循环是我们编程常用的控制形式,他的流程如下图:
代码实例:
4.while循环
While循环是很重要的特别是很多回测框架,底层一定是有一个while循环来不断拿数据,然后送到回测代码中进行回测。
while循环是当条件为真时,就不断执行,直到条件为假为止,中间可以用 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环;
5.列表推导式
在我们看别人的量化代码时,有时候作者为了一些难以名状的目的,会使用列表推导式来写代码,把几行代码集合成一行,这会让很多新手摸不着头脑。在这里给大家举例讲解:
看到这样的代码,大家不要慌,认证的看几遍,一般都能看懂的。就是把循环、判断和赋值写在了一行里面。
七、函数
函数是我们为了避免编写重复代码,而采用的一种把某个代码片段复用的方式。
1 内置函数
Python为我们提供了很多的内置函数,比较常用的是求数组中的最大、最小值:
2 自定义函数
对于系统中没有提供的功能,我们自己自定义函数来实现:
3 lambda函数
针对一些比较简单的函数,没必要完整定义一个函数,这个时候我们可以用Lambda匿名函数直接定义,更加简洁:
八、面相对象
面向对象编程(Object Orient Programming,OOP),是把某些特征抽象出来,形成一个类。每个类一般包含的是:属性和操作属性的方法(或者叫函数)。thoPython中的类定义方式与其他语言差别不大,最大的特点是每个类方法的第一个参数都是以self开始,后面是其他参数。
Python中并没有访问控制,没有类似Java,C++中privatepublic的关键字来表明方法的类别,而是通过特定的属性和方法命名规则来达到这个效果。protect、private系统保留定义的规则如下:
1.任何以单下划线开头的名字都代表protect,比如self._5minBar、self._marketPoint;
2.任何以双下划线开头的名字都代表private,比如self.__init
3.任何以双下划线开头和结尾的名字,都代表系统保留,比如:__len__();
3.继承和多态
封装、继承和多态是面对象编程的三大特点。
怎么理解封装、继承和多态呢?
1)以买房为例,开发商们把各种配置、面积等特征浓缩成一个叫做“三室两厅”的通用类。这个过程就叫封装。
2)某个开发商在“三室两厅”的基础上,增加了“南北通透”这个特征,产生了“南北通透三室两厅”这个类。这个过程就叫继承。
3)当我们定义了多种“三室两厅”的子类,比如“临江大户型三室两厅”,“地铁上盖实用三室两厅”。当我们要做一个“看电视”的方法时,我们在“三室两厅”这个基础类别中定义好,然后在各种子类中进行实现。
多态在这个时候就会体现出它的好处,当我们确认它是“三室两厅”类型,我们不用管它具体哪一种“三室两厅”,我们都可以通过“看电视”这个方法来进行调用。而系统会识别这个房子具体是哪种“三室两厅”,然后调用自类中实现的方法。这就是多态的好处,调用放只管调用,不用管细节。
九、如何进行简单的程序调试
写完一段代码后,我们都需要对代码进行检查和调试,而调试的方法,最简单的分为两种,print和打断点。
1.print
当我们希望对某段代码进行检查时,我们可以把中间关键变量的值用print方法打印出来,比如说,在作CTA交易时我们会把交易的时间、头寸规模、标的都打印出来,进行检查。上面,在类的方法中,加入print语句,就是最简单的调试方法。
2.打断点
当我们碰到一些比较复杂的问题时,调试会非常棘手,用print已经很难完成,这个时候就需要用刀IDE的断点调试功能。让程序以单步的方式运行,检查可能存在问题的变量是否是正常数值,从而发现问题。目前对断点调试支持最好的室pycharm这个IDE。
1)我们需要在想检查的地方打上断点,然后点击Debug按钮
2)程序运行到我们打断点的地方会停住
3)我们可以查看在这个状态下各个变量的值是否正确
你能看到这里,说明是真的希望成为一名宽客。而且相信你对Python已经有了一定的认识。如果是没有经验的同学,一定要对照文章的代码,自己敲一遍,也花不了几十分钟,但这能让你能更有底气的说:“我会Python”(你已经有了一百行的代码量^_^)。本文就到这里,下篇开始正式进入量化交易系统部分,敬请期待。