Python量化炒股常用的Numpy包
Numpy包是高性能科学计算和数据分析的基础包,不是Python的标准包,是Python第三方包。这里使用聚宽JoinQuant量化炒股平台免费提供的基于Jupyter Notebook的研究平台。
初识Numpy包及量化炒股平台
Numpy包概述
NumPy(Numerical Python)是 Python 中用于科学计算的基础库,提供了强大的多维数组对象和相关工具,以及用于处理这些数组的数学函数。以下是关于 NumPy 包的概述:
主要特点
多维数组对象:NumPy 的核心是 ndarray 对象,它是一个具有相同类型、固定大小的数组,支持高效的数值运算。
矢量化操作:NumPy 提供了广播功能,使得在整个数组上执行操作更加简单和快速,避免了使用循环。
数学函数:NumPy 包含了许多数学函数,如三角函数、指数函数、对数函数等,可以直接应用于数组。
线性代数运算:NumPy 提供了丰富的线性代数函数,可以进行向量和矩阵运算、求逆、特征值分解等操作。
随机数生成:NumPy 提供了用于生成各种随机数的函数,包括均匀分布、正态分布等常见分布。
集成 C/C++/Fortran 代码:NumPy 是 Python 科学计算库的基础,为其他科学计算库提供了底层的数据结构支持。
安装 NumPy
在安装 Python 后,通常可以使用以下命令来安装 NumPy 包:
pip install numpy
导入 NumPy
import numpy as np
示例用法
import numpy as np
# 创建数组
arr = np.array([1, 2, 3, 4])
print(arr)
# 数组运算
result = arr + 10
print(result)
# 矩阵乘法
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
product_matrix = np.dot(matrix1, matrix2)
print(product_matrix)
# 统计函数
mean_value = np.mean(arr)
print(mean_value)
运行结果如下:
[1 2 3 4]
[11 12 13 14]
[[19 22]
[43 50]]
2.5
NumPy 是 Python 中不可或缺的科学计算库之一,对于处理大规模数据、进行数学计算和实现算法非常有用。其高效的数组操作和广泛的功能使得 NumPy 成为许多数据科学家和工程师首选的库之一。
量化炒股平台
量化炒股平台是指利用计算机程序和算法来执行股票交易策略的平台。这些平台通常使用大量历史数据、数学模型和统计分析来制定投资决策,以取代传统的人工交易。现在比较流行的量化炒股平台,如聚宽(JoinQuant)、优矿(Uqer)、米筐(Ricequant)等,大体上提供类似的服务。
单击导航栏中的”策略研究“选项,就会弹出下拉菜单,然后单击”研究环境“命令,如下图所示,就可以进入Jupyter Notebook的研究平台。单击“新建”按钮,弹出下拉菜单,然后单击“Python3“命令,如下图所示,就可以新建Python3文件。
ndarray数组基础
在 NumPy 中,ndarray 是表示多维数组的主要数据结构。它提供了许多功能和方法来操作数组数据。以下是一些常见的 ndarray 的用法示例:
创建数组:
import numpy as np
# 从列表创建一维数组
arr = np.array([1, 2, 3, 4])
print(arr)
# 从列表创建二维数组
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(matrix)
# 创建全零数组
zeros_arr = np.zeros((2, 3))
print(zeros_arr)
# 创建全一数组
ones_arr = np.ones((3, 3))
print(ones_arr)
运行结果如下:
[1 2 3 4]
[[1 2 3]
[4 5 6]]
[[0.0 0.0 0.0]
[0.0 0.0 0.0]]
[[1.0 1.0 1.0]
[1.0 1.0 1.0]
[1.0 1.0 1.0]]
数组索引和切片:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
# 访问元素
print(arr[0])
# 切片
print(arr[1:3])
# 使用负数索引
print(arr[-1])
运行结果如下:
1
[2 3]
5
数组运算:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 数组相加
sum_arr = arr1 + arr2
print(sum_arr)
# 数组乘法(逐元素相乘)
product_arr = arr1 * arr2
print(product_arr)
运算如下:
[5 7 9]
[4 10 18]
1.
2.
**数组形状和维度:**
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 数组形状
print(arr.shape)
# 数组维度
print(arr.ndim)
# 改变数组形状
reshaped_arr = arr.reshape(3, 2)
print(reshaped_arr)
运行结果如下:
(2, 3) # 2行3列
2
[[1 2]
[3 4]
[5 6]]
常见统计函数:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
# 计算平均值
mean_value = np.mean(arr)
print(mean_value)
# 计算标准差
std_deviation = np.std(arr)
print(std_deviation)
# 求和
sum_value = np.sum(arr)
print(sum_value)
运行结果如下:
3.0
1.4142135623730951
15
ndarray 对象提供了丰富的功能和方法,可以进行高效的数组操作、数学运算和统计分析。通过熟悉和灵活运用 ndarray 的相关用法,可以更好地处理和操作多维数组数据。
在新的单元格中输入如下代码:
myb = np.array([11, 25, 36,89], dtype=complex)
print('利用for循环显示数组中的数据:')
for a in myb:
print(a)
由于包一次导入,以后可以随便使用,这里不再需要导入numpy包。这里设置了一维数组的数据类型,默认为整型,这里设置为复数类型,最后用for循环显示数组中的数据。运行结构如下:
利用for循环显示数组中的数据:
(11+0j)
(25+0j)
(36+0j)
(89+0j)
在新单元格中输入如下代码:
myc = np.array([[11, 25, 36,89], [20,50,60,90]])
print('显示二维数组中的数据:\n', myc)
print('\n\n第二行中的第三个数据:', myc[1][2])
运行结果如下:
显示二维数组中的数据:
[[11 25 36 89]
[20 50 60 90]]
第二行中的第三个数据: 60
Numpy特殊数组
NumPy 提供了许多特殊类型的数组,这些数组具有特定的结构或形状,适用于不同的数学和科学计算任务。以下是一些常见的特殊数组:
零数组(Zero Array):
import numpy as np
# 创建全零数组
zeros_arr = np.zeros((2, 3))
print(zeros_arr)
全一数组(Ones Array):
import numpy as np
# 创建全一数组
ones_arr = np.ones((3, 3))
print(ones_arr)
对角线数组(Diagonal Array):
import numpy as np
# 创建对角线数组
diag_arr = np.diag([1, 2, 3])
print(diag_arr)
单位矩阵(Identity Matrix):
import numpy as np
# 创建单位矩阵
identity_matrix = np.eye(3)
print(identity_matrix)
随机数组(Random Array):
import numpy as np
# 创建随机数组
random_arr = np.random.rand(2, 2)
print(random_arr)
等差数列(Arange Array):
import numpy as np
# 创建等差数列
range_arr = np.arange(0, 10, 2)
print(range_arr)
正态分布随机数组(Normal Distribution Random Array)
import numpy as np
# 创建正态分布随机数组
normal_dist_arr = np.random.normal(0, 1, (2, 2))
print(normal_dist_arr)
Meshgrid 数组:
import numpy as np
# 创建网格点坐标数组
x = np.array([1, 2, 3])
y = np.array([4, 5])
X, Y = np.meshgrid(x, y)
print(X)
print(Y)
empty数组:
import numpy as np
# 创建一个形状为 (2, 3) 的空数组
empty_arr = np.empty((2, 3))
print(empty_arr)
这些特殊数组可以帮助在不同的场景下更有效地进行数据处理、模拟和分析。根据具体需求选择合适的特殊数组类型,在 NumPy 中灵活应用这些特殊数组将提高编程效率和数据处理能力。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
# 一维数组,默认类型为float
mya = np.zeros(6)
print('zeros一维数组:\n', mya)
# 二维数组,设置数据类型为int
myb = np.zeros((3,3), dtype=np.int)
print('zeros二维数组:\n', myb)
# 二维数组,默认类型为flaot
myc = np.ones((6,4))
print('ones二维数组:\n', myc)
# empty数组
myd = np.empty((2,4))
print('empty二维数组:\n', myd)
单击工具栏中的运行键(run)按钮,运行结果如下:
zeros一维数组:
[0.0 0.0 0.0 0.0 0.0 0.0]
zeros二维数组:
[[0 0 0]
[0 0 0]
[0 0 0]]
ones二维数组:
[[1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0]]
empty二维数组:
[[5.4e-323 1.24e-322 1.8e-322 4.4e-322]
[1e-322 2.47e-322 2.96e-322 4.45e-322]]
Numpy序列数组
在 NumPy 中,你可以使用 numpy.arange() 函数来创建一个序列数组,该函数会生成一个等差数列。以下是如何使用 numpy.arange() 来创建序列数组的示例:
import numpy as np
# 创建一个等差数列数组,起始值为 0,终止值为 10,步长为 2
sequence_arr = np.arange(0, 10, 2)
print(sequence_arr)
在这个示例中,np.arange(0, 10, 2) 创建了一个从 0 开始、到 10 结束(不包括 10)、步长为 2 的等差数列数组。输出结果将是 [0, 2, 4, 6, 8]。
除了 numpy.arange(),你还可以使用 numpy.linspace() 函数来创建序列数组,该函数会在给定的范围内生成指定数量的等分点。以下是使用 numpy.linspace() 的示例:
import numpy as np
# 创建一个包含5个元素的等间隔数组,起始值为 1,终止值为 10
sequence_arr = np.linspace(1, 10, 5)
print(sequence_arr)
在上面的示例中,np.linspace(1, 10, 5) 创建了一个包含 5 个元素的数组,这些元素均匀分布在区间 [1, 10] 内。输出结果将是 [1. 3.25 5.5 7.75 10. ]。
通过使用 numpy.arange() 和 numpy.linspace() 函数,你可以方便地创建等差数列或等间隔序列数组,适用于各种数学和科学计算任务。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
numpy1 = np.arange(1, 100, 2)
print('利用arrange函数创建等差序列数组:',numpy1)
print()
numpy2 = np.linspace(0,8,10)
print('利用linespace函数创建等差序列数组:',numpy2)
单击运行按钮,如下所示:
利用arrange函数创建等差序列数组: [1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51
53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99]
利用linespace函数创建等差序列数组: [0.0 0.8888888888888888 1.7777777777777777 2.6666666666666665
3.5555555555555554 4.444444444444445 5.333333333333333 6.222222222222221
7.111111111111111 8.0]
利用下标索引显示Numpy数组中元素的值
Numpy数组的每个元素、每行元素、没列元素都可以用下标索引访问,但应注意:下标索引是从0开始的,其操作与列表基本相同。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
numpy1 = np.array([[8,6,5.2],[72,-12,3.9]])
print('显示Numpy数组中所有元素:', numpy1)
print()
print('显示Numpy数组中第一行元素:',numpy1[0])
print()
print('显示Numpy数组第一行中的第二个元素:', numpy1[0,1])
print()
print('显示Numpy数组中第二行中的第三个元素:', numpy1[1,2])
print()
print('显示Numpy数组中第三列元素:', numpy1[:,2])
利用下标索引显示Numpy数组中的元素值,与列表相同,但需要注意显示某一行或某一列的写法。
单击运行按钮,运行效果如下:
显示Numpy数组中所有元素: [[8.0 6.0 5.2]
[72.0 -12.0 3.9]]
显示Numpy数组中第一行元素: [8.0 6.0 5.2]
显示Numpy数组第一行中的第二个元素: 6.0
显示Numpy数组中第二行中的第三个元素: 3.9
显示Numpy数组中第三列元素: [5.2 3.9]
Numpy数组运算
Numpy数组运算是指Numpy数组中元素的加、减、乘、除、乘方、最大值、最小值等运算。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
numpy1 = np.array([5,10,15])
numpy2 = np.array([2, 4, 6])
print('数组的加法运算', numpy1 + numpy2)
print('数组的减法运算', numpy1 - numpy2)
print('数组的乘法运算', numpy1 * numpy2)
print('数组的除法运算', numpy1 / numpy2)
print('numpy1数组的乘方运算', numpy1 ** 2)
print('数组的点乘运算', np.dot(numpy1, numpy2)) # 就是把数组的乘法运算得到的数再加起来
print('数组的大小比较', numpy1 >= numpy2)
print('numpy1数组的最大值', numpy1.max())
print('numpy2数组的最小值', numpy2.min())
print('numpy1数组的和', numpy1.sum())
print('numpy1和numpy2数组的和', numpy1.sum()+numpy2.sum())
单击工具栏中的运行按钮,效果如下:
数组的加法运算 [7 14 21]
数组的减法运算 [3 6 9]
数组的乘法运算 [10 40 90]
数组的除法运算 [2.5 2.5 2.5]
numpy1数组的乘方运算 [25 100 225]
数组的点乘运算 140
数组的大小比较 [True True True]
numpy1数组的最大值 15
numpy2数组的最小值 2
numpy1数组的和 30
numpy1和numpy2数组的和 42
Numpy的矩阵
矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,是高等数学中的常见工具,也常见于统计分析等应用数学学科中。在 NumPy 中,除了 ndarray(n-dimensional array,多维数组)之外,还提供了 numpy.matrix 类型,用于表示矩阵对象。numpy.matrix 是 ndarray 的子类,专门用于处理线性代数运算。以下是一些关于 numpy.matrix 对象的基本信息和示例用法:
创建矩阵:
import numpy as np
# 从列表创建矩阵
mat = np.matrix([[1, 2], [3, 4]])
print(mat)
转换为矩阵类型:
import numpy as np
arr = np.array([[1, 2], [3, 4]])
mat = np.mat(arr) # 将数组转换为矩阵类型
print(mat)
矩阵乘法:
import numpy as np
mat1 = np.matrix([[1, 2], [3, 4]])
mat2 = np.matrix([[2, 0], [1, 2]])
result = mat1 * mat2
print(result)
求逆矩阵:
import numpy as np
mat = np.matrix([[1, 2], [3, 4]])
inverse_mat = mat.I # 求逆矩阵
print(inverse_mat)
矩阵转置:
import numpy as np
mat = np.matrix([[1, 2], [3, 4]])
transposed_mat = mat.T # 矩阵转置
print(transposed_mat)
获取矩阵元素:
import numpy as np
mat = np.matrix([[1, 2], [3, 4]])
element = mat[0, 1] # 获取特定位置的元素
print(element)
NumPy 中的 numpy.matrix 类型特别适用于进行线性代数运算,如矩阵乘法、求逆矩阵等。然而,对于一般情况下的多维数组操作,通常建议使用普通的 ndarray 类型。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
numpy1 = np.matrix([[2,4,6],[1,3,5]])
print('矩阵数据内容:')
print(numpy1)
numpy2 = numpy1.T # 矩阵的转置
print('矩阵的转置后的数据内容:')
print(numpy2)
print('矩阵的乘法:')
print(numpy1*numpy2)
numpy3 = numpy1.I # 矩阵的求逆
print('矩阵的求逆:')
print(numpy3)
单击工具栏中的运行按钮,效果如下:
矩阵数据内容:
[[2 4 6]
[1 3 5]]
矩阵的转置后的数据内容:
[[2 1]
[4 3]
[6 5]]
矩阵的乘法:
[[56 44]
[44 35]]
矩阵的求逆:
[[1.0833333333333348 -1.3333333333333355]
[0.3333333333333349 -0.33333333333333537]
[-0.416666666666668 0.6666666666666684]]
Numpy的线性代数
Numpy包含bumpy.linalg模块,提供线性代数所需的所有功能。
两个数组的点积
numpy.dot()函数返回两个数组的点积。对于二维向量,其等效于矩阵乘法;对于一维数组,它是向量的内积;对于N维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
a = np.array([[1, 2], [3,4]])
b = np.array([[11,12], [13, 14]])
print('返回两个数组的点积:')
print(np.dot(a, b))
运行结果如下:
返回两个数组的点积:
[[37 40]
[85 92]]
注意:两个数组的点积计算为[[1x11+2x13, 1x12+2x14],[3x11+4x13,3x12+4x14]]
两个向量的点积
Numpy.vdot()函数返回两个向量的点积。如果第一个参数是复数,那么它的共轭复数会用于计算。如果参数id是多维数组,那么它会被展开。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[11, 12], [13, 14]])
print('返回两个向量的点积:')
print(np.vdot(a, b))
注意:两个向量的点积计算为1x11+2x12+3x13+4x14=130。
单击工具栏运行按钮,运行结果如下:
返回两个向量的点积:
130
数组的向量内积
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([0, 1, 0])
print('一维数组的向量内积:')
print(np.inner(a, b))
print()
c = np.array([[1,2], [3,4]])
d = np.array([[11, 12], [13, 14]])
print('多维数组的向量内积:')
print(np.inner(c,d))
注意:多维数组的向量内积计算如下。
1x11 + 2x12, 1x13+2x14
3x11+4x12, 3x13+4x14
单击工具栏运行按钮,运行结果如下:
一维数组的向量内积:
2
多维数组的向量内积:
[[35 41]
[81 95]]
矩阵的行列式
行列式在线性代数中是非常有用的值,它从方阵的对角元素计算。对于2x2矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。也就是说,对于矩阵[[a, b], [c, d]],行列式计算为ad-bc。较大的方阵被认为是2x2矩阵的组合。在Python中,是利用numpy.linalg.det()函数计算输入矩阵的行列式。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print('矩阵的行列式:')
print(np.linalg.det(a))
b = np.array([[6,1,1], [4,-2,5],[2,8,7]])
print('较大的方阵的数据:')
print(b)
print()
print('较大的方阵行列式:')
print(np.linalg.det(b))
print()
print('较大的方阵的行列式的计算方法:')
c = 6*(-2*7 - 5*8) - 1 * (4*7 - 5*2) + 1*(4*8 - -2*2)
print('6*(-2*7 - 5*8) - 1 * (4*7 - 5*2) + 1*(4*8 - -2*2)=', c)
单击工具栏运行按钮,运行结果如下:
矩阵的行列式:
-2.0000000000000004
较大的方阵的数据:
[[6 1 1]
[4 -2 5]
[2 8 7]]
较大的方阵行列式:
-306.0
较大的方阵的行列式的计算方法:
6*(-2*7 - 5*8) - 1 * (4*7 - 5*2) + 1*(4*8 - -2*2)= -306
矩阵的逆
使用bumpy.linalg.inv()函数来计算矩阵的逆。矩阵的逆是指,如果它乘以原始矩阵,则得到单位矩阵。
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境“命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python 3文件,输入如下代码:
import numpy as np
x = np.array([[1,2], [3,4]])
print('原始矩阵:\n',x)
print()
y = np.linalg.inv(x)
print('矩阵的逆:\n', y)
print()
print('单位矩阵:')
print(np.dot(x, y))
单击工具栏运行按钮,运行结果如下:
原始矩阵:
[[1 2]
[3 4]]
矩阵的逆:
[[-1.9999999999999996 0.9999999999999998]
[1.4999999999999998 -0.4999999999999999]]
单位矩阵:
[[1.0 0.0]
[8.881784197001252e-16 0.9999999999999996]]
提醒:单位矩阵是一个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此之外全部为0
可在[小蜜蜂AI][ https://zglg.work] 网站的GPT问答获取更多相关知识。