1.1 读写文件
eye函数创建了一个单位矩阵
使用savetxt函数将数据存储到文件中,当然我们需要指定文件名以及要保存的数组。
>>> import numpy as np
>>> i2=np.eye(2)
>>> print i2
[[ 1. 0.]
[ 0. 1.]]
>>> np.savetxt("eye.txt",i2)
1.2 CSV 文件
CSV(Comma-Separated Value,逗号分隔值)格式是一种常见的文件格式。通常,数据库的 转存文件就是CSV格式的,文件中的各个字段对应于数据库表中的列。
读入 CSV 文件
NumPy中的loadtxt函数可以方便地读取CSV 文件,自动切分字段,并将数据载入NumPy数组。
下面,我们以载入苹果公司的历史股价数据为 例展开叙述。股价数据存储在CSV文件中,第一列为股票代码以标识股票(苹果公司股票代码为 AAPL),第二列为dd-mm-yyyy格式的日期,第三列为空,随后各列依次是开盘价、最高价、最低 9 价和收盘价,最后一列为当日的成交量。
下面为一行数据:
AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
可以看到,数据存储在data.csv文件中,我们设置分隔符为,(英文标点逗号),因为我们要处理一个CSV文件。usecols的参数为一个元组,以获取第7字段至第8字段的数据,也就是股票 的收盘价和成交量数据。unpack参数设置为True,意思是分拆存储不同列的数据,即分别将收 盘价和成交量的数组赋值给变量c和v。
>>> import numpy as np
>>> c,v =np.loadtxt('data.csv',delimiter=',',usecols=(6,7),unpack=True)
>>> c
336.10000000000002
>>> v
21144800.0
1.3成交量加权平均价格(VWAP)
VWAP(Volume-Weighted Average Price,成交量加权平均价格)是一个非常重要的经济学量, 它代表着金融资产的“平均”价格。某个价格的成交量越高,该价格所占的权重就越大。VWAP 就是以成交量为权重计算出来的加权平均值,常用于算法交易。
>>> c,v =np.loadtxt('data.csv',delimiter=',',usecols=(6,7),unpack=True)
>>> vwap=np.average(c,weights=v)
>>> vwap
338.09998959549171
1.4 算术平均值函数
>>> d=np.mean(c)
>>> d
338.10000000000002
时间加权平均价格
在经济学中,TWAP(Time-Weighted Average Price,时间加权平均价格)是另一种“平均” 价格的指标。既然我们已经计算了VWAP,那也来计算一下TWAP吧。其实TWAP只是一个变种 而已,基本的思想就是最近的价格重要性大一些,所以我们应该对近期的价格给以较高的权重。 最简单的方法就是用arange函数创建一个从0开始依次增长的自然数序列,自然数的个数即为收 盘价的个数。当然,这并不一定是正确的计算TWAP的方式。
>>> t=np.arange(len(c))
>>> f=np.average(c,weights=t)
>>> f
339.10000000000002
1.5 取值范围
通常,我们不仅仅想知道一组数据的平均值,还希望知道数据的极值以及完整的取值范 围——最大值和最小值。我们的股价示例数据中已经包含了每天的股价范围——最高价和最低 价。但是,我们还需要知道最高价的最大值以及最低价的最小值。
min函数和max函数能够满足需求。我们按如下步骤来找最大值和最小值。
>>> h,l=np.loadtxt('data.csv',delimiter=',',usecols=(4,5),unpack=True)
>>> m=np.max(h)
>>> n=np.min(l)
>>> m
348.39999999999998
>>> n
333.52999999999997
NumPy中有一个ptp函数可以计算数组的取值范围。该函数返回的是数组元素的最大值和最小值之间的差值。也就是说,返回值等于max(array) - min(array)。调用ptp函数:
>>> r=np.ptp(h)
>>> q=np.ptp(l)
>>> r
4.0
>>> q
0.0
1.6 统计分析
median的函数将帮助我们找到中位数
msort函数可以帮我们获得排序后的数组,并输出 结果
>>> a=np.loadtxt("data.csv",delimiter=',',usecols=(6,),unpack=True)
>>> b=np.median(a)
>>> b
338.10000000000002
>>> c=np.msort(a)
>>> c
array([ 336.1, 337.1, 338.1, 339.1, 340.1])
方差能够体现变量变化的程度。在我们的例子中, 方差还可以告诉我们投资风险的大小。那些股价变动过于剧烈的股票一定会给持有者制造麻烦。
>>> a=np.loadtxt("data.csv",delimiter=',',usecols=(6,),unpack=True)
>>> d=np.var(a)
>>> d
2.0
1.7 股票收益率
在学术文献中,收盘价的分析常常是基于股票收益率和对数收益率的。简单收益率是指相邻 两个价格之间的变化率,而对数收益率是指所有价格取对数后两两之间的差值。我们在高中学习 过对数的知识,“a”的对数减去“b”的对数就等于“a除以b”的对数。因此,对数收益率也可 以用来衡量价格的变化率。注意,由于收益率是一个比值,例如我们用美元除以美元(也可以是 8 其他货币单位),因此它是无量纲的。总之,投资者最感兴趣的是收益率的方差或标准差,因为 这代表着投资风险的大小。
分析股票收益率
NumPy中的diff函数可以返回一个由相邻数组元素的差 值构成的数组。这有点类似于微积分中的微分。为了计算收益率,我们还需要用差值除以前一天 的价格。
>>> c=np.loadtxt('data.csv',delimiter=',',usecols=(6,),unpack=True)
>>> c
array([ 336.1, 337.1, 338.1, 339.1, 340.1])
>>> d=c[:-1]
>>> d
array([ 336.1, 337.1, 338.1, 339.1])
>>> e=np.diff(c)
>>> e
array([ 1., 1., 1., 1.])
>>> returns = e/d
>>> returns
array([ 0.0029753 , 0.00296648, 0.0029577 , 0.00294898])
我们没有用收盘价数组中的最后一个值做除数。接下来,用std函数计算标准差:
>>> f=np.std(returns)
>>> f
9.8097844864301728e-06
1.8 日期分析
分析日期数据 处理日期总是很烦琐,NumPy是面向浮点数运算的,因此需要对日 期做一些专门的处理。
import numpy as npfrom datetime import datetimedef datestr2num(s): return datetime.strptime(s,"%d-%m-%Y").date().weekday()dates,close=np.loadtxt('data.csv',delimiter=',',usecols=(1,6),converters={1:datestr2num},unpack=True)print "Dates=",datesaverages =np.zeros(5)for i in range(5): indices=np.where(dates==i) prices=np.take(close,indices) avg=np.mean(prices) print "Day",i,"prices",prices,"Average",avg averages[i]=avgtop= np.max(averages)print "Highest average",topprint "topp day of the week ", np.argmax(averages)bottom =np.min(averages)print "lowest average",bottomprint "bottom day of the week ",np.argmin(averages)