image.png
Python初探
近年来,量化投资日渐盛行,听上去是有些高大上的感觉,但入门后又会发现,其实量化投资并没有太多高深难懂的玄机,不过是为投资者提供了一套,将投资想法与实践相结合的便捷工具而已。
做量化投资,目前最流行的编程语言非Python莫属。相对于商用软件Matlab,Python不仅可免费使用,而且具有非常多的、功能强大的扩展库,对于非计算机专业的投资者来说,相对优势非常明显。
配置运行环境
要运行Python,首先要去https://www.python.org/download/ 下载安装。网站上有2.7.x和3.6.x两个系列的版本,做金融分析目前用2.7就好,对各种库的兼容会好些。
由于后面还需要安装Numpy、Pandas等库用于金融数据分析,有个简便的环境配置方法,就是安装Canopy或者Anaconda。这两个集成安装软件能方便我们对各种库进行管理。下面我们以Anoconda为例进行展开。
Anaconda是一个用于科学计算的Python发行版,支持Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的Python包。其安装包如果直接从官网上下载,速度会非常慢,幸好清华大学开源软件镜像站上可以下载到。跳转过去点这里
下载好后,点几次“下一步”就安装完成了。
Python基础知识
万物皆对象
对象与变量是编程活动最基本的处理单元,在Python中,可以说万物皆为对象。对象的类型有很多,比如整数、浮点数、字符串、列表、元组、字典、集合等,甚至连函数、模块等都可以作为对象,为其赋予变量的标签。
对于每个对象,可从三个纬度进行描述,分别是地址、类型和值。举个例子:
关于对象“8"
查看对象“8”的值
In [1]:8
Out[1]:8
查看对象“8”的内存地址
In [2]:id(8)
Out[2]:31684784L
查看对象“8”的类型
In [3]:type(8)
Out[3]:Int
变量贴标签
在Python中,等号“=”并不是数学意义上的等号,而是赋值的意思。比如说:
In [4]:a=8
print a
8
a=8意味着将对象“8”的值赋给变量a,然后“打印”a的结果就是整数8。对象属于常量,是不可变的,而变量则不然,可以在程序的运行过程中不断被赋予新的值。比如说:
In [5]:a=8
a=10
a
Out[5]:10
数字的类型
关于对象的类型,可用内置函数type()进行查看。仅对数字而言,其类型主要有5种,分别是整数型Int、长整型Long、浮点型Float、布尔型Bool(判断真假1为真0为假)以及复数型Complex。比如说:
整数型Int
长整型Long
浮点型Float
布尔型Bool
复数型Complex
1
888888888888L
1.02
True
4+3j
-1
323242343L
4.3
False
-2+9j
三种引号
“”和‘’都可以括住字符串,但当一个句子中含有引号,则需要分别用“”和‘’来做区分,方便Python识别。例如先要输出this is an “apple”.,就需要输入print 'this is an “apple”.'
当需要输出多行字符串时,可用三引号进行头尾标注,例如:
In [6]:a='''you
are
beautiful'''
print a
you
are
beautiful
转义符
转义符用斜杠“\”表示,用于消除字符本身的含义。例如要输出It's an apple.,不能直接打print 'It's an apple.', 而是需要在句子中的’前加上一个\。
In [7]:print 'It\'s an apple.'
It's an apple.
自然字符串
通过在字符串前面加上r或R,即可将字符串的内容原封不动地输出,即使内部含有命令语句,Python也不会执行。比如说可以用\n来进行换行,若输入print 'It's an apple. \n',程序输出的结果便是It's an apple. \n。
字符串格式变换
将字符串变成大写,用upper()函数。但是,由于字符串不可变,即使用了upper()函数,a也还是那个a,唯有将a.upper()赋予一个新的变量b,才能将其显示。
In [8]:a="Hello world"
b=a.upper()
print a
print b
Hello world
HELLO WORLD
函数istitle()可判断字符串中所有首字母是否为大写,其他字母为小写,若是则返回True,否则为False。
函数isupper() 可判断字符串中所有字母是否为大写,若是则返回True,否则为False。
按字母将字符串分割为列表,用split("")函数。
关于切片,若要选取字符串中某一个字母,可以用a[0]这种格式。0代表第一个字母,如此类推。跟Java的表示方式一样。倒选也可以,最后一个字母是a[-1],倒数第二个字母是a[-2]。
值得注意的是,如果要抽取多个字母,如2个字母,则需写成a[0:2],到2结束,不包括2,Python列表、元组、字符串等都是包前不包后的!
想偷懒的话,0可不写,默认是从0开始,或到最后结束。a[:2]相当于a[0:2],a[-2:]则表示最后两个字母。
另外,还可以用循环结构跳着切,比如:
In [9]:a="beautiful"
[a[i] for i in (1,4,8)]
Out[9]:['e', 't', 'l']
字符串可用运算符,比如“+”则表示两个字符串的连结,又比如要打印“Hello world”10遍,则可用“*”号:
In [10]: print "Hello world\n" *10
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
但要注意,不同类型的字符串不能相加,会导致Python报错。如果需要将整数型数字和字符串连结起来,则可以用str()函数将数字变成字符串的类型,再进行连结。也可以在print的时候用反引号``将数字变量变为字符串变量。
关于列表
列表用[]来表示,里面可以有序地放一堆东西。每个单独项称作元素,元素加起来就是数组,存储一连串元素的容器就是列表。
查看列表序列的长度可以用len()函数,比如:
In[11]:a=['apple', 'banana', 'orange']
len(a)
Out[11]:3
列表的内容是可变的,也就是说列表中的元素可通过赋值来实现替换。一旦作出修改,原来的列表就不复存在,只剩下修改后的新列表了。
In [12]:a=['apple', 'banana', 'orange']
a[0]='boat'
print a
['boat', 'banana', 'orange']
列表的函数
作为最基本的数据结构,我们可以用函数对列表进行处理。当忘记函数具体名称的时候,可以输入list.+tab键进行查询。
若要追加元素进列表,可使用list.append(x), 将x追加进list中。比如:
In [13]:a=['apple', 'banana', 'orange']
print a
a.append('strawberry')
print a
['apple', 'banana', 'orange']
['apple', 'banana', 'orange', 'strawberry']
若追加的不仅仅是一个元素,而是一个列表,则可以用list.append(x)或者list.extend(x)。两者的区别在于,append是整个x列表作为一个新元素追加进原列表中,而extend则是将x列表中的元素逐个加入到原列表中。
若要计算元素出现的频率,则可用list.count(x)函数
若要删除某个元素,则可用list.remove(x)函数。当使用此函数时,Python仅会删除第一x,后面的x则保留。
若要对列表的元素进行排序,则用list.sort()函数,默认从小到大排列。若要从大到小排列,则用list.sort(reverse=true)函数。若列表的元素是字符串,也能用此函数进行排序,排序的规则是字符串的字母顺序。
关于元组
与列表的用途类似,列表用[]表示,而元组用()表示。两者的区别在于列表可修改,而元组一旦设立就只能读取。目的是防止用户乱改源代码的内容。
关于集合
集合可以用作运算,求交集,求并集,求差集等。我们可以用set()函数将列表变成集合,比如:
In [14]:a=['apple', 'banana', 'orange']
set(a)
Out[14]:{'apple', 'banana', 'orange'}
也可以用list()函数把集合变回列表,比如:
In [15]:a={'apple', 'banana', 'orange'}
a=list(set(a))
a.sort()
a
Out[15]:['apple', 'banana', 'orange']
集合的运算非常便捷,比如说去重:
In [16]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
print a
set(['orange', 'banana', 'apple'])
比如说求交集,可用“&”表示:
In [17]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a&b
print c
set(['banana', 'apple'])
比如说求并集,可用“|”表示:
In [18]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a|b
print c
set(['watermalon', 'apple', 'orange', 'banana'])
比如说求差集,可用“-”表示:
In [19]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a-b
print c
set(['orange'])
关于字典
想想新华字典,查找到某个字,然后后面就会有该字的内涵解释。Python的字典亦是如此,我们用大括号将字典的内容括起来,然后字典内部的每个元素都有两个部分组成,一个是字,一个是内涵解释。正式的叫法是一个key,一个value。
再打个比方,有本字典包含了身份证上的所有信息,包括姓名、性别、出生年月、地址。若我们想调取某一元素的信息,只需print key的值即可,表现形式如下:
In [20]:a={"姓名":"张三",'性别':'男','出身年月':'1999/01/01','地址':'火星'}
print a['姓名']
张三
要往字典里添加信息也很方便,直接定义即可:
In [21]:a={"name":"Zhangsan",'gender':'male','DOB':'1999/01/01','address':'Mars'}
a['id number']=123456789
print a
{'DOB': '1999/01/01', 'gender': 'male', 'id number': 123456789, 'name': 'Zhangsan', 'address': 'Mars'}
查看一下字典里有什么key,可用dict.keys()函数。
查看一下字典里有什么value,可用dict.values()函数。
若要删除某个key,则可用dict.pop('key')函数,删除后该函数会返回已被删除的value值。
结语
以上便是Python的入门知识。虽然目前看来,上述内容与金融数据分析还没出现明显的关系,但掌握好这些基础知识,日后写代码或阅读代码时才能有效提高效率。
第一篇文章就写到这里,下一篇将会讲述Python的运算方式,敬请期待。
刺猬偷腥
2017年9月22日
to be continued.