0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用Python技術評估蘋果公司股價

馬哥Linux運維 ? 來源:未知 ? 作者:工程師飛燕 ? 2018-07-23 17:00 ? 次閱讀

要點搶先看

1.csv數據的讀取

2.利用常用函數獲取均值、中位數、方差、標準差等統(tǒng)計量

3.利用常用函數分析價格的加權均值、收益率、年化波動率等常用指標 4.處理數據中的日期

我們最后會介紹一下NumPy庫中的一些非常實用和常用的函數方法。

要知道,NumPy的常用數學和統(tǒng)計分析的函數非常多,如果我們一個一個的分散來講,一來非??菰?,二來呢也記不住,就仿佛又回到了昏昏欲睡的課堂,今天我們用一個背景例子來串聯(lián)一下這些零散的知識點。

我們通過分析蘋果公司的股票價格,來串講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

接下來我們進行簡單的統(tǒng)計分析

我們先來求取收盤價的中位數


	
  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

求取方差

另外一個我們關心的統(tǒng)計量就是方差,方差能夠體現變量變化的程度。在我們的例子中,方差還可以告訴我們投資風險的大小。那些股價變動過于劇烈的股票一定會給持有者帶來麻煩


	
  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),)

專業(yè)上我們對價格變動可以用一個叫做“波動率”的指標進行度量。計算歷史波動率時需要用到對數收益率,對數收益率很簡單,就是

我們簡單的看一下下面的代碼


	
  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.即可

我們可以常常會發(fā)現,在數據分析的過程中,對于日期的處理和分析也是一個很重要的內容。

我們先試圖用老辦法來從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'

我們發(fā)現他報錯了,錯誤信息是不能將一個字節(jié)類型的對象轉換為浮點類型對象。原因是因為NumPy是面向浮點數運算的,那么我們對癥下藥,對日期字符串進行一些轉換處理。

我們先假定日期是一個字符串類型(下載網絡數據中往往是將字符串通過utf-8編碼成字節(jié)碼,這個可以見第一季中字符編碼相關內容的介紹)


	
  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變量。

后面的處理就很簡單了,用循環(huán)依次取出每個工作日的收盤價構成的數組,對其求平均值。然后得到周一到周五,五個平均值的最大值、最小值。

最后我們再介紹兩個實用函數,一個是數組的裁剪函數,即把比給定值還小的值設置為給定值,比給定值大的值設置為給定上限


	
  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]

這一小節(jié)中,我們利用NumPy的一些實用函數,對蘋果公司的股價進行了一些非常非常簡單的分析,目的是通過這個實例來串講一下這些實用的數據處理函數。

其實NumPy的功能非常非常多,遠不止這些,但是沒有必要去一個一個學。并且另一方面,NumPy的方法都過于原始和底層,雖然功能很豐富,但是使用起來也很繁雜。這里我們?yōu)榇蠹掖蛞粋€基礎,后面的章節(jié)就不會再一一介紹里面的各種函數了。后面我要介紹基于NumPy之上的一些更高層的方法庫,功能更強大,使用也更簡單。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 蘋果
    +關注

    關注

    61

    文章

    24336

    瀏覽量

    195552
  • python
    +關注

    關注

    55

    文章

    4767

    瀏覽量

    84375

原文標題:用Python分析蘋果公司股價數據

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    蘋果公司股價站上203.51美元,成人類歷史首家萬億美元公司

    北京時間8月3日消息,蘋果在今天成為歷史上首個市值超過1萬億美元的公司。在北京時間8月3日晚間,蘋果公司股價站上203.51美元,總市值超過1萬億美元。
    的頭像 發(fā)表于 08-03 09:55 ?4028次閱讀

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

    蘋果蘋果公司行業(yè)芯事行業(yè)資訊
    新知錄
    發(fā)布于 :2022年07月22日 14:58:34

    蘋果股價跌至半年內最低 到底怎么了?

    泡泡網手機頻道11月19日 據科技新聞網站ArsTecnica報道,蘋果公司股價周五收盤于527.68美元,創(chuàng)下6個月以來最低記錄。自從今年9月份以來,該公司市值已經蒸發(fā)了近20%。蘋果
    發(fā)表于 11-19 19:08

    【轉載】蘋果公司在日本申請iWatch商標

    【轉載】蘋果公司在日本申請iWatch商標 新浪科技訊 北京時間7月1日下午消息,據彭博社報道,在蘋果公司將推出智能手表的消息甚囂塵上之際,該公司在日本申請了iWatch注冊商標。雖然很多業(yè)內人士
    發(fā)表于 07-02 16:35

    蘋果正開發(fā)下一代無線充電技術

    充電技術,這種技術最早可在明年用于其移動設備?!毕⑷耸糠Q,蘋果公司目前正致力于克服技術障礙,并對這種最新技術開發(fā)計劃的其他方面展開
    發(fā)表于 02-01 14:26

    蘋果公司股價也在不斷波動

    “禁令”,這次iphone8雖然出現類似情況,但也不完全相同,如果其在飛機上出現這種問題,航空方面才會有所反應。不過,受困于最近iphone8的一系列表現,蘋果公司股價也在不斷波動,昨日晚間
    發(fā)表于 10-10 14:06

    困獸蘋果何去何從

    ,蘋果公司最大的問題不是出在技術領域,而是高層對產品賣點的認知和定位不準確。他們搞錯了一點:蘋果產品前期的成功靠的是超前創(chuàng)新這個毋庸質疑,但近年快速擴張,贏得今日的市場地位靠的不是技術
    發(fā)表于 08-28 21:04

    蘋果公司為什么要用ARM處理器

      盡管配備了出色的新鍵盤,但經過改進的新版MacBookPro13還是有一個大問題。蘋果再次被迫出售較舊的英特爾處理器。這個問題表明為什么蘋果公司即將改用ARM處理器(傳聞已久,現在已經確定)絕對
    發(fā)表于 06-22 11:21

    蘋果公司成為藍牙技術聯(lián)盟創(chuàng)始成員

    藍牙技術聯(lián)盟(Bluetooth Special Interest Group,簡稱SIG)正式宣布蘋果公司成為藍牙技術聯(lián)盟創(chuàng)始成員(Promoter Member)。在藍牙技術聯(lián)盟的
    發(fā)表于 06-25 14:46 ?1272次閱讀

    iPhone 11銷售速度放慢 蘋果公司股價下跌1%以上

    最新報告顯示,蘋果公司11月在中國市場上的iPhone出貨量同比下降35%以上,這是其中國銷量連續(xù)第二個月出現兩位數的下滑,原因是低價版iPhone 11的銷售表現仍然低迷。受此消息影響,蘋果公司股價下跌1%以上。
    發(fā)表于 12-13 10:12 ?472次閱讀

    高通起訴蘋果公司的專利被判有效率

    蘋果和高通專利訴訟大戰(zhàn)期間(2017年1月至2019年4月間),蘋果公司股價“最低114.76美元,最高233.47美元”,總體走勢是“區(qū)間震蕩”。
    發(fā)表于 02-17 09:42 ?2213次閱讀

    蘋果公司總市值跌破1萬億美元 股價下跌4.83%

    截止北京時間23:12,蘋果公司股價下跌4.83%,股價報218美元,總市值跌破1萬億美元,現市值報9500多億美元。
    的頭像 發(fā)表于 03-24 09:11 ?2968次閱讀
    <b class='flag-5'>蘋果公司</b>總市值跌破1萬億美元 <b class='flag-5'>股價</b>下跌4.83%

    蘋果公司正在研發(fā)的汽車預計2024年上市

    據報道,周一,兩家制造激光雷達傳感器的公司股價迎來飆升。其中,Velodyne 股價周一上漲近 23%,Luminar 上漲超過 27%。此前曾有媒體報道,蘋果公司正在研發(fā)一款汽車,預
    的頭像 發(fā)表于 12-22 09:21 ?1418次閱讀

    A股蘋果供應鏈公司股價大幅下挫

    蘋果公司2021財年第一季度營收首次突破1000億美元大關,創(chuàng)下有史以來最大季度收入。但在好于預期的財報公布之后,好消息沒有推動蘋果股價上漲。蘋果周三盤后
    的頭像 發(fā)表于 01-28 15:08 ?1664次閱讀

    iPhone15發(fā)布會剛開始 蘋果公司股價就在下跌

    2023年的蘋果秋季發(fā)布會已經開始,但是發(fā)布會剛開始,蘋果公司股價卻在下跌,目前跌1.3%,現在iPhone、Watch、AirPods發(fā)布會還在繼續(xù),那股價還會繼續(xù)下跌嗎?不知道庫
    的頭像 發(fā)表于 09-13 01:17 ?488次閱讀
    iPhone15發(fā)布會剛開始 <b class='flag-5'>蘋果公司</b>的<b class='flag-5'>股價</b>就在下跌