前言
正如我前面所讲,量化交易背后是有着一套严谨计算的过程的。我们进行量化交易时,如果进行原始数据的分析,一般避免不了进行数据的运算。
所以,按照我跟大家讲的量化交易学习路线,我们需要先学习下numpy和pandas,这两个是python进行数据运算和处理的两个比较重要的依赖包。
我们本篇文章先来看下,量化交易计算的Numpy。
这里,我必须先友情提示下,接下去两章的内容会比较枯燥,因为涉及到一些数据计算和统计的东西,而且后续不一定直接使用这两个包,因为大部分量化工具都已封装好数据处理。但是学好这两个知识,对于我们后续对行情数据的分析,了解量化工具包如何处理数据流的处理方法有比较重要的意义。
Numpy是什么?
首先,我们来了解下啥是Numpy。
先看下概念:
NumPy是使用Python进行科学计算的基本包。其中包括:
- 一个强大的N维数组对象
- 复杂(广播)功能
- C/C++与FORTRAN代码集成工具
- 有用的线性代数、傅立叶变换和随机数能力
除了明显的科学用途外,NumPy还可以作为通用数据的高效多维容器。可以定义任意数据类型。这使得NumPy能够无缝、快速地与各种数据库集成。
稍等。。是不是看的有点头晕,分分钟想放弃学习,有没有?特别是第4点,感觉又要回到高中大学时学习数学,高数的痛苦感觉啦?
别急!!!
深奥的理论概念一般都是用来吓唬学生的,其实我们在实际应用Numpy的时候,没有涉及到这么深奥的东西。我们只需要掌握以下内容:
- 数据类型
- 数组类型
- 类型转换
- 创建数组
- 数组索引
- 数组切片
- 改变维度
这些都是跟数组有关的,是不是就比较清晰了?虽然里面有些概念还不懂,比如啥切片啊,索引啊~没事,不急,后续介绍。
Numpy包在量化交易中,起到的作用是数据的计算。使用这个包,我们可以很轻松的处理量化数据,比如股票行情数据,期货行情数据等等。
下面我们开始numpy的学习。
Numpy安装
首先,我们来看下如何安装numpy。
win+R,输出cmd打开,确认,命令窗口。
直接命令行安装Numpy,记得需要先安装python。python安装前面已经讲过了哦。
pip install numpy
数组生成及基本操作
指定数据,创建一个简单的数组
import numpy as npa = np.array([1, 2, 3], dtype=np.int32)print(a)print(a.dtype)
我们指定了一个一维数组,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 调用内部函数求数组最大最小值。
# 计算最大的数max_index = np.argmax(data)print('最大值元素索引%d' % np.argmax(data))# 计算最小的数min_index = np.argmin(data)print('最小值元素索引%d' % np.argmin(data))
最大值元素索引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直接画出图形。
# 画图整理x = np.arange(1, 51, 1)plt.plot(x, data,'--*y')# 最大值plt.plot(max_index, data[max_index], 'rs')show_max='[key:'+str(max_index)+' value:'+str(round(data[max_index],1))+']'plt.annotate(show_max, xytext=(max_index, data[max_index]), xy=(max_index, data[max_index]))# 最小值plt.plot(min_index, data[min_index], 'gs')show_max='[key:'+str(min_index)+' value:'+str(round(data[min_index],1))+']'plt.annotate(show_max, xytext=(min_index+1, data[min_index]), xy=(min_index, data[min_index]))# 均线x_2 = np.arange(5, 51, 1)plt.plot(x_2, moving_average(data))mpl.rcParams['font.sans-serif']=['SimHei'] #用来指定默认字体 SimHei为黑体mpl.rcParams['axes.unicode_minus']=Falseplt.title('行情及五日均线模拟图')plt.savefig('./20200414.png')plt.show()
最终,画出的图形如下:
这里,我们画出了整段行情,并且标注除了最大最小价格,画出5日的移动均线。
以上完整代码均已传到VX公号:大操手量化投资,欢迎关注并获取相关代码。后续最新文章会陆续在上面更新。
以上是我们本章的内容,关于numpy,进行数组运行,结合我们量化交易的行情数据进行的讲解。希望大家能学有所得!
好啦,本章内容就到这里。欢迎关注【大操手量化投资】,一起学习量化交易相关知识,量化交易从小白到高手的路程!