0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Python技术评估苹果公司股价

马哥Linux运维 来源:未知 作者:工程师飞燕 2018-07-23 17:00 次阅读

要点抢先看

1.csv数据的读取

2.利用常用函数获取均值、中位数、方差、标准差等统计量

3.利用常用函数分析价格的加权均值、收益率、年化波动率等常用指标 4.处理数据中的日期

我们最后会介绍一下NumPy库中的一些非常实用和常用的函数方法。

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

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

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

如何利用Python技术评估苹果公司股价

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

如何利用Python技术评估苹果公司股价

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


	
  1. import numpy as np

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

  3. print(c)

  4. print(v)

  5. [178.02178.65178.44179.97181.72179.98176.94175.03176.67 176.82176.21175. 178.12178.39178.97175.5 172.5 171.07 171.85172.43172.99167.37164.34162.71156.41155.15159.54 163.03156.49160.5 167.78167.43166.97167.96171.51171.11 174.22177.04177. 178.46179.26179.1 176.19177.09175.28 174.29174.33174.35175. 173.03172.23172.26169.23171.08 170.6 170.57175.01175.01174.35174.54176.42]

  6. [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中了。

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

第一种,非常简单,就是我们最常见到的算数平均值


	
  1. import numpy as np

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

  3. mean_c = np.mean(c)print(mean_c)

  4. 172.614918033

第二种,是加权平均值,我们用成交量来加权平均价格

即,用成交量的值来作为权重,某个价格的成交量越高,该价格所占的权重就越大。


	
  1. import numpy as np

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

  3. vwap = np.average(c, weights=v)

  4. print(vwap)

  5. 170.950010035

再来说说取值范围,找找最大值和最小值

我们找找收盘价的最大值和最小值,以及最大值和最小值之间的差异


	
  1. import numpy as np

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

  3. print(np.max(c))

  4. print(np.min(c))

  5. print(np.ptp(c))

  6. 181.72

  7. 155.15

  8. 26.57

接下来我们进行简单的统计分析

我们先来求取收盘价的中位数


	
  1. import numpy as np

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

  3. print(np.max(c))

  4. print(np.min(c))

  5. print(np.median(c))

  6. 181.72

  7. 155.15

  8. 174.35

求取方差

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


	
  1. import numpy as np

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

  3. print(np.var(c))

  4. 37.5985528621

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


	
  1. import numpy as np

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

  3. print(np.mean((c - c.mean())**2))

  4. 37.5985528621

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

现在我们来看看每天的收益率,这个计算式子很简单:

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


	
  1. import numpy as np

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

  3. returns =-np.diff(c)/c[1:]

  4. print(returns)

  5. [-0.003526450.00117687-0.00850142-0.0096302 0.009667740.01718097 0.01091242-0.00928284-0.000848320.003461780.00691429-0.01751628-0.00151354-0.003240770.019772080.0173913 0.00835915-0.00453884-0.00336368-0.003237180.0335783 0.018437390.010017820.04027875 0.00812117-0.02751661-0.0214071 0.04179181-0.02498442-0.04339015 0.002090430.00275499-0.00589426-0.0206985 0.00233768-0.01785099-0.0159286 0.00022599-0.00818111-0.004462790.000893360.01651626-0.005082160.010326340.00568019-0.00022945-0.00011471-0.00371429 0.011385310.00464495-0.000174160.01790463-0.010813650.0028136 0.00017588-0.02536998-0. 0.00378549-0.00108858-0.01065639]

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


	
  1. import numpy as np

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

  3. returns =-np.diff(c)/c[1:]

  4. print(np.std(returns))

  5. 0.0150780328454

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


	
  1. import numpy as np

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

  3. returns =-np.diff(c)/c[1:]

  4. print(np.where(returns>0))

  5. (array([1,4,5,6,9,10,14,15,16,20,21,22,23,24,27,30,31,34,37,40,41,43,44,48,49,51,53,54,57], dtype=int64),)

专业上我们对价格变动可以用一个叫做“波动率”的指标进行度量。计算历史波动率时需要用到对数收益率,对数收益率很简单,就是

我们简单的看一下下面的代码


	
  1. import numpy as np

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

  3. logreturns =-np.diff(np.log(c))

  4. volatility = np.std(logreturns)/ np.mean(logreturns)

  5. annual_volatility = volatility / np.sqrt(1./252.)

  6. print(volatility)

  7. print(annual_volatility)

  8. 100.096757388

  9. 1588.98676256

这里我们再强调一点就是:sqrt方法中应用了除法计算,这里必须使用浮点数进行运算。月度波动率也是同理用1./12.即可

我们可以常常会发现,在数据分析的过程中,对于日期的处理和分析也是一个很重要的内容。

我们先试图用老办法来从csv文件中把日期数据读出来


	
  1. import numpy as np

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

  3. Traceback(most recent call last):

  4. File"E:/12homework/12homework.py", line 2,in

  5. dates,c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(0,1), unpack=True)

  6. File"C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 930,in loadtxt

  7. items =[conv(val)for(conv, val)in zip(converters, vals)]

  8. File"C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 930,in

  9. items =[conv(val)for(conv, val)in zip(converters, vals)]

  10. File"C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 659,in floatconv

  11. returnfloat(x)

  12. ValueError: could not convert string to float: b'2018/3/16'

我们发现他报错了,错误信息是不能将一个字节类型的对象转换为浮点类型对象。原因是因为NumPy是面向浮点数运算的,那么我们对症下药,对日期字符串进行一些转换处理。

我们先假定日期是一个字符串类型(下载网络数据中往往是将字符串通过utf-8编码成字节码,这个可以见第一季中字符编码相关内容的介绍)


	
  1. import numpy as np import datetime

  2. strdate ='2017/3/16'

  3. d = datetime.datetime.strptime(strdate,'%Y/%m/%d')

  4. print(type(d))

  5. print(d)

  6. <class'datetime.datetime'>

  7. 2017-03-1600:00:00

通过python标准库中的datetime函数包,我们通过指定匹配的格式%Y/%m/%d

将日期字符串转换为了datetime类型对象,Y大写匹配完整的四位数记年,y小写就是两位数,例如17。

datetime对象有一个date方法,把datetime对象中的time部分去掉,变成一个纯的日期,再调用weekday可以转换为一周中的第几天,这里是从周日开始算起的。


	
  1. import numpy as np import datetime

  2. strdate ='2018/3/16'

  3. d = datetime.datetime.strptime(strdate,'%Y/%m/%d')

  4. print(d.date())

  5. print(d.date().weekday())

  6. 2018-03-164

最后,我们回到这份苹果公司股价的csv文件,来做一个综合分析,来看看周几的平均收盘价最高,周几的最低:


	
  1. import numpy as np import datetime

  2. def datestr2num(bytedate):

  3. return datetime.datetime.strptime(

  4. bytedate.decode('utf-8'),'%Y/%m/%d').date().weekday()

  5. dates,c = np.loadtxt('AAPL.csv', delimiter=',', usecols=(0,1),

  6. converters={0: datestr2num}, unpack=True)

  7. averages = np.zeros(5)

  8. for i in range(5):

  9. index = np.where(dates == i)

  10. prices = np.take(c, index)

  11. avg = np.mean(prices)

  12. averages[i]= avg print("Day {} prices: {},avg={}".format(i,prices,avg))

  13. top = np.max(averages)

  14. top_index = np.argmax(averages)

  15. bot = np.min(averages)

  16. bot_index = np.argmin(averages)

  17. print('highest:{}, top day is {}'.format(top,top_index))

  18. print('lowest:{},bottom day is {}'.format(bot,bot_index))

  19. Day0 prices:[[181.72176.82178.97162.71156.49167.96177. 174.35176.42]],avg=172.49333333333334

  20. Day1 prices:[[179.97176.67178.39171.85164.34163.03166.97177.04176.19 174.33172.26170.57174.54]],avg=172.78076923076924

  21. Day2 prices:[[178.44175.03178.12171.07167.37159.54167.43174.22179.1 174.29172.23170.6 174.35]],avg=172.44538461538463

  22. Day3 prices:[[178.65176.94175. 172.5 172.99155.15167.78171.11179.26 175.28173.03171.08175.01]],avg=172.59846153846152

  23. Day4 prices:[[178.02179.98176.21175.5 172.43156.41160.5 171.51178.46 177.09175. 169.23175.01]],avg=172.71923076923073

  24. highest:172.78076923076924, top day is1

  25. lowest:172.44538461538463,bottom day is2

简要的再分析一下:由于从csv中读取的数据类型为bytes,所以我们写了一个转换函数,先将bytes类型的日期数据进行解码(字符串编解码详见第一季),然后再用上一段程序介绍的方法转换为一个表示周几的数字

而np.loadtxt函数中的参数converters={0: datestr2num},就是说针对第一列的数据,我们利用这个转换函数将其转化为一个数字,并将这个整形元素构成的数组赋值给dates变量。

后面的处理就很简单了,用循环依次取出每个工作日的收盘价构成的数组,对其求平均值。然后得到周一到周五,五个平均值的最大值、最小值。

最后我们再介绍两个实用函数,一个是数组的裁剪函数,即把比给定值还小的值设置为给定值,比给定值大的值设置为给定上限


	
  1. import numpy as np

  2. a = np.arange(5)

  3. print(a.clip(1,3))

  4. [11233]

第二个是一个筛选函数,返回一个根据给定条件筛选后得到的结果数组


	
  1. import numpy as np

  2. a = np.arange(5)

  3. print(a.compress(a >2))

  4. [34]

这一小节中,我们利用NumPy的一些实用函数,对苹果公司的股价进行了一些非常非常简单的分析,目的是通过这个实例来串讲一下这些实用的数据处理函数。

其实NumPy的功能非常非常多,远不止这些,但是没有必要去一个一个学。并且另一方面,NumPy的方法都过于原始和底层,虽然功能很丰富,但是使用起来也很繁杂。这里我们为大家打一个基础,后面的章节就不会再一一介绍里面的各种函数了。后面我要介绍基于NumPy之上的一些更高层的方法库,功能更强大,使用也更简单。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 苹果
    +关注

    关注

    61

    文章

    23669

    浏览量

    191597
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83465

原文标题:用Python分析苹果公司股价数据

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    苹果公司股价站上203.51美元,成人类历史首家万亿美元公司

    北京时间8月3日消息,苹果在今天成为历史上首个市值超过1万亿美元的公司。在北京时间8月3日晚间,苹果公司股价站上203.51美元,总市值超过1万亿美元。
    的头像 发表于 08-03 09:55 3838次阅读

    苹果王者地位不保 石油巨头沙特阿美超越苹果公司,成为全球市值最高上市公司

    苹果苹果公司行业芯事行业资讯
    新知录
    发布于 :2022年07月22日 14:58:34

    苹果股价跌至半年内最低 到底怎么了?

    泡泡网手机频道11月19日 据科技新闻网站ArsTecnica报道,苹果公司股价周五收盘于527.68美元,创下6个月以来最低记录。自从今年9月份以来,该公司市值已经蒸发了近20%。苹果
    发表于 11-19 19:08

    【转载】苹果公司在日本申请iWatch商标

    【转载】苹果公司在日本申请iWatch商标 新浪科技讯 北京时间7月1日下午消息,据彭博社报道,在苹果公司将推出智能手表的消息甚嚣尘上之际,该公司在日本申请了iWatch注册商标。虽然很多业内人士
    发表于 07-02 16:35

    苹果正开发下一代无线充电技术

    充电技术,这种技术最早可在明年用于其移动设备。”消息人士称,苹果公司目前正致力于克服技术障碍,并对这种最新技术开发计划的其他方面展开
    发表于 02-01 14:26

    苹果公司股价也在不断波动

    “禁令”,这次iphone8虽然出现类似情况,但也不完全相同,如果其在飞机上出现这种问题,航空方面才会有所反应。不过,受困于最近iphone8的一系列表现,苹果公司股价也在不断波动,昨日晚间
    发表于 10-10 14:06

    苹果公司为什么要用ARM处理器

      尽管配备了出色的新键盘,但经过改进的新版MacBookPro13还是有一个大问题。苹果再次被迫出售较旧的英特尔处理器。这个问题表明为什么苹果公司即将改用ARM处理器(传闻已久,现在已经确定)绝对
    发表于 06-22 11:21

    因为iPhone8首销不给力,苹果股价遭遇滑铁卢

    美国苹果公司的新品发布会并没有给公司股价带来提振。上周,苹果股价累计下跌近5%,连续下跌令其市值蒸发超过430亿美元,相当于一个eBay的市
    发表于 09-26 14:37 437次阅读

    苹果公司或将开发新型屏下指纹触控技术

    知情人士透露,苹果公司正在开发屏下指纹技术,最早将应用于2020版iPhone,该技术正在苹果内部和海外供应商之间进行测试,但其发布的时间表也可能推迟到2021年的iPhone更新。
    发表于 09-09 15:59 847次阅读

    iPhone 11销售速度放慢 苹果公司股价下跌1%以上

    最新报告显示,苹果公司11月在中国市场上的iPhone出货量同比下降35%以上,这是其中国销量连续第二个月出现两位数的下滑,原因是低价版iPhone 11的销售表现仍然低迷。受此消息影响,苹果公司股价下跌1%以上。
    发表于 12-13 10:12 403次阅读

    高通起诉苹果公司的专利被判有效率

    苹果和高通专利诉讼大战期间(2017年1月至2019年4月间),苹果公司股价“最低114.76美元,最高233.47美元”,总体走势是“区间震荡”。
    发表于 02-17 09:42 2150次阅读

    苹果公司总市值跌破1万亿美元 股价下跌4.83%

    截止北京时间23:12,苹果公司股价下跌4.83%,股价报218美元,总市值跌破1万亿美元,现市值报9500多亿美元。
    的头像 发表于 03-24 09:11 2730次阅读
    <b class='flag-5'>苹果公司</b>总市值跌破1万亿美元 <b class='flag-5'>股价</b>下跌4.83%

    A股苹果供应链公司股价大幅下挫

    苹果公司2021财年第一季度营收首次突破1000亿美元大关,创下有史以来最大季度收入。但在好于预期的财报公布之后,好消息没有推动苹果股价上涨。苹果周三盘后
    的头像 发表于 01-28 15:08 1537次阅读

    苹果公司被指窃密遭索赔31亿美元

    苹果公司挖走员工和窃取商业秘密,包括苹果申请的脉搏血氧仪专利,这些技术用于开发 Apple Watch。而前Masimo 员工在为 Apple Watch工作时到底是否泄露了Masimo的商业机密则是双方争议的焦点。
    的头像 发表于 04-19 18:27 1528次阅读

    iPhone15发布会刚开始 苹果公司股价就在下跌

    2023年的苹果秋季发布会已经开始,但是发布会刚开始,苹果公司股价却在下跌,目前跌1.3%,现在iPhone、Watch、AirPods发布会还在继续,那股价还会继续下跌吗?不知道库
    的头像 发表于 09-13 01:17 342次阅读
    iPhone15发布会刚开始 <b class='flag-5'>苹果公司</b>的<b class='flag-5'>股价</b>就在下跌