python 基于numpy 的统计分析

注:本文一下代码均在jupyter notebook中完成

一、文件读写

1.利用savetxt函数将数据存储到文件

语法:np.savetxt(filename,data)

import numpy as np #导入模块
#准备一个数据 data 
arr=np.array(range(6))
arr
np.savetxt('arr.txt',arr) #运行   arr保存到当前文件夹中,运行结果是科学计数法

2.读取csv文件

语法:loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’)
fname: str 读取的CSV文件名
delimiter:str 数据的分割符
usecols:tuple(元组) 执行加载数据文件中的哪些列
unpack:bool(布尔值) 是否将加载的数据拆分为多个组 true拆 false不拆
skipprows:int 跳过多少行 一般用于跳过前几行的描述性文字
encoding:bytes 编码格式
注:主要参数就以上

需求:将CSV文件(如下图)中的收盘价和成交量分别放入数组

#用close这个变量存放收盘价,用amount这个变量来存放成交量
close,amount=np.loadtxt('data.csv',delimiter=',',usecols=(6,7),unpack=True,skiprows=1)
#也可以用负值
#close,amount=np.loadtxt('data.csv',delimiter=',',usecols=(-2,-1),unpack=True,skiprows=1)
close #输出来看一看 
array([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])
amount #输出来看一看
array([21144800., 13473000., 15236800.,  9242600., 14064100., 11494200.,
       17322100., 13608500., 17240800., 33162400., 13127500., 11086200.,
       10149000., 17184100., 18949000., 29144500., 31162200., 23994700.,
       17853500., 13572000., 14395400., 16290300., 21521000., 17885200.,
       16188000., 19504300., 12718000., 16192700., 18138800., 16824200.])

二、基于Numpy的股价统计分析应用

1.利用average函数实现计算成交量加权平均价格

成交量加权平均价格:VWAP(Volume-Weighted Average Price,成交量加权平均价格)是一个非常重要的经济学量,代表着金融资产的“平均”价格。

某个价格的成交量越高,该价格所占的权重就越大。所以本需求中需要用成交量为权重,计算价格的平均值。利用average函数完成。

语法:np.average()

# 成交量加权平均价格,计算每一天收盘价的加权平均数
vwap=np.average(close,weights=amount)   #weight :权重
vwap #输出vwap
350.5895493532009 
#正常的close收盘价平均数 np.mean()算术平均数
np.mean(close)
351.0376666666667

2.min函数和max函数实现计算最大值和最小值

语法:
np.max() 最大值
np.min() 最小值
需求:计算股价近期最高价的最大值和最低价的最小值

#将csv文件中的最高价用high变量存储,最低价用low变量存储
high,low=np.loadtxt('data.csv',delimiter=',',usecols=(4,5),unpack=True,skiprows=1)
np.max(high) #计算最高价中的最大值
364.9
np.min(low)#计算最低价中的最小值
333.53

3.ptp函数计算数组元素的极差

语法:np.ptp()

np.ptp(high) #计算最高价这一列的极差
24.859999999999957

相当于:

np.max(high)-np.min(high)
24.859999999999957

4.计算收盘价的中位数

语法:np.median()

#求收盘价的中位数
np.median(close)

另一种求中位数的方法:

# 中位数 先排序 再取中间
sorted_close=np.sort(close)
sorted_close.size #看是奇数个还是偶数个
30  #偶数个
#长度
N=sorted_close.size
N1=int((N-1)//2) #取整数部分 #14
N2=int(N/2) #15
#求中位数
(sorted_close[N1]+sorted_close[N2])/2

5.利用方差明确投资风险的大小

方差是指各个数据与所有数据算术平均数的离差平方和除以数据个数所得到的值。
语法:np.var()

# 计算方差 np.var()
np.var(close)

【注】方差越小表示股价越稳定,所以股价变动过于剧烈的股票一定会给持有者制造麻烦。投资需谨慎!!!

6.计算股票收益率、年波动率及月波动率

波动率(volatility)是对价格变动的一种度量。历史波动率可以根据历史价格数据计算得出。计算历史波动率(如年波动率或月波动率)时,需要用到对数收益率。

  • 年波动率等于对数收益率的标准差除以其均值,再除以交易日倒数的平方根,通常交易日取252天。
  • 月波动率等于对数收益率的标准差除以其均值,再除以交易月
    倒数的平方根,交易月为12月。

要用到的变量:

  • 对数收益率, logreturns
  • 对数收益率的标准差, year_std
  • 对数收益率的均值,year_mean
  • 交易日倒数的平方根 day_reverse = np.sqrt(1/252)
  • 交易月倒数的平方根 month_reverse = np.sqrt(1/12)
# 股票收益率:相邻两天的差除以前一天的价格
returns=np.diff(close)/close[:-1]
# 收盘价对数 np.log() 求对数函数,底数是e
log_close=np.log(close)
# 对数收益率 
logreturns = np.diff( log_close) 
logreturns #输出对数收益率
array([ 0.00953488,  0.01668775, -0.00205991, -0.00255903,  0.00887039,
    0.01540739,  0.0093908 ,  0.0082988 , -0.01015864,  0.00649435,
    0.00650813,  0.00200256,  0.00893468, -0.01339027, -0.02183875,
   -0.03468287,  0.01177296,  0.00075857,  0.01528161,  0.01440064,
   -0.011103  ,  0.00801225,  0.02090904,  0.00122297, -0.01297267,
    0.00112499, -0.00929083, -0.01659219,  0.01522945]
# 对数收益率 的均值
year_mean = np.mean(logreturns)
# 对数收益率的标准差
year_std = np.std(logreturns)
#计算年波动率 
#年波动率等于对数收益率的标准差除以其均值,再除以交易日倒数的平方根,通常交易日取252天。
year=year_std/year_mean/np.sqrt(1/252)
#月波动率
#月波动率等于对数收益率的标准差除以其均值,再除以交易月倒数的平方根,交易月为12月。
month=year_std/year_mean/np.sqrt(1/12)

获取对数收益率为正值的:(演示一下where的作用)
方法一:

posretindices=np.where(logreturns>0)   #where方法得到的是匹配条件的下标
logreturns[posretindices] #输出下标为posretindices的logreturns中的值
array([0.00953488, 0.01668775, 0.00887039, 0.01540739, 0.0093908 ,
       0.0082988 , 0.00649435, 0.00650813, 0.00200256, 0.00893468,
       0.01177296, 0.00075857, 0.01528161, 0.01440064, 0.00801225,
       0.02090904, 0.00122297, 0.00112499, 0.01522945])

方法二:简单粗暴

logreturns[logreturns>0]

猜你喜欢

转载自blog.csdn.net/qq_43287650/article/details/82857970