文件读写
(1)txt格式
首先创建一个单位矩阵,然后将其写入txt文件(自定义存储路径)
import numpy as np
a=np.eye(3)
np.savetxt('D:/a.text',a)
打开建立的txt文件看看
(2)csv格式
loadtxt函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。下面都以苹果公司的历史股价数据为例展开
第一列:股票代码以标识股票
第二列:dd-mm-yyyy格式的日期
第三列为空
之后依次是开盘价、最高价、最低价、收盘价和当日成交量
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
设置分隔符为‘,’,usecols的参数为一个元组,以获取第7字段至第8字段的数据,即收盘价和成交量,unpack参数设置为True,意思是分开存储不同列的数据。
写入CSV文件
np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s")
最后是一个类型指定字符,在我们的例子中指定为字符串类型。
(3)日期读入
读入日期不能像之前一样。不然会有
ValueError: invalid literal for float(): 28-01-2011
Numpy尝试把日期直接转换成浮点数会引发错误。
用参数converters,是数据列和转换函数之间进行映射的字典,首先写出转换函数将日期转成星期几,
-星期一 0
-星期二 1
-星期三 2
-星期四 3
-星期五 4
-星期六 5
-星期日 6
def datestr2num(s):
return datetime.datetime.strtime(s,'%d-%m-%Y').date().weekday()
dates,close=loadtext('data.csv',delimiter=',',usecols=(1,6),converters={1:datestr2num},upstack=True)
加权平均
(1)用vwap(Volume-Weighted Average Price)代表成交量加权平均价格
vwap=np.average(c,weights=v)
(2)用twap(Time-Weighted Average Price)代表时间加权平均价格
基本的思想:近期价格权重大
用arange函数创建一个从0开始依次增长的自然数序列,自然数的个数即为收盘价的个数
t = np.arange(len(c))
twap=np.average(t,weights=t)
算术平均
mean=np.mean(c)
取值范围
再次读入数据,将每日最高价和最低价的数据载入数组
h,l=np.loadtxt('data.csv',delimiter=',', usecols=(4,5), unpack=True)
获取最大、最小值和价格区间
highest=np.max(h)
lowest=np.min(l)
interval_h=np.ptp(h)
interval_l=np.ptp(l)
统计分析及常用函数
(1) 中位数
只获取收盘价数据即可
c=np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
med=np.meidan(c)
(2)排序
sorted_close=np.msort(c)
(3)方差
variance=np.var(c)
(4)差分
diff=np.diff(c)
(5)标准差
stand_dev=np.std(c)
(6)开方
sqrt=np.sqrt(c)
(7)返回满足条件的数组元素的索引值
indices=np.where(dates==6)
(8)按照索引值从数组中取出相应的元素
np.take(close,indices)
(9)apply_along_axis函数
调用另外一个由我们给出的函数,作用于每一个数组元素上,并且可以指定轴。
dates, open, high, low,close=np.loadtxt('data.csv',delimiter=',', usecols=(1, 3, 4,
5, 6), converters={1: datestr2num}, unpack=True)
close = close[:16]
dates = dates[:16]
# get first Monday
first_monday = np.ravel(np.where(dates == 0))[0]
# get last Friday
last_friday = np.ravel(np.where(dates == 4))[-1]
weeks_indices = np.split(weeks_indices, 3)
def summarize(a,o,h, l, c):
monday_open = o[a[0]]
week_high = np.max( np.take(h, a) )
week_low = np.min( np.take(l, a) )
friday_close = c[a[-1]]
return("APPL", monday_open, week_high, week_low, friday_close)
weeksummary = np.apply_along_axis(summarize, 1, weeks_indices, open, high, low, close)