前言正如我前面所讲,量化交易背后是有着一套严谨计算的过程的。我们进行量化交易时,如果进行原始数据的分析,一般避免不了进行数据的运算。 所以,按照我跟大家讲的量化交易学习路线,我们需要先学习下numpy和pandas,这两个是python进行数据运算和处理的两个比较重要的依赖包。 我们本篇文章先来看下,量化交易计算的Numpy。 这里,我必须先友情提示下,接下去两章的内容会比较枯燥,因为涉及到一些数据计算和统计的东西,而且后续不一定直接使用这两个包,因为大部分量化工具都已封装好数据处理。但是学好这两个知识,对于我们后续对行情数据的分析,了解量化工具包如何处理数据流的处理方法有比较重要的意义。 numpy & pandas Numpy是什么?首先,我们来了解下啥是Numpy。 先看下概念: NumPy是使用Python进行科学计算的基本包。其中包括:
除了明显的科学用途外,NumPy还可以作为通用数据的高效多维容器。可以定义任意数据类型。这使得NumPy能够无缝、快速地与各种数据库集成。 稍等。。是不是看的有点头晕,分分钟想放弃学习,有没有?特别是第4点,感觉又要回到高中大学时学习数学,高数的痛苦感觉啦? 别急!!! 深奥的理论概念一般都是用来吓唬学生的,其实我们在实际应用Numpy的时候,没有涉及到这么深奥的东西。我们只需要掌握以下内容:
这些都是跟数组有关的,是不是就比较清晰了?虽然里面有些概念还不懂,比如啥切片啊,索引啊~没事,不急,后续介绍。 Numpy包在量化交易中,起到的作用是数据的计算。使用这个包,我们可以很轻松的处理量化数据,比如股票行情数据,期货行情数据等等。 下面我们开始numpy的学习。 Numpy安装首先,我们来看下如何安装numpy。 直接命令行安装Numpy,记得需要先安装python。python安装前面已经讲过了哦。 pip install numpy 安装Numpy 数组生成及基本操作指定数据,创建一个简单的数组
我们指定了一个一维数组,3个元素分别1,2,3。控制台输出: [1 2 3] int32 同理,我们可以构建多维数组,可以直接使用自带方法构建全1数组,全零数组等。 # 多维数组的创建a = np.array([[1, 2, 3], [2, 3, 4]])print(a)# 创建全一数组,指定数据类型a = np.ones((4, 4), dtype=np.int)print(a)# 创建全零数组a = np.zeros((3, 4))print(a)# 创建全空数组,每个数无限接近于0a = np.empty((4, 5))print(a) 打印查看结果: [[1 2 3] [2 3 4]] [[1 1 1 1] [1 1 1 1] [1 1 1 1] [1 1 1 1]] [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] [[6.23042070e-307 4.67296746e-307 1.69121096e-306 1.37962524e-306 1.89146896e-307] [7.56571288e-307 3.11525958e-307 1.24610723e-306 1.37962320e-306 1.29060871e-306] [2.22518251e-306 1.33511969e-306 1.78022342e-306 1.05700345e-307 1.11261027e-306] [1.11261502e-306 1.42410839e-306 7.56597770e-307 6.23059726e-307 1.78016909e-306]] 连续数组及变换下面我们重点看下连续数组和变换。我们之所以独立开来讲,是因为这个跟我们的行情数据关系密切。我们的行情数据,不管股票还是期货,外汇等的所有数据,都是连续不断的数据构成的一个段完整的行情。 连续数组创建,创建一个数组,从1到50,步长为1.注意,arrange产生数组是左闭右开的,所以下标要到51,才是创建50个数据。生成数组之后,我们将其变换为2行的二维数组,注意列数乘以行数要等于改数组的元素个数。
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50] [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25] [26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50]] 数组基本运算数组的基本运算,我们需要掌握一些基本的运算即可,我们下面结合行情数据来讲解相关运算内容。 假设有一段行情,我们需要知道这段的最高价,最低价,以及行情的五日均线。我们可以用numpy的素组一些内置函数的运算来实现,很简单。 下面我们通过示例来演示。 1 首先,我们来看下数组的运算。构造数组,分别一个整数型数组和一个小数型数组,再分别将两个数组相加,形成新的数组。代码如下: # 生成10到20的随机数组np.set_printoptions(precision=1)data_1 = np.random.rand(50)print('生成小数型数组:', data_1)data_2 = np.random.randint(15, 20, size=50)print('生成整数型数组:', data_2)data = data_2 + data_1print('合并后生成的数组:', data) 生成小数型数组: [0.8 0.2 0. 0.3 1. 0.4 1. 0.4 1. 0.8 0.1 0.7 0.6 1. 0.7 0.9 0.6 1. 0.8 0.6 0.1 0.9 0.3 0.5 0.7 0.8 0.6 0.5 0.7 0.6 1. 0.1 0.3 0.4 0.8 0.8 1. 0.5 1. 0.9 0.9 0.9 0.9 0.6 0.1 0.2 0.9 0.3 0.8 0.9] 生成整数型数组: [15 17 18 15 16 15 18 16 18 18 16 19 18 15 18 16 16 17 19 17 19 16 15 17 15 17 15 15 18 15 18 16 17 15 18 15 19 18 19 18 16 19 19 17 18 19 19 19 19 19] 合并后生成的数组: [15.8 17.2 18. 15.3 17. 15.4 19. 16.4 19. 18.8 16.1 19.7 18.6 16. 18.7 16.9 16.6 18. 19.8 17.6 19.1 16.9 15.3 17.5 15.7 17.8 15.6 15.5 18.7 15.6 19. 16.1 17.3 15.4 18.8 15.8 20. 18.5 20. 18.9 16.9 19.9 19.9 17.6 18.1 19.2 19.9 19.3 19.8 19.9] 以上,我们构造了一段行情数据,设置行情价格为15~20元范围波动。下面,我们求出行情最大价格, 2 调用内部函数求数组最大最小值。
最大值元素索引38 最小值元素索引3 我们求最终获得数组的: 最大值索引为38,即从第38个元素(从0开始数),值为20. 最大值索引为3,即从第3个元素(从0开始数),值为15.3 3 求出5日移动平均价格数组 下面,我们求5日移动均线的数组,5日均线的计算方法,就是第5个数的时候,将其前面4个包括自身值相加除以5. def moving_average(a, n=5): ret = np.cumsum(a, dtype=float) ret[n:] = ret[n:] - ret[:-n] return ret[n - 1:] / n# 5日平均print('5日移动均线:', moving_average(data)) 控制台输出: 5日移动均线: [16.7 16.6 16.9 16.6 17.3 17.7 17.8 18. 18.4 17.8 17.8 18. 17.4 17.2 18. 17.8 18.2 18.3 17.7 17.3 16.9 16.6 16.4 16.4 16.7 16.6 16.9 17. 17.3 16.7 17.3 16.7 17.4 17.7 18.6 18.6 18.8 18.8 19.1 18.6 18.5 18.9 18.9 18.8 19.2 19.6] 以上三个步骤就是我们求利用numpy数组求得行情最大最小值,并且求出5日移动均线数据。 这样的数据,看的是不是很累?下面我们利用plot将其画出来。 利用matplotlib画图,我们之前的文章已经稍微讲过了,下面我们利用plot直接画出图形。
最终,画出的图形如下: numpy计算 这里,我们画出了整段行情,并且标注除了最大最小价格,画出5日的移动均线。 |
|