量化投资与Python——NumPy
为什么选择Python
如何使用Python进行量化投资
NumPy - 数据分析基础包
简介
- NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。 - 数组和列表的区别是什么? - 数组中存储的数据元素类型必须是统一类型 - 优先级: - 字符串 > 浮点型 > 整数
什么是数据分析
- 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律 - 使得数据的价值最大化 - 分析用户的消费行为 - 制定促销活动的方案 - 制定促销时间和粒度 - 计算用户的活跃度 - 分析产品的回购力度 - 分析广告点击率 - 决定投放时间 - 制定广告定向人群方案 - 决定相关平台的投放 - ...... - 数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取适当的行动 - 保险公司从大量赔付申请数据中判断哪些为骗保的可能 - 支付宝通过从大量的用户消费记录和行为自动调整花呗的额度 - 短视频平台通过用户的点击和观看行为数据针对性的给用户推送喜欢的视频
开发环境介绍
- anaconda - 官网:https://www.anaconda.com/ - 集成环境:集成好了数据分析和机器学习中所需要的全部环境 - 注意: - 安装目录不可以有中文和特殊符号 - jupyter - jupyter就是anaconda提供的一个基于浏览器的可视化开发工具 - jupyter的基本使用 - 启动:在终端中录入:jupyter notebook的指令,按下回车 - 新建: - python3:anaconda中的一个源文件 - cell有两种模式: - code:编写代码 - markdown:编写笔记 - 快捷键: - 添加cell:a或者b - 删除:x - 修改cell的模式: - m:修改成markdown模式 - y:修改成code模式 - 执行cell: - shift+enter - tab:自动补全 - 代开帮助文档:shift+tab
numpy的常用属性
- shape
- ndim
- size
- dtype
# 生成随机数,并设置为3行4列 arr = np.random.randint(0,100,size=(3,4)) # 生成随机数组 print(arr) # [[ 6 51 10 20] # [10 19 1 54] # [81 53 42 11]] print(arr.shape) # (3, 4) 返回数组规格 print(arr.ndim) # 2, 返回数组维度 print(arr.size) # 12, 返回数组中元素个数 print(arr.dtype) # int32, 返回数组类型 arr = np.array([1,2,3],dtype='int64') print(arr.dtype) # dtype='int64' arr.dtype = 'uint8' print(arr.dtype) # uint8
注意:numpy的数据类型
- array(dtype=?):可以设定数据类型
- arr.dtype = '?':可以修改数据类型
创建一个数组,指定数组元素类型为int32
- arr = np.array([1,2,3],dtype='int32')
- arr.dtype
切片操作
arr = np.random.randint(0, 100, size=(3, 6)) print(arr) print(arr[0:2]) # 行切片 print(arr[:,0:2]) # 切出前两列, 行切片 "," 列切片 print(arr[0:2,0:2]) # 切出前两行的前两列 print(arr[::-1]) # 将数组的行倒置 print(arr[::,::-1]) # 将数组的列倒置 print(arr[::-1,::-1]) # 将整个数组倒置
输出结果:
[[30 68 4 64 18 52] [46 40 93 14 0 34] [70 36 28 44 3 23]] [[30 68 4 64 18 52] [46 40 93 14 0 34]] [[30 68] [46 40] [70 36]] [[30 68] [46 40]] [[70 36 28 44 3 23] [46 40 93 14 0 34] [30 68 4 64 18 52]] [[52 18 64 4 68 30] [34 0 14 93 40 46] [23 3 44 28 36 70]] [[23 3 44 28 36 70] [34 0 14 93 40 46] [52 18 64 4 68 30]]
应用于图片
import matplotlib.pyplot as plt png_obj = plt.imread(r'H:py数据分析科学计算基础包-numpyfj.png') plt.imshow(png_obj)
级联操作
将多个numpy数组进行横向或者纵向的拼接 - axis轴向的理解 - 0:列 - 1:行 - 问题: - 级联的两个数组维度一样,但是行列个数不一样会如何?
arr1 = np.random.randint(0, 100, size=(3, 6)) arr2 = np.random.randint(0, 100, size=(3, 6)) print(arr1) print(arr2) print(np.concatenate((arr1,arr2),axis=0)) # 列 print(np.concatenate((arr1,arr2),axis=1)) # 行
执行结果
[[63 47 67 61 53 2] [49 56 29 63 51 2] [48 70 78 67 51 6]] [[96 71 8 50 67 66] [59 87 75 7 30 39] [97 52 53 61 79 7]] [[63 47 67 61 53 2] [49 56 29 63 51 2] [48 70 78 67 51 6] [96 71 8 50 67 66] [59 87 75 7 30 39] [97 52 53 61 79 7]] [[63 47 67 61 53 2 96 71 8 50 67 66] [49 56 29 63 51 2 59 87 75 7 30 39] [48 70 78 67 51 6 97 52 53 61 79 7]]
应用于图片
常用的数学函数
- NumPy 提供了标准的三角函数:sin()、cos()、tan() - numpy.around(a,decimals) 函数返回指定数字的四舍五入值。 - 参数说明: - a: 数组 - decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
常用的统计函数
- numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。 - numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。 - numpy.median() 函数用于计算数组 a 中元素的中位数(中值) - 标准差std():标准差是一组数据平均值分散程度的一种度量。 - 公式:std = sqrt(mean((x - x.mean())**2)) - 如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。 - 方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。
矩阵相关
- NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。一个 的矩阵是一个由行(row)列(column)元素排列成的矩形阵列。 - numpy.matlib.identity() 函数返回给定大小的单位矩阵。单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0。 - 矩阵相乘 - numpy.dot(a, b, out=None) - a : ndarray 数组 - b : ndarray 数组 - ![image.png](attachment:image.png) - 第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。 - 线性代数基于矩阵的推导: - https://www.cnblogs.com/alantu2018/p/8528299.html
为什么要用NumPy
案例一:计算每一个值的汇率
a = [random.uniform(10.0,200.0) for i in range(50)] b = 6.8 a = np.array(a) print(a*b)
案例二:计算一批数量不等的商品总价值
# 价钱 c = [random.uniform(10.0,300.0) for i in range(30)] # 数量 d = [random.randint(1,20) for i in range(30)] c = np.array(c) d = np.array(d) print((a*b).sum())
案例三:取值
# 取出列表中大于 5 的数 e = [random.randint(1,10) for i in range(15)] # print(e) e = np.array(e) print(e[e>5]) # 取出列表中大于 8 的偶数 f = [random.randint(1,15) for i in range(15)] f = np.array(f) # g = f[f>8] print(g[g%2==0]) print(f[(f>8) & (f%2==0)]) # 取出列表中大于 8 的数和所有偶数 h = [random.randint(1,15) for i in range(15)] h = np.array(h) print(h[(h>8) | (h%2==0)])