换工作之后,PYTHON就放下啦,基本没接触了,也都忘记的差不多了,现在重新捡起来
1.1 NumPy Array基础
NumPy是python运用于数据分析、科学计算最重要的库之一;
提供类强大的 ndarray类型用于处理多维数据.
可以定义一个python的array,然后用np.array()转化。
另外,numpy中的array元素如果有一个是浮点数,那么这个array中的所有元素都会以浮点数存储;
Numpy的Ndarray的数据结构必须是相同的;是和list是有区别的;
1.2 Numpy Ndarray的基本属性
.ndim 维度
.shape 每个维度的长度
.size 整个数组的长度,等于各个维度长度之积
.dtype 内部数据的类型
.itemsize 每个元素的字节长度
.nbytes 整个数组的字节长度,等于 .itemsize * .size
1.3 Numpy Ndarray的创建方法
使用其他数据类型创建ndarray
1.利用列表创建Ndarray:
close_list = [10, 10.5, 11.0, 11.5, 12.0]
close_array = np.array(close_list)
2.元祖创建:
stock_info_tuple = ('000001', '平安银行', '银行', 10.20)
stock_info_array = np.array(stock_info_tuple)
3. 使用np.arange()函数创建一维array
np_arange_array = np.arange(5)
4. 使用np.zeros()函数创建array
zeros_array = np.zeros((4, 3))
5. 使用np.ones()函数创建多维array
ones_array = np.ones((2, 3))
6.#使用np.ones_like创建结构相同、元素由1填充的ndarray
ones_like_array = np.ones_like(zeros_array)
# 类似用法: np.zeros_like() 跟c结构一样的全部是1的组合;
ones_like_array
7. 使用np.empty()函数创建没有使用特定值初始化的ndarray,
empty_array = np.empty((3, 4))
linspace_array = np.linspace(5, 15, 11)
2. numpy操作方式
2.1 数据索引和切片
2.1.1 一维ndarray进行索引和切片
close_array = np.array([10, 10.5, 11.0, 11.5, 12.0,13, 15.5])
close_array[0] # 取出第一天收盘价
close_array[-1] # 取出最后一天收盘价
# ndarray索引与list类似
close_array[-2:] # 取出最后两天收盘价
# ndarray索引与list类似
2.1.2 多维ndarray进行索引和切片
volume_stock1 = [10, 20, 10, 15, 20]
volume_stock2 = [25, 75, 10, 15, 100]
volume_stock3 = [55, 35, 10, 20, 20]
volume_matrix = np.array([volume_stock1, volume_stock2, volume_stock3])
volume_matrix # 3支股票近5天的交易量
volume_matrix[0] # 第一行, 第一支股票近五天交易量
volume_matrix[0, 2] # 第一行第三个元素, 第一支股票第三天交易量
# 多维ndarray索引与list相似,都是通过位置进行索引
2.1.3 布尔值索引
#布尔取值;这个是在条件选股非常常用;
code_array = np.array(['000001', '000002', '000003', '000004'])
pe_array = np.array([20, 10, 5, 30])
# 部分数据源返回数据形式与以上代码类似,在code_array中记载股票代码,在pe_array中记载pe值,两个array数据一一对应
# 如‘000001’股票对应pe值为20
# 下行代码通过<=符号判断生成bool值组成的ndarray,如果元素对应的值符合条件,则对应返回bool值为True,否则为False
filtered_array = pe_array <= 10
filtered_array
code_array[filtered_array] # 返回filtered_array对应为True的股票代码
# 以上过程可简写
code_array[pe_array<=10]
# 多个条件,条件选股;
roe_array = np.array([0.05, -0.10, 0.12 0.15])
# 使用双重条件,选择pe值<=10同时roe>=0的股票
# 注意,此时单个条件需要用括号括起来
filtered_array = (pe_array<=10) & (roe_array>=0)
filtered_array
# 以上过程可简写
code_array[(pe_array<=10) & (roe_array>=0)]
# 选取并集,选择pe值小于等于10或roe大于等于0的股票
# 此时用|表示或
code_array[(pe_array<=10) | (roe_array>=0)]
2.2 向量化操作
Ndarray很重要因为它提供了可以批处理数据而不需要写任何for循环;这叫做vectorization;
Python List对比
return_list = [0.01, 0.12, 0.3, 0.06, -0.05]
向量化计算
return_array = np.array([0.01, 0.12, 0.3, 0.06, -0.05]) # 来自持股stock1的每日收入情况
return_array + return_array
return_array * leverage_array
return_array / leverage_array
return_array * 2
以上运算中,参与运算的都是两个ndarray数据结构,并且数据结构shape相同,在进行元素级操作时,相同位置的元素进行了某种运算。
代码性能对比
data_array = np.random.standard_normal(1000000)
data_list = list(data_array)
%timeit [i*2 for i in data_list]
%timeit 2 * data_array
广播 Broadcasting
Ndarray创建方法补充
r = np.random.standard_normal((4, 3))
s = np.random.standard_normal((4, 3))
np.random.seed(100) # 锁定产生的随机数
s = np.random.standard_normal((4, 3))
Python function和Numpy的结合
def standardize(factor):
return (factor - factor.mean())/factor.std()
stock_pe = np.array([[15,16,15,17,16], # 假设为不同行业不同股票的pe
[50,53,57,56,58],
[20,18,19,17,15]])
standardize(stock_pe)
2.3 ndarray形状调整、拼接
g = np.linspace(1, 15, 15)
np.arange(10).reshape(2,5)
g = np.linspace(1, 15, 15).reshape((3,5))
np.resize(g, (3, 2))
h.T #转置
n.transpose() #和上面效果类似;
n.flatten() #把所有元素用一维数组返回;
3. Numpy的函数与方法
3.1 通用函数
3.1.1 一元通用函数
传入一个ndarray,对每一个元素进行相应运算。
求绝对值
return_array = np.array([0.05, 0.10, -0.05, 0.15, 0.10])
np.abs(return_array)
求平方根
a = np.array([1,2,3,4,5])
np.sqrt(a)
# 相反,可用np.square求各元素平方
3.1.2 二元通用函数
基本数学运算:如+,-,求余等
np.array([5,7]) % np.array([2,7])
基本比较运算:如大于,小于,大于等于等
np.array([1,2,3]) > np.array([4,1,2])
np.array([1,2,3]) >= 2
基本逻辑运算:并、或
np.array([True, False]) & np.array([False, True])
np.array([True, False]) | np.array([False, True])
3.1.3 数学统计方法
求和
position = np.array([1000,1200,1100,1300,1300]) # 某日策略对各股票持仓数量
position.sum()
均值
close_price_array = np.array([10, 11, 13, 12, 14])
np.mean(close_price_array)
标准差
close_price_array = np.array([10, 11, 13, 12, 14])
close_price_array.std()
最大最小值及其索引
close_price_array.max()
close_price_array.min()
close_price_array.argmax()
累积计算
# 累积和
income_array = np.array([10, 20, 30, 40])
# 累积积
daily_return = np.array([0.1,0.05, -0.01, 0.02])
daily_return + 1
(daily_return + 1).cumprod()
3.1.4 其他重要函数
#np.where 非常重要
factor = np.random.randn(3,5)
signal = np.where(factor > 0.2, 1, 0) # 在计算策略的signal时非常有用;将factor>0.2的标记为1,其余标记为0,由此可作为策略信号
#np.all 和 np.any
np.any(np.array([True, False])) # 检查是否存在一个True
np.all(np.array([True, False])) # 检查是否全部为True
4. 求解线性方程
4.1 用numpy求解方程
a⋅x=b
a11⋅x1+a21⋅x1=b1
a12⋅x2+a22⋅x2=b2
首先,矩阵 a 的数据
a = np.array([[3, 1], [1, 2]])
然后, 矩阵 b的数据
b = np.array([9, 8])
最后, 求解过程.
x = np.linalg.solve(a, b)
np.dot(a, x) # checking,矩阵的计算;np.dot Ndarry矩阵乘法运算;
4.2 Numpy 矩阵运算
a = np.matrix([[3, 1], [1, 2]])
x = np.matrix([[2],[4]])
a * x #因为是矩阵matrix的数据类型,乘法就是矩阵相乘,而不是向量化运算;
矩阵乘法2
a = np.array([[3,1],[1,2]])
x = np.array([2,4])
a.dot(x)
5. Numpy随机数
5.0 np.random.standard_normal()
np.random.standard_normal() # 产生单个随机数
np.random.standard_normal(5) # 产生1d array
a = np.random.standard_normal((2, 6)) # 2d array,两维数组,2行6列;
np.round(a, 3) #四舍五入,保留3位小数;
5.1 numpy.random.rand()
numpy.random.rand(d0,d1,...,dn)
rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
dn表格每个维度
返回值为指定维度的array
np.random.rand(4,2)
5.2 numpy.random.random
random函数根据给定维度生成[0,1)之间的数据,包含0,不包含, 和random.rand的区别是参数传递需要通过list或者tuple
z = np.random.random((4,2))
5.3 numpy.random.randn()
numpy.random.randn(d0,d1,...,dn)
randn函数返回一个或一组样本,具有标准正态分布。
dn表格每个维度
返回值为指定维度的array
np.random.seed(10)
np.random.randn(2,4)
5.4 numpy.random.randint()
numpy.random.randint(low, high=None, size=None, dtype='l')
返回随机整数,范围区间为[low,high),包含low,不包含high
参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int
high没有填写时,默认生成随机数的范围是[0,low)
np.random.randint(-5,6,size=(5,6))
5.5 numpy.random.seed()
np.random.seed()的作用:使得随机数据可预测。 当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数
np.random.seed(10)
np.random.rand(5)
5.6 numpy.random.choice()
numpy.random.choice(a, size=None, replace=True, p=None)
从给定的一维数组中生成随机数
参数: a为一维数组类似数据或整数;size为数组维度;p为数组中的数据出现的概率
a为整数时,对应的一维数组为np.arange(a)
import numpy as np
np.random.choice(5,20)
demo_list = ['000001', '000002','000003','000004', '000005']
np.random.choice(demo_list,size=(5,3), p=[0.1,0.1,0.1,0.1,0.6])
6. 用Numpy进行回归运算
求回归系数除了可以用Numpy的函数以外,用statsmodels或者sk-learn也是可以很快求出来的;但是追根溯源,sk-learn也是用的numpy来求的;
6.1 使用 np.polyfit返回回归结系数
m = np.array([1,2,3,4,5])
n = m * 5 + 2
reg = np.polyfit(m, n ,1)
#unpacked
slope, intercept = np.polyfit(m, n ,1)
6.2 使用np.polyval返回计算结果
np.polyval([ 2., 6., 9.], 1) #2 * 1 ** 2 + 6 * 1 +9
np.random.seed(10)
a = np.random.standard_normal((2, 8))
reg1 = np.polyfit(a[0], a[1], 1) # 线性回归重点掌握
reg2 = np.polyfit(a[0], a[1], 2)
reg3 = np.polyfit(a[0], a[1], 3)