本例子,通过numpy分析股价
csv文件读写
CSV(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,通常数据库的转存文件就是csv格式,文件中的各个字段对应于数据库表中的列。
这里有一份csv格式的文件,本文一该文件数据为例。
数据结构如下图
每一条数据对应,第一列为股票代码以标识股票(苹果公司股票代码为AAPL),第二列为dd-mm-yyyy格式的日期,第三列为空,随后各列依次是开盘价、最高价、最低价和收盘价,最后一列为当日的成交量。
我们可以通过numpy的 loadtext()和savetext()函数完成读写操作
- 读
# 从文件中读取数据
# 'data.csv':文件名
# delimiter:分隔符
# usecols:所取数据的列下标
# unpack:返回数组
c,v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
# 读取了收盘价和成交量数据
- 写
x = y = z = np.arange(0.0,5.0,1.0)
np.savetxt('test.csv', x, delimiter=',') # X 数组
np.savetxt('test.csv', (x,y,z)) # x,y,z 都是一维数组
np.savetxt('test.csv', x, fmt='%1.4e') # 使用指数表示法
成交量加权平均价格
首先读取成交量数据和收盘价数据
c,v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
# 计算成交量的平均价格
vwap = np.average(c, weights=v)
v_mean = np.average(c)
print('算术平均:{},加权平均:{}'.format(v_mean, vwap))
'''算术平均:351.0376666666667,加权平均:350.5895493532009'''
# 时间加权平均价格
t = np.arange(len(c))
twap = np.average(c, weights=t)
print('时间加权平均:{}'.format(twap))
'''时间加权平均:352.4283218390804'''
最大值和最小值
寻找最高价和最低价
# 读取最高价和最低价
h,l = np.loadtxt('data.csv', delimiter=',', usecols=(4,5), unpack=True)
# 最高价中的最大值
h.max() # 364.9
# 最低价中的最小值
l.min() # 333.53
# 区间差值:np.ptp()
h_ptp = np.ptp(h)
l_ptp = np.ptp(l)
print('最高价的差值为:{:.2f}'.format(h_ptp))
print('最低价的差值为:{:.2f}'.format(l_ptp))
'''最高价的差值为:24.86
最低价的差值为:26.97'''
简单统计分析
收盘价的统计分析
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
print('原始数据:{}'.format(c))
'''
原始数据:[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] '''
# 中位数
print('中位数为:{}'.format(np.median(c)))
'''中位数为:352.055'''
# 验证
sorted = np.sort(c)
print('排序后的数据为:{}'.format(sorted))
'''
[336.1 338.61 339.32 342.62 342.88 343.44 344.32 345.03 346.5 346.67
348.16 349.31 350.56 351.88 351.99 352.12 352.47 353.21 354.54 355.2
355.36 355.76 356.85 358.16 358.3 359.18 359.56 359.9 360. 363.13]'''
# 可以看出中位数为[351.99 352.12]的平均值
# 方差
print('股价的方差为:{}'.format(np.var(c)))
'''股价的方差为:50.126517888888884'''
股票收益率
- 股票收益率:收盘价的差值/收盘价
# diff()后一项减去前一项的差,数量会少一项,对应的只取到最后一项收盘价
returns = np.diff(c) / c[:-1]
print('收益率为:{}'.format(returns))
'''
[ 0.00958048 0.01682777 -0.00205779 -0.00255576 0.00890985 0.0155267
0.00943503 0.00833333 -0.01010721 0.00651548 0.00652935 0.00200457
0.00897472 -0.01330102 -0.02160201 -0.03408832 0.01184253 0.00075886
0.01539897 0.01450483 -0.01104159 0.00804443 0.02112916 0.00122372
-0.01288889 0.00112562 -0.00924781 -0.0164553 0.01534601]
'''
print('收益率的标准差:{}'.format(np.std(returns)