【PY从0到1】一文掌握Numpy量化
# 一文掌握Numpy量化 # 从这节课开始我们介绍量化中用的最多的数据分析库。 # Numpy中最重要的数据类型就是Ndarray。 # Ndarray中所有的数据结构要保持一致。 # 我们先导入库。 import numpy as np # 1> Numpy常用的基本属性 # .ndim 维度 # .shape 每个维度的长度 # .size 整个数组的长度,等于各个维度长度之积 # .dtype 内部数据的类型 # .astype 转变数据类型 # 下面做一个演示。 # 我们先创建两个列表e和f。 e = [1,2,3,4,5,6] f = [7,8,9,10,11,12] g = [e,f] # 将列表转化为Ndarray g = np.array(g) # 依次调用属性。 print(g.ndim) print(g.shape) print(g.size) print(g.dtype) # 2 # (2, 6) # 12 # int32 # 2> Ndarray的创建方法 # ①在1> 中提到的可以直接通过列表(list)或元祖(tuple)转换。 a = [1,2,3,4] a = np.array(a) # ② 使用函数range()和arange(),前者python内置,后者属于numpy。 a = np.array(list(range(5))) b = np.arange(5) # ③ 使用numpy的函数创建 zeros = np.zeros((4,3),dtype='i') # 创建四行三列的0 ndarray,类型为int ones = np.ones((2,3)) # 创建两行三列的单位 ndarray empty = np.empty((3,4)) # 创建三行四列没有使用特定值初始化的ndarray ones_like = np.ones_like(zeros) # 创建与zeros形状一样的ndarray zeros_like = np.zeros_like(ones) # 创建与ones形状一样的单位ndarray linspace = np.linspace(5,15,11) # 从5到15,等分11份的ndarray(包括5和15) # ④ 创建随机数 np.random.seed(10000) # 规定随机种子,相同种子生成的随机数一样 np.random.standard_normal((4, 3)) # 创建四行三列的正态分布 # 3> Numpy的操作方式 # ① 一维array的切片与列表类似,这里只强调一个。 a = [1,2,3,4,5,6,7] b = a[1:6:2] # 从索引1到6(有头无尾),间隔为2做切片。 # ② 多维ndarray a = [1,2,3] b = [4,5,6] c = [7,8,9] d = [a,b,c] d = np.array(d) # 对d做切片 d[0,2] # 第一行第三个元素 d[:,2] # 所有行的第三个元素 d[0:1,1:2] # 第一行的第二个元素(有头无尾) d[:,[1,2]] # 所有行的第二三个元素 # ③ 布尔值索引 d<5 # 返回true或者False d[d<5] # 返回ndarray中小于5的数组成列表。 d[(d<5)&(d>2)] # 返回ndarray中d小于5且d大于2的数组成列表 d[(d<=2)|(d>=4)] # 返回ndarray中d小于等于2或d大于等于4的数组成列表 # ④ 其他操作 np.where(d>4,1,-1) # d中大于4输出1,小于4输出-1 # np.all() # array里全为True则输出True # np.any() # array只要有True就输出True np.reshape(d,(9,1)) # 将d的形状改为九行一列 # 4> 广播 a = np.array([1,2,3,4,5,6,7,8,9]) b = np.average(a) c = np.std(a) d = (a-b)/c # 元素级运算得到的d为a的标准化数据 # 5> Ndarray形状调整与拼接 # ①形状调整1(reshape()) a = np.arange(1,10) a.reshape((3,3)) # 将a改为三行三列 # 也可以改写成更简洁的:a = np.arange(1,10).reshape((3,3)) # 可以达到相同的效果。 # ②形状调整2(resize()) # 这个函数可以随意改变形状,多退少补。 np.resize(a,(2,2)) # 将前四个数字生成两行两列的ndarray np.resize(a,(5,5)) # 先补足25个数字再组成五行五列的ndarray # np.resize(a,(5,5))结果如下: # [[1 2 3 4 5] # [6 7 8 9 1] # [2 3 4 5 6] # [7 8 9 1 2] # [3 4 5 6 7]] # ③转置T a.reshape((3,3)).T # ④ 把元素用一维数组返回(flatten()) b = a.reshape((3,3)) b.flatten() # 6> Numpy中的基本运算 # np.abs() # 求绝对值 # np.sqrt() # 开平方 # np.exp() # 以e为底的指数运算 # np.log() # 以e为底的对数运算 # np.floor() # 舍去所有小数 # np.ceil() # 入去所有小数 # np.sign() # 判断数组中的正负号,正的返回1,负的返回-1 # 7> 统计量计算 # np.sum() # 元素求和 # np.mean() # 元素求平均 # np.std() # 元素求标准差 # np.max() # 返回数组最大值 # np.min() # 返回数组最小值 # np.argmax() # 返回数组最大值的索引 # np.argmin() # 返回数组最小值的索引 # np.cumsum() # 累计求和 # np.cumprod() # 累计求积 # 8> 求解线性方程 # 需要一些线性代数功底,这里不过多赘述。 # 线性方程: # a1x1 + a2x2 = b1 # a3x1 + a4x2 = b2 # 将系数提取,写成矩阵形式: # ax = b a = np.array([[1,2],[3,4]]) b = np.array([5,6]) # 求解: x = np.linalg.solve(a,b) # 验算: np.dot(a,x) # 矩阵点乘,结果等于b np.matrix(a) #转化为矩阵 # 8> Numpy随机数 # ① 具有标准正态 np.random.seed(10) # 随机种子 a = np.random.standard_normal((2,6)) # 随机产生两行六列的正态分布ndarray np.round(a,4) # 四舍五入保留4位小数 # ② 随机生成0到1且不包括1 np.random.rand(4,2) # 生成四行两列,具有标准正态 # ③ np.random.random([4,2]) # 与上方的区别在于需要传递列表或者元祖 np.random.random((4,2)) # ④ np.random.randint(-5,6,size=(5,6)) # 返回-5到6(不包括6)的五行六列的随机整数。 # ⑤ numpy.random.choice() a = [1,11,2.3] numpy.random.choice(a, size=(5,3), p=[0.5,0.3,0.2]) # 上方是从a这样的一维数组中按概率p挑选出五行三列的ndarray # 9> Numpy的回归运算 m = np.array([1,2,3,4,5,6,7]) n = np.array([2,4,8,6,3,2,5]) np.polyfit(m, n ,1) # 寻找m与n的一次线性关系 np.polyfit(m, n ,2) # 寻找m(自变量)与n(应变量)的二次线性关系 # 上述返回值均为array。 # 计算应变量 np.polyval([2,3,4],2) # 2*2**2+3*2+4 np.polyval([2,3,4,5,6],2) # 2*2**4+3*2**3+4*2**2+5*2+6 # Numpy有很多内容,我们只做金融量化,没有必要学一些用不到的东西。 # 但是上述内容是最为精简的部分了,请读者务必全部掌握。
AI量化的成长之路

浙公网安备 33010602011771号