Numpy科学计算库的应用

时间:2022-01-06 21:24:14

1、统计分析应用
文件见附件:data.csv
链接:https://pan.baidu.com/s/191kp22ylN7zimfiy-6UQ9w 密码:z1x4

import numpy as np

# 加载收盘价和成交量
close, amount = np.loadtxt('data/data.csv', delimiter=',', usecols=(6, 7), unpack=True)
print("收盘价:\n", close)
print("成交量:\n", amount)

# 1、成交量加权平均价,np.average(ndarray,weights)
average = np.average(close, weights=amount)
print("成交量加权平均价:", average)

# 2、计算算术平均值:np.mean(ndarray)  np.average(args):不加weights就是求算术平均值
# 收盘价的算术平均值
mean = np.mean(close)
average1 = np.average(close)
print("收盘价的算术平均价格:", mean)
print("收盘价的算术平均价格:", average1)

# 3、求最大值和最小值 np.max(ndarray) np.min(ndarray)
max = np.max(amount)
print("最大成交量:", max)
min = np.min(amount)
print("最小成交量:", min)

# 编写一个函数,实现查找任意维度数组的最大值和最小值
example = np.arange(24).reshape(2,3,4)
def getMaxandMin(ndarray1):
    d1 = ndarray1.ravel()
    d1.sort()
    max = d1[len(d1)-1]
    min = d1[0]
    return max,min
result = getMaxandMin(example)
print(result)

#4、计算数组的极差(最大值-最小值之差) np.ptp
hith =np.loadtxt('data/data.csv',delimiter=',',usecols=(4))
print(hith)

#计算股票最高价的极差
ptp = np.ptp(hith)
print(ptp)

# 利用股票的最大值和最小值求得极差
print(np.max(hith)-np.min(hith))

# 5、求数组中位数 np.median()
close =np.loadtxt('data/data.csv',delimiter=',',usecols=(6))
median = np.median(close)
print("中位数:",median)

# 验证
close.sort()
chang = len(close)
if chang%2==0:
    a = close[int(chang/2)]
    b =close[int(chang/2-1)]
    total = (a +b)/2
    print(total)
else:
    print(close[int(chang//2)])

# 6、计算数据样本的方差 np.var()
close =np.loadtxt('data/data.csv',delimiter=',',usecols=(6))
open =np.loadtxt('data/data.csv',delimiter=',',usecols=(3))
close_var = np.var(close)
open_var = np.var(open)
print("收盘价的方差:",close_var)
print("开盘价的方差:",open_var)

2、求股票的波动率

# 年波动率等于对数收益率的标准差除以其均值,再除以交易日
# 倒数的平方根,通常交易日取252天,求年波动率
close = np.loadtxt('data/data.csv', delimiter=',', usecols=(6))

# 计算简单的收益率:相邻两天的差除以前一天的价格
result = np.diff(close) / close[:-1]
# print(result)

# 对数收益率:将每天的价格取对数,底数为e
# 先对所有的收盘价取对数
logReturns = np.diff(np.log(close))
print("对数收益率:\n", logReturns)

# 对数收益率的标准差
std = np.std(logReturns)
print("对数收益率的标准差:", std)

3、数组数据的筛选应用

close = np.loadtxt('data/data.csv', delimiter=',', usecols=(6))

# 对数收益率:将每天的价格取对数,底数为e
logReturns = np.diff(np.log(close))
print("对数收益率:\n", logReturns)

# 筛选出对数收益率大于0的所有元素的索引
indices = np.where(logReturns>0)
print("对数收益率大于0的索引为:\n",indices)

# 根据索引值,获取相应的数组元素
result = np.take(logReturns,indices)
print("收益率大于0的值有:\n",result)

4、常用统计方法应用

# 1、求阶乘 np.prod,即累乘
arr = np.array([5, 2, 7, 4])
prod = np.prod(arr)
print("阶乘", prod)

# 2、累积乘积 np.cumprod()
# 原来  [2,3,4,5]
# 结果  [2 6 24 120]
cumArr = np.array([2, 3, 4, 5])
cumProd = np.cumprod(cumArr)
print(cumProd)

# 3、将数组中所有比num1小的元素设为num1
#   所有比num2大的元素设为num2
#  介于最大值和最小值的数保持不变  np.clip(num1,num2)
clip1 = np.array([3, 56, 7, 44, 22, 18, 66])
result = clip1.clip(20, 48)
print(result)

# 4np.compress()返回根据一定条件筛选后的数组
close = np.loadtxt('data/data.csv', delimiter=',', usecols=(6))
# 计算对数收益率
logReturns = np.diff(np.log(close))
print(logReturns)

# 筛选出对数收益率中大于0的元素
mask = logReturns>0
print("mask索引:",mask)
result = logReturns.compress(mask)
print("对数收益率中大于0的元素为:",result)

5、日期的格式转化应用

# import datetime
from datetime import datetime

dateStr = '2018-5-28'

newDate = datetime.strptime(dateStr,'%Y-%m-%d')
print(newDate)

# 获取dateStr日期对应的星期
weekday = newDate.date().weekday()
print("{}是星期{}".format(dateStr,weekday+1))

6、练习

# 文件中的数据为给定时间范围内某股票的数据,现要求:获取该时间范围
# 内交易日周一、周二、周三、周四、周五分别对应的平均收盘价及哪天的
# 平均收盘价最高,哪天的平均收盘价最低。
import numpy as np
from datetime import datetime

# 将日期格式字符串转化得到星期
def datestr(s):
    return datetime.strptime(s.decode('utf8'),'%d-%m-%Y').date().weekday()

# 把第2datestr函数的方法取出
dates,close = np.loadtxt('data/data.csv',delimiter=',',usecols=(1,6),converters={1:datestr},unpack=True)

print("交易日期:\n",dates+1)
print("收盘价:\n",close)

average = []
for i in range(5):
    # 根据星期数条件得到一个mask数组
    mask = dates == i
    # 根据mask数组筛选出星期数为i的所有的收盘价
    weekday = close.compress(mask)
    # 把求到的各个数组,求出平均值,并放到average列表中
    average.append(np.mean(weekday))

#获取数组中最大值最小值的索引
max_vlaue = np.argmax(average)
min_vlaue = np.argmin(average)

print("星期 {} 的平均收盘价最高".format(max_vlaue+1))
print("星期 {} 的平均收盘价最低".format(min_vlaue+1))

打印结果如下:

交易日期:
 [5. 1. 2. 3. 4. 5. 1. 2. 3. 4. 5. 1. 2. 3. 4. 5. 2. 3. 4. 5. 1. 2. 3. 4.
 5. 1. 2. 3. 4. 5.]
收盘价:
 [336.1  339.32 345.03 344.32 343.44 346.5  351.88 355.2  358.16 354.54
 356.85 359.18 359.9  363.13 358.3  350.56 338.61 342.62 342.88 348.16
 353.21 349.31 352.12 359.56 360.   355.36 355.76 352.47 346.67 351.99]
星期 3 的平均收盘价最高
星期 5 的平均收盘价最低