q.datayes.com
接下来要给大家介绍的系列中包含了Python在量化金融中运用最广泛的几个Library:
numpy
scipy
pandas
matplotlib
会给初学者一一介绍
NumPy 简介
一、NumPy是什么?
量化分析的工作涉及到大量的数值运算,一个高效方便的科学计算工具是必不可少的。Python语言一开始并不是设计为科学计算使用的语言,随着越来越多的人发现Python的易用性,逐渐出现了关于Python的大量外部扩展,NumPy (NumericPython)就是其中之一。NumPy提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算,极大地便利了人们在科学计算方面的工作。另一方面,Python是免费,相比于花费高额的费用使用Matlab,NumPy的出现使Python得到了更多人的青睐。
我们可以简单看一下如何开始使用NumPy:
1
import numpy
2
numpy.version.full_version
'1.8.0'
我们使用了"import"命令导入了NumPy,并使用numpy.version.full_version查出了量化实验室里使用的NumPy版本为1.8.0。在往后的介绍中,我们将大量使用NumPy中的函数,每次都添加numpy在函数前作为前缀比较费劲,在之前的介绍中,我们提及了引入外部扩展模块时的小技巧,可以使用"from numpyimport *"解决这一问题。
那么问题解决了?慢!Python的外部扩展成千上万,在使用中很可能会import好几个外部扩展模块,如果某个模块包含的属性和方法与另一个模块同名,就必须使用import module来避免名字的冲突。即所谓的名字空间(namespace)混淆了,所以这前缀最好还是带上。
那有没有简单的办法呢?有的,我们可以在import扩展模块时添加模块在程序中的别名,调用时就不必写成全名了,例如,我们使用"np"作为别名并调用version.full_version函数:
1
import numpy as np
2
np.version.full_version
'1.8.0'
二、初窥NumPy对象:数组
NumPy中的基本对象是同类型的多维数组(homogeneous multidimensional array),这和C++中的数组是一致的,例如字符型和数值型就不可共存于同一个数组中。先上例子:
1
a = np.arange(20)
这里我们生成了一个一维数组a,从0开始,步长为1,长度为20。Python中的计数是从0开始的,R和Matlab的使用者需要小心。可以使用print查看:
1
print a
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1819]
我们可以通过"type"函数查看a的类型,这里显示a是一个array:
1
type(a)
numpy.ndarray
通过函数"reshape",我们可以重新构造一下这个数组,例如,我们可以构造一个4*5的二维数组,其中"reshape"的参数表示各维度的大小,且按各维顺序排列(两维时就是按行排列,这和R中按列是不同的):
1
a = a.reshape(4, 5)
2
print a
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
构造更高维的也没问题:
1
a = a.reshape(2, 2, 5)
2
print a
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]]
[[10 11 12 13 14]
[15 16 17 18 19]]]
既然a是array,我们还可以调用array的函数进一步查看a的相关属性:"ndim"查看维度;"shape"查看各维度的大小;"size"查看全部的元素个数,等于各维度大小的乘积;"dtype"可查看元素类型;"dsize"查看元素占位(bytes)大小。
1
a.ndim
3
1
a.shape
(2, 2, 5)
1
a.size
20
1
a.dtype
dtype('int64')
三、创建数组
数组的创建可通过转换列表实现,高维数组可通过转换嵌套列表实现:
1
raw = [0,1,2,3,4]
2
a = np.array(raw)
3
a
array([0, 1, 2, 3,4])
1
raw = [[0,1,2,3,4], [5,6,7,8,9]]
2
b = np.array(raw)
3
b
array([[0, 1, 2,3, 4],
[5, 6, 7, 8, 9]])
一些特殊的数组有特别定制的命令生成,如4*5的全零矩阵:
1
d = (4, 5)
2
np.zeros(d)
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
默认生成的类型是浮点型,可以通过指定类型改为整型:
1
d = (4, 5)
2
np.ones(d, dtype=int)
array([[1, 1, 1,1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
[0, 1)区间的随机数数组:
1
np.random.rand(5)
array([0.93807818, 0.45307847, 0.90732828, 0.36099623, 0.71981451])
由于论坛篇幅限制,全文请访问 q.datayes.com