【基本工具】S02E04 NumPy简单统计方法举例

0.本集概览

1.csv数据的读取
2.利用常用函数获取均值、中位数、方差、标准差等统计量
3.利用常用函数分析价格的加权均值、收益率、年化波动率等常用指标
4.处理数据中的日期

今天这一集,我们介绍一下NumPy库中的一些非常实用和常用的函数方法。

1.应用背景

要知道,NumPy的常用数学和统计分析的函数非常多,如果我们一个一个的分散来讲,一来非常枯燥,二来呢也记不住,就仿佛又回到了昏昏欲睡的课堂,今天我们用一个背景例子来串联一下这些零散的知识点。

我们通过分析苹果公司的股票价格,来串讲NumPy的常用函数用法

我们在我们python文件的同级目录下放置数据文件AAPL.csv,用excel文件可以打开看看里面是什么样的:

依次是日期,收盘价、成交量、开盘价、最高价和最低价
在CSV文件中,每一列数据数据是被“,”隔开的,为了突出重点简化程序,我们把第一行去掉,就像下面这样

2.csv数据的读取

首先,我们读取“收盘价”和“成交量”这两列,即第1列和第2列(csv也是从第0列开始的)
代码片段:

import numpy as np  

c, v = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1, 2), unpack=True) 
print(c) 
print(v) 

运行结果:

[ 178.02  178.65  178.44  179.97  181.72  179.98  176.94  175.03  176.67   176.82  176.21  175.    178.12  178.39  178.97  175.5   172.5   171.07   171.85  172.43  172.99  167.37  164.34  162.71  156.41  155.15  159.54   163.03  156.49  160.5   167.78  167.43  166.97  167.96  171.51  171.11   174.22  177.04  177.    178.46  179.26  179.1   176.19  177.09  175.28   174.29  174.33  174.35  175.    173.03  172.23  172.26  169.23  171.08   170.6   170.57  175.01  175.01  174.35  174.54  176.42] 
[ 38313330.  22676520.  29334630.  31464170.  32191070.  32130360.   24518850.  31686450.  23273160.  27825140.  38426060.  48706170.   37568080.  38885510.  37353670.  33772050.  30953760.  37378070.   33690660.  40113790.  50908540.  40382890.  32483310.  60774900.   70583530.  54145930.  51467440.  68171940.  72215320.  85957050.   44453230.  32234520.  45635470.  50565420.  39075250.  41438280.   51368540.  32395870.  27052000.  31306390.  31087330.  34260230.   29512410.  25302200.  18653380.  23751690.  21532200.  20523870.   23589930.  22342650.  29461040.  25400540.  25938760.  16412270.   21477380.  33113340.  16339690.  20848660.  23451420.  27393660.   29385650.]

这样,我们就完成了第一个任务,将csv数据文件中存储的数据,读取到我们两个ndarray数组c和v中了。

3.基本统计量计算

接下来,我们小试牛刀,对收盘价进行最简单的数据处理,求取他的平均值。

3.1.算术平均值

第一种,非常简单,就是我们最常见到的算术平均值
代码片段:

import numpy as np  

c, v = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1, 2), unpack=True) 
mean_c = np.mean(c) print(mean_c) 

运算结果:

172.614918033

3.2.加权平均值

第二种,是加权平均值,我们用成交量来加权平均价格,即,用成交量的值来作为权重,某个价格的成交量越高,该价格所占的权重就越大。
代码片段:

import numpy as np  

c, v = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1, 2), unpack=True) 
vwap = np.average(c, weights=v) 
print(vwap)  

运算结果:

170.950010035

3.3.最值获取

再来说说取值范围,找找最大值和最小值。我们找找收盘价的最大值和最小值,以及最大值和最小值之间的差异
代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
print(np.max(c)) 
print(np.min(c)) 
print(np.ptp(c))  

运行结果:

181.72 
155.15 
26.57

接下来我们进行简单的统计分析,我们先来求取收盘价的中位数

3.4.求取中位数

代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
print(np.max(c)) 
print(np.min(c)) 
print(np.median(c))  

运算结果:

181.72 
155.15 
174.35

3.5.求取方差

另外一个我们关心的统计量就是方差,方差能够体现变量变化的程度。在我们的例子中,方差还可以告诉我们投资风险的大小。那些股价变动过于剧烈的股票一定会给持有者带来麻烦
代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
print(np.var(c))  

运算结果:

37.5985528621

我们回顾一下方差的定义,方差指的是各个数据与所有数据算数平均数的离差平方和的均值
代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
print(np.mean((c - c.mean())**2))  

运算结果:

37.5985528621

上下对比一下,看看,结果是一模一样的。

4.常用指标分析方法

4.1.收益率分析

现在我们来看看每天的收益率,这个计算式子很简单:$ \frac{C_{t+1}-C_{t}}{C_{t}}$ ,即用今天的收盘价减去昨天的收盘价,再除以昨天的收盘价格。同时我们发挥NumPy的优势,利用向量运算,可以一次性算出所有交易日的收益率。

diff函数时用数组的第N项减第N-1项,得到一个n-1项的一维数组。本例中我们注意到数组中日期越近的收盘价,数组索引越小,因此得取一个相反数,综上代码:
代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
returns = -np.diff(c)/c[1:] 
print(returns)  

运算结果:

[-0.00352645  0.00117687 -0.00850142 -0.0096302   0.00966774  0.01718097   0.01091242 -0.00928284 -0.00084832  0.00346178  0.00691429 -0.01751628  -0.00151354 -0.00324077  0.01977208  0.0173913   0.00835915 -0.00453884  -0.00336368 -0.00323718  0.0335783   0.01843739  0.01001782  0.04027875   0.00812117 -0.02751661 -0.0214071   0.04179181 -0.02498442 -0.04339015   0.00209043  0.00275499 -0.00589426 -0.0206985   0.00233768 -0.01785099  -0.0159286   0.00022599 -0.00818111 -0.00446279  0.00089336  0.01651626  -0.00508216  0.01032634  0.00568019 -0.00022945 -0.00011471 -0.00371429   0.01138531  0.00464495 -0.00017416  0.01790463 -0.01081365  0.0028136   0.00017588 -0.02536998 -0.          0.00378549 -0.00108858 -0.01065639]

然后观察一下每日收益的标准差,就可以看看收益的波动大不大了:
代码片段:

import numpy as np  

c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1,), unpack=True) 
returns = -np.diff(c)/c[1:] 
print(np.std(returns))  

运算结果:

0.0150780328454

如果我们想看看哪些天的收益率是正的,很简单,还记得where语句吗,拿来使用吧
代码片段:
```

top Created with Sketch.