所以,按照我跟大家讲的量化交易学习路线,我们需要先学习下numpy和pandas,这两个是python进行数据运算和处理的两个比较重要的依赖包。
我们本篇文章先来看下,量化交易计算的Numpy。
这里,我必须先友情提示下,接下去两章的内容会比较枯燥,因为涉及到一些数据计算和统计的东西,而且后续不一定直接使用这两个包,因为大部分量化工具都已封装好数据处理。但是学好这两个知识,对于我们后续对行情数据的分析,了解量化工具包如何处理数据流的处理方法有比较重要的意义。

numpy & pandas
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

安装Numpy
数组生成及基本操作
指定数据,创建一个简单的数组
import numpy as np
a = 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)
# 创建全空数组,每个数无限接近于0
a = 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_1
print("合并后生成的数组:", 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']=False
plt.title('行情及五日均线模拟图')
plt.savefig('./20200414.png')
plt.show()
最终,画出的图形如下:

numpy计算
这里,我们画出了整段行情,并且标注除了最大最小价格,画出5日的移动均线。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/76862
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!