目录
  • 文件读入
    • 1、保存或创建新文件 
    • 2、读取csv文件的函数loadtxt
    • 3、常见的函数
    • 4、股票的收益率等
    • 5、对数收益与波动率
    • 6、日期分析
  • 总结

    本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数、学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数。

    文件读入

    读写文件是数据分析的一项基本技能

    CSV(Comma-Separated Value,逗号分隔值)格式是一种常见的文件格式。通常,数据库的转存文件就是CSV格式的,文件中的各个字段对应于数据库表中的列。

    NumPy中的 loadtxt 函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。

    1、保存或创建新文件 

    import numpy as np
    
    i = np.eye(3) #eye(n)函数创建n维单位矩阵
    print(i)
    np.savetxt('test.txt', i) #savetxt()创建并保存test.txt文件

    savetxt()函数,如果有已经文件则更新,如目录中没有,则创建并保存test.txt文件

    运行结果如下:

    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]

    2、读取csv文件的函数loadtxt

    1)先在保存程序的目录下创建一个名称为data.csv的文件,并设置数据如下图:

    Python数据分析之NumPy常用函数使用详解

    2)读取文件,如下:

    c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)

    usecols 的参数是一个元组,以获取第7字段至第8字段的数据,也就是上述文件中 股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收盘价和成交量的数组赋值给变量c和v。

    3、常见的函数

    成交量加权平均、时间加权、算术平均值、中位数、方差等

    import numpy as np
    
    i = np.eye(3) #eye(n)函数创建n维单位矩阵
    print(i)
    np.savetxt('test.txt', i) #savetxt创建并保存test.txt文件
    
    #读取csv文件
    c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
    """usecols 的参数为一个元组,以获取第7字段至第8字段的数据,也就是股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收
    盘价和成交量的数组赋值给变量c和v"""
    vwap = np.average(c, weights=v)  #调用了average函数,将v作为权重参数使用,
    print(vwap)
    print('\n')
    print( np.mean(c)) #算术平均值
    print('\n')
    t = np.arange(len(c))
    print( t )
    print('\n')
    twap =np.average(c, weights=t) #按时间权重
    print( twap )
    print('\n')
    h,l=np.loadtxt('data.csv',delimiter=',', usecols=(4,5), unpack=True)
    # 获取第4字段至第5字段的数据,即股票的最高价和最低价
    
    print ( np.max(h)) #获取最大值max()
    print ( np.min(l)) #获取最小值min()
    print('\n')
    print( np.ptp(h) ) # 用ptp()函数计算了极差,即最大值和最小值之间的差值
    print( np.ptp(l) )
    print('\n')
    print( np.median(c)) # 中位数median()函数,即多个数据中,处于中间的数
    print( np.msort(c))#msort(( ))函数对价格数组进行排序,可以验证上述中位数
    #方差的计算
    variance = np.var(c) #方差函数var()
    print(variance)

    用代码、excel进行相关计算,运行结果如下:

    Python数据分析之NumPy常用函数使用详解

    为后面计算,将data.csv中的数据多增加几行,修改如下并保存(为后面日期读写与修改,日期形式修改成如下):

    603112,2022-4-1,,13.56,13.97,13.55,13.87,3750000603112,2022-4-2,,13.75,14.25,13.69,14.03,4003500603112,2022-4-3,,13.69,14.11,13.61,13.95,3956500603112,2022-4-4,,14.3,14.3,13.73,13.89,4250000603112,2022-4-5,,14.1,14.5,13.93,14,4013500603112,2022-4-6,,14.5,15.4,14.35,15.4,9056500603112,2022-4-7,,16,16.94,15.85,16.94,3750000

    4、股票的收益率等

    股市中最常见的就是涨幅,也就是今日收盘价相对昨日涨跌的比例,即  (今日收盘价-昨天收盘价)/昨日收盘价*100,numpy中的 diff() 函数可以返回一个由相邻数组元素的差值构成的数组,由于相邻数据相减,因此diff()数组数据较原数组少一个。

    如上述修改后,有7天的收盘价,diff()计算出的结果就只有6位,

    import numpy as np
    
    #读取csv文件
    c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
    
    #股票的简单收益率
    # diff 函数可以返回一个由相邻数组元素的差值构成的数组
    results = np.diff(c)
    print(results)
    print('\n')
    results1 = np.diff(c)/c[:-1]*100  #相对前一天的涨幅
    print(results1)
    print('\n')
    Standard_deviation =np.std(results) # 计算出标准差
    print(Standard_deviation)

    运行结果,代码、excel进行相比较:

    Python数据分析之NumPy常用函数使用详解

    5、对数收益与波动率

    1)对数收益:log 函数得到每一个收盘价的对数,再对结果使用 diff 函数即可,

    logreturns = np.diff( np.log(c) )
    print(logreturns)

    运行结果:

    [ 0.01146966 -0.00571839 -0.00431035  0.00788817  0.09531018  0.09531018]

    2) where的作用

     where 函数可以根据指定的条件返回所有满足条件的序列索引值,比如上述logreturns中有两个小于0的数据。

    posretindices = np.where(results1 > 0) 
    print('Indices with positive returns1',posretindices)

    运行结果:

    Indices with positive returns1 (array([0, 3, 4, 5], dtype=int64),)

    3)波动率:波动率=对数收益率的标准差除以其均值,再除以交易周期倒数的平方根。下面代码分别为以年、月进行统计的波动率.

    annual_volatility =(np.std(logreturns)/np.mean(logreturns))/np.sqrt(1./252.)#使用浮点数才能得到正确的结果
    print ( annual_volatility )
    #月波动率
    month_volatility =(np.std(logreturns)/np.mean(logreturns))/np.sqrt(1./12.)
    print ( month_volatility )

    6、日期分析

    处理日期总是很烦琐。NumPy是面向浮点数运算的,因此需要对日期做一些专门的处理。

    通过上述代码,我们知道,修改函数np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)中的参数 usecols=(6,7)就可以读取不同的列,日期是在第2列,即下标应该为1(数列下标是从0开始的),可以重新定义新日期数列并获取后存入。

    代码如下:

    dates, c=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), unpack=True) #读取下标为1、6的数据,分别存入到dates和c数列中。

    但实际运行过程中会报错,

    Python数据分析之NumPy常用函数使用详解

    代码需要作如下修改:

    import numpy as np
    from datetime import datetime
    
    def datestr2num(s): #定义一个函数
        return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()  
    #decode('ascii') 将字符串s转化为ascii码
    
    #读取csv文件
    dates,close=np.loadtxt('data.csv',delimiter=',', usecols=(1,6),converters={1:datestr2num},unpack=True)
    print(dates)

    运行结果:[4. 5. 6. 0. 1. 2. 3.],也是从0开始,到6结束。为了更好地说明数据,可以采用真实的数据,即从通信达软件直接下载真实的交易数据,如下图所示:

    Python数据分析之NumPy常用函数使用详解

    (注意:较原来少了一列空格列)

    修改代码如下:

    import numpy as np
    from datetime import datetime
    
    def datestr2num(s): #定义一个函数
        return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()  
    #decode('ascii') 将字符串s转化为ascii码
    
    #读取csv文件
    dates,c=np.loadtxt('data.csv',delimiter=',', usecols=(1,5),
                           converters={1:datestr2num},unpack=True)
    print(dates)
    
    print(len(dates)) #统计导出的天数

    运行结果:

    Python数据分析之NumPy常用函数使用详解

    如上图,导出有420天数据。

    按周一到周五,统计相关数据:

    averages = np.zeros(5) #创建包含5个元素的数组,保存交易日收盘价,0-4分别代表周一到周五五个交易日
    for i in range(5):  #遍历0到4的日期标识
        indices =np.where(dates==i)   #where函数得到各工作日的索引值并存储在 indices 数组
        prices=np.take(c,indices)   #take函数获取各个工作日的收盘价。
        avg= np.mean(prices) #每个工作日计算出平均值存放在 averages 数组
        averages[i] = avg  #每个工作日计算出平均值存放在 averages 数组
        print('day', i)
        #print('prices', prices)
        print("Average", avg)
    
    print(averages)

    当然除了上述外,还可以求得420天里的最大值、最小值以及交易日平均值中最大值、最小值等,对代码进行如下修:

    import numpy as np
    from datetime import datetime
    
    def datestr2num(s): #定义一个函数
        return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()  
    #decode('ascii') 将字符串s转化为ascii码
    
    #读取csv文件
    dates,c=np.loadtxt('data.csv',delimiter=',', usecols=(1,5),
                           converters={1:datestr2num},unpack=True)
    
    averages = np.zeros(5) #创建包含5个元素的数组,保存交易日收盘价,0-4分别代表周一到周五五个交易日
    for i in range(5):  #遍历0到4的日期标识
        indices =np.where(dates==i)   #where函数得到各工作日的索引值并存储在 indices 数组
        prices=np.take(c,indices)   #take函数获取各个工作日的收盘价。
        avg= np.mean(prices) 
        averages[i] = avg  #每个工作日计算出平均值存放在 averages 数组,共有5个数值
        print('day', i)
        #print('prices', prices)
        print("Average", avg)
    
    print(averages)
    print('\n')
    
    print('the top close price:',np.max(c)) #最高收盘价
    print('the low close price:',np.min(c)) #最低收盘价
    print('\n')
    
    top = np.max(averages)  #找出averages数列中的最大值
    print ("Highest average", top)
    print ("Top day of the week", np.argmax(averages)) #argmax函数返回的是averages数组中最大元素的索引值
    print('\n')
    
    bottom = np.min(averages) #找出averages数列中的最小值
    print ("Lowest average", bottom)
    print ( "Bottom day of the week", np.argmin(averages))#argmin函数返回的是averages数组中最小元素的索引值

    运行结果如下:

    Python数据分析之NumPy常用函数使用详解

    总结

    本篇初步导入了真实的股票交易信息,并利用numpy常见函数对进行了初步的计算,列举了下列常用函数:

    loadtxt() 函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。

    savetxt()创建并保存test.txt文件

    np.loadtxt('data.csv', delimiter=',', usecols=(6,7),)usecols参数用来选择读取的数列

    np.average(c, weights=v) 加权平均,将v作为权重参数使用,

    np.mean(c)) #算术平均值

    np.max(h)) #获取最大值max()

    np.min(l)) #获取最小值min()

    np.ptp(h) ) 用ptp()函数计算了极值差,

    np.median(c)) 中位数median()函数,即多个数据中,处于中间的数

    np.msort(c))函数对价格数组进行排序,

    np.var(c) 方差函数var()

    np.diff(c) 函数可以返回一个由相邻数组元素的差值构成的数组

    np.std(results) # 标准差

    np.diff( np.log(c) )

    np.where(results1 > 0) 选择

    np.sqrt()#平方根sqrt(),浮点数

    s.decode('ascii') 将字符串s转化为ascii码

    np.take(c,indices) #take函数获取各个工作日的收盘价。

    np.argmax(averages)) #argmax函数返回数组中最大元素的索引值

    np.argmin(averages))#argmin函数返回数组中最小元素的索引值

    以上就是Python数据分析之NumPy常用函数使用详解的详细内容,更多关于Python NumPy常用函数的资料请关注其它相关文章!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。