【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有很多内容,我们只做金融量化,没有必要学一些用不到的东西。
# 但是上述内容是最为精简的部分了,请读者务必全部掌握。

 

posted @ 2021-02-06 15:17  泥鳅不怕水  阅读(333)  评论(0)    收藏  举报