金融量化python应用基础篇(1)--numpy的使用
发布时间
阅读量:
阅读量
numpy是一个高效处理大量数据的科学计算核心库,在其主要功能基于ndarray(一种高效存储与操作的大规模多维数组结构)。
创建ndarray
import numpy as np
#创建一维
data1 = [1,2,3,4]
arr1 = np.array(data1)
python
array([1, 2, 3, 4])
#创建二维
data2 = [data1,data1]
arr2 = np.array(data2)
python
array([[1, 2, 3, 4],
[1, 2, 3, 4]])
#也可以手动
arr1 = np.array([1,2,3,4])
print(arr1,"\n")
arr2 = np.array([[1,2,3,4],[1,2,3,4]])
print(arr2)
python
[1 2 3 4]
[[1 2 3 4]
[1 2 3 4]]
ndarray中的数据与Python提供的基础数据结构list和tuple不同,在于其元素必须全部具有相同的类型(例如integer, double-precision floating-point, boolean, string, unicode等)。这些数值类型的转换可以通过numpy库中的astype函数来实现(相对简单),此处无需编写代码演示部分
类似于Matlab中的array-like数据结构可以通过索引和切片等方法实现对特定行和列的数据提取操作
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
#提取某行
arr[1]
python
array([4, 5, 6])
#提取某列
arr[:,1]
python
array([2, 5, 8])
#提取某个元素
arr[1,1]
python
5
#提取某些行、列(注意x:y代表从x行/列到y-1行/列)
arr[0:3,0:2]
python
array([[1, 2],
[4, 5],
[7, 8]])
#可以通过提取多行多列对某些值进行统一赋值
arr[0:2,0:1] = 100
python
array([[100, 2, 3],
[100, 5, 6],
[ 7, 8, 9]])
#有时候想要一份修改新值的array而不修改原数据
arr2 = arr.copy()
arr2[0:2,0:1] = 10
python
[[100 2 3]
[100 5 6]
[ 7 8 9]]
[[10 2 3]
[10 5 6]
[ 7 8 9]]
numpy最重要的功能是可以高效进行大量数据之间的运算
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
#两个array之间的简单运算
print("加法:\n",arr+arr,"\n","减法:\n",arr-arr,"\n","乘法:\n",arr*arr,"\n","除法:\n",arr/arr)
python
加法:
[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
减法:
[[0 0 0]
[0 0 0]
[0 0 0]]
乘法:
[[ 1 4 9]
[16 25 36]
[49 64 81]]
除法:
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]

常见array内数据统计(这部分不写代码展示)
| 方法 | 说明 |
|---|---|
| sum | 对行列或者所有数据求和 |
| mean | 求算数平均 |
| std、var | 标准差、方差 |
| min、max | 最小值、最大值 |
| argmin、argmax | 最小值、最大值的索引 |
许多金融模型都基于正态分布及其它几种分布模型。利用numpy生成随机数后将原本连续的金融数据离散化后进行近似模拟。
import numpy.random as npr
import matplotlib.pyplot as plt
#采样次数为1000
size = 1000
#n = 100,p = 0.3的二项分布
rand1 = npr.binomial(100,0.3,size)
#均值为10,标准差20的正态分布
rand2 = npr.normal(10,20,size)
#自由度为0.5的卡方分布
rand3 = npr.chisquare(0.5,size)
#λ为2的泊松分布
rand4 = npr.poisson(2,size)
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize = (10,10))
ax1.hist(rand1,bins = 25)
ax1.set_title("binomial")
ax1.set_ylabel("frequency")
ax1.grid(True)
ax2.hist(rand2,bins = 25)
ax2.set_title("normal")
ax2.set_ylabel("frequency")
ax2.grid(True)
ax3.hist(rand3,bins = 25)
ax3.set_title("chisquare")
ax3.set_ylabel("frequency")
ax3.grid(True)
ax4.hist(rand4,bins = 25)
ax4.set_title("poisson")
ax4.set_ylabel("frequency")
ax4.grid(True)
python

展示结果如下:

全部评论 (0)
还没有任何评论哟~
