關(guān)于Python常用函數(shù)中NumPy的使用
1. txt文件
(1) 單位矩陣
即主對(duì)角線上的元素均為1,其余元素均為0的正方形矩陣。
在NumPy中可以用eye函數(shù)創(chuàng)建一個(gè)這樣的二維數(shù)組,我們只需要給定一個(gè)參數(shù),用于指定矩陣中1的元素個(gè)數(shù)。
例如,創(chuàng)建3×3的數(shù)組:
import numpy as np I2 = np.eye(3) print(I2) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
(2) 使用savetxt函數(shù)將數(shù)據(jù)存儲(chǔ)到文件中,當(dāng)然我們需要指定文件名以及要保存的數(shù)組。
np.savetxt('eye.txt', I2)#創(chuàng)建一個(gè)eye.txt文件,用于保存I2的數(shù)據(jù)
2. CSV文件
CSV(Comma-Separated Value,逗號(hào)分隔值)格式是一種常見的文件格式;通常,數(shù)據(jù)庫(kù)的轉(zhuǎn)存文件就是CSV格式的,文件中的各個(gè)字段對(duì)應(yīng)于數(shù)據(jù)庫(kù)表中的列;電子表格軟件(如Microsoft Excel)可以處理CSV文件。
note: ,NumPy中的loadtxt函數(shù)可以方便地讀取CSV文件,自動(dòng)切分字段,并將數(shù)據(jù)載入NumPy數(shù)組
data.csv的數(shù)據(jù)內(nèi)容:
c, v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) # usecols的參數(shù)為一個(gè)元組,以獲取第7字段至第8字段的數(shù)據(jù) # unpack參數(shù)設(shè)置為True,意思是分拆存儲(chǔ)不同列的數(shù)據(jù),即分別將收盤價(jià)和成交量的數(shù)組賦值給變量c和v print(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(v) [21144800. 13473000. 15236800. 9242600. 14064100. 11494200. 17322100. 13608500. 17240800. 33162400. 13127500. 11086200. 10149000. 17184100. 18949000. 29144500. 31162200. 23994700. 17853500. 13572000. 14395400. 16290300. 21521000. 17885200. 16188000. 19504300. 12718000. 16192700. 18138800. 16824200.] print(type(c)) print(type(v)) <class 'numpy.ndarray'> <class 'numpy.ndarray'>
3.成交量加權(quán)平均價(jià)格 = average()函數(shù)
VWAP概述:VWAP(Volume-Weighted Average Price,成交量加權(quán)平均價(jià)格)是一個(gè)非常重要的經(jīng)濟(jì)學(xué)量,它代表著金融資產(chǎn)的“平均”價(jià)格。
某個(gè)價(jià)格的成交量越高,該價(jià)格所占的權(quán)重就越大。
VWAP就是以成交量為權(quán)重計(jì)算出來(lái)的加權(quán)平均值,常用于算法交易。
vwap = np.average(c,weights=v) print('成交量加權(quán)平均價(jià)格vwap =', vwap) 成交量加權(quán)平均價(jià)格vwap = 350.5895493532009
4. 算數(shù)平均值函數(shù) = mean()函數(shù)
NumPy中的mean函數(shù)可以計(jì)算數(shù)組元素的算術(shù)平均值
print('c數(shù)組中元素的算數(shù)平均值為: {}'.format(np.mean(c))) c數(shù)組中元素的算數(shù)平均值為: 351.0376666666667
5. 時(shí)間加權(quán)平均價(jià)格
TWAP概述:
在經(jīng)濟(jì)學(xué)中,TWAP(Time-Weighted Average Price,時(shí)間加權(quán)平均價(jià)格)是另一種“平均”價(jià)格的指標(biāo)。既然我們已經(jīng)計(jì)算了VWAP,那也來(lái)計(jì)算一下TWAP吧。其實(shí)TWAP只是一個(gè)變種而已,基本的思想就是最近的價(jià)格重要性大一些,所以我們應(yīng)該對(duì)近期的價(jià)格給以較高的權(quán)重。最簡(jiǎn)單的方法就是用arange函數(shù)創(chuàng)建一個(gè)從0開始依次增長(zhǎng)的自然數(shù)序列,自然數(shù)的個(gè)數(shù)即為收盤價(jià)的個(gè)數(shù)。當(dāng)然,這并不一定是正確的計(jì)算TWAP的方式。
t = np.arange(len(c)) print('時(shí)間加權(quán)平均價(jià)格twap=', np.average(c, weights=t)) 時(shí)間加權(quán)平均價(jià)格twap= 352.4283218390804
6. 最大值和最小值
h, l = np.loadtxt('data.csv', delimiter=',', usecols=(4,5), unpack=True) print('h數(shù)據(jù)為: \n{}'.format(h)) print('-'*10) print('l數(shù)據(jù)為: \n{}'.format(l)) h數(shù)據(jù)為: [344.4 340.04 345.65 345.25 344.24 346.7 353.25 355.52 359. 360. 357.8 359.48 359.97 364.9 360.27 359.5 345.4 344.64 345.15 348.43 355.05 355.72 354.35 359.79 360.29 361.67 357.4 354.76 349.77 352.32] ---------- l數(shù)據(jù)為: [333.53 334.3 340.98 343.55 338.55 343.51 347.64 352.15 354.87 348. 353.54 356.71 357.55 360.5 356.52 349.52 337.72 338.61 338.37 344.8 351.12 347.68 348.4 355.92 357.75 351.31 352.25 350.6 344.9 345. ] print('h數(shù)據(jù)的最大值為: {}'.format(np.max(h))) print('l數(shù)據(jù)的最小值為: {}'.format(np.min(l))) h數(shù)據(jù)的最大值為: 364.9 l數(shù)據(jù)的最小值為: 333.53 NumPy中有一個(gè)ptp函數(shù)可以計(jì)算數(shù)組的取值范圍 該函數(shù)返回的是數(shù)組元素的最大值和最小值之間的差值 也就是說(shuō),返回值等于max(array) - min(array) print('h數(shù)據(jù)的最大值-最小值的差值為: \n{}'.format(np.ptp(h))) print('l數(shù)據(jù)的最大值-最小值的差值為: \n{}'.format(np.ptp(l))) h數(shù)據(jù)的最大值-最小值的差值為: 24.859999999999957 l數(shù)據(jù)的最大值-最小值的差值為: 26.970000000000027
7. 統(tǒng)計(jì)分析
中位數(shù):我們可以用一些閾值來(lái)除去異常值,但其實(shí)有更好的方法,那就是中位數(shù)。
將各個(gè)變量值按大小順序排列起來(lái),形成一個(gè)數(shù)列,居于數(shù)列中間位置的那個(gè)數(shù)即為中位數(shù)。
例如,我們有1、2、3、4、5這5個(gè)數(shù)值,那么中位數(shù)就是中間的數(shù)字3。
m = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) print('m數(shù)據(jù)中的中位數(shù)為: {}'.format(np.median(m))) m數(shù)據(jù)中的中位數(shù)為: 352.055 # 數(shù)組排序后,查找中位數(shù) sorted_m = np.msort(m) print('m數(shù)據(jù)排序: \n{}'.format(sorted_m)) N = len(c) print('m數(shù)據(jù)中的中位數(shù)為: {}'.format((sorted_m[N//2]+sorted_m[(N-1)//2])/2)) m數(shù)據(jù)排序: [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] m數(shù)據(jù)中的中位數(shù)為: 352.055 方差: 方差是指各個(gè)數(shù)據(jù)與所有數(shù)據(jù)算術(shù)平均數(shù)的離差平方和除以數(shù)據(jù)個(gè)數(shù)所得到的值。 print('variance =', np.var(m)) variance = 50.126517888888884 var_hand = np.mean((m-m.mean())**2) print('var =', var_hand) var = 50.126517888888884
注意:樣本方差和總體方差在計(jì)算上的區(qū)別??傮w方差是用數(shù)據(jù)個(gè)數(shù)去除離差平方和,而樣本方差則是用樣本數(shù)據(jù)個(gè)數(shù)減1去除離差平方和,其中樣本數(shù)據(jù)個(gè)數(shù)減1(即n-1)稱為自由度。之所以有這樣的差別,是為了保證樣本方差是一個(gè)無(wú)偏估計(jì)量。
8. 股票收益率
在學(xué)術(shù)文獻(xiàn)中,收盤價(jià)的分析常常是基于股票收益率和對(duì)數(shù)收益率的。
簡(jiǎn)單收益率是指相鄰兩個(gè)價(jià)格之間的變化率,而對(duì)數(shù)收益率是指所有價(jià)格取對(duì)數(shù)后兩兩之間的差值。
我們?cè)诟咧袑W(xué)習(xí)過(guò)對(duì)數(shù)的知識(shí),“a”的對(duì)數(shù)減去“b”的對(duì)數(shù)就等于“a除以b”的對(duì)數(shù)。因此,對(duì)數(shù)收益率也可以用來(lái)衡量?jī)r(jià)格的變化率。
注意,由于收益率是一個(gè)比值,例如我們用美元除以美元(也可以是其他貨幣單位),因此它是無(wú)量綱的。
總之,投資者最感興趣的是收益率的方差或標(biāo)準(zhǔn)差,因?yàn)檫@代表著投資風(fēng)險(xiǎn)的大小。
(1) 首先,我們來(lái)計(jì)算簡(jiǎn)單收益率。NumPy中的diff函數(shù)可以返回一個(gè)由相鄰數(shù)組元素的差值構(gòu)成的數(shù)組。這有點(diǎn)類似于微積分中的微分。為了計(jì)算收益率,我們還需要用差值除以前一天的價(jià)格。不過(guò)這里要注意,diff返回的數(shù)組比收盤價(jià)數(shù)組少一個(gè)元素。returns = np.diff(arr)/arr[:-1]
注意,我們沒(méi)有用收盤價(jià)數(shù)組中的最后一個(gè)值做除數(shù)。接下來(lái),用std函數(shù)計(jì)算標(biāo)準(zhǔn)差:
print ("Standard deviation =", np.std(returns))
(2) 對(duì)數(shù)收益率計(jì)算起來(lái)甚至更簡(jiǎn)單一些。我們先用log函數(shù)得到每一個(gè)收盤價(jià)的對(duì)數(shù),再對(duì)結(jié)果使用diff函數(shù)即可。
logreturns = np.diff( np.log(c) )
一般情況下,我們應(yīng)檢查輸入數(shù)組以確保其不含有零和負(fù)數(shù)。否則,將得到一個(gè)錯(cuò)誤提示。不過(guò)在我們的例子中,股價(jià)總為正值,所以可以將檢查省略掉。
(3) 我們很可能對(duì)哪些交易日的收益率為正值非常感興趣。
在完成了前面的步驟之后,我們只需要用where函數(shù)就可以做到這一點(diǎn)。where函數(shù)可以根據(jù)指定的條件返回所有滿足條件的數(shù)組元素的索引值。
輸入如下代碼:
posretindices = np.where(returns > 0) print "Indices with positive returns", posretindices 即可輸出該數(shù)組中所有正值元素的索引。 Indices with positive returns (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28]),)
(4) 在投資學(xué)中,波動(dòng)率(volatility)是對(duì)價(jià)格變動(dòng)的一種度量。歷史波動(dòng)率可以根據(jù)歷史價(jià)格數(shù)據(jù)計(jì)算得出。計(jì)算歷史波動(dòng)率(如年波動(dòng)率或月波動(dòng)率)時(shí),需要用到對(duì)數(shù)收益率。年波動(dòng)率等于對(duì)數(shù)收益率的標(biāo)準(zhǔn)差除以其均值,再除以交易日倒數(shù)的平方根,通常交易日取252天。用std和mean函數(shù)來(lái)計(jì)算
代碼如下所示:
annual_volatility = np.std(logreturns)/np.mean(logreturns) annual_volatility = annual_volatility / np.sqrt(1./252.)
(5) sqrt函數(shù)中的除法運(yùn)算。在Python中,整數(shù)的除法和浮點(diǎn)數(shù)的除法運(yùn)算機(jī)制不同(python3已修改該功能),我們必須使用浮點(diǎn)數(shù)才能得到正確的結(jié)果。與計(jì)算年波動(dòng)率的方法類似,計(jì)算月波動(dòng)率如下:
annual_volatility * np.sqrt(1./12.) c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) returns = np.diff(c)/c[:-1] print('returns的標(biāo)準(zhǔn)差: {}'.format(np.std(returns))) logreturns = np.diff(np.log(c)) posretindices = np.where(returns>0) print('retruns中元素為正數(shù)的位置: \n{}'.format(posretindices)) annual_volatility = np.std(logreturns)/np.mean(logreturns) annual_volatility = annual_volatility/np.sqrt(1/252) print('每年波動(dòng)率: {}'.format(annual_volatility)) print('每月波動(dòng)率:{}'.format(annual_volatility*np.sqrt(1/12))) returns的標(biāo)準(zhǔn)差: 0.012922134436826306 retruns中元素為正數(shù)的位置: (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28], dtype=int64),) 每年波動(dòng)率: 129.27478991115132 每月波動(dòng)率:37.318417377317765 本文參考《Python數(shù)據(jù)分析基礎(chǔ)教程:NumPy學(xué)習(xí)指南》
到此這篇關(guān)于關(guān)于Python常用函數(shù)中NumPy的使用的文章就介紹到這了,更多相關(guān)Python常用函數(shù)NumPy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中l(wèi)ambda的用法及其與def的區(qū)別解析
這篇文章主要介紹了Python中l(wèi)ambda的用法及其與def的區(qū)別解析,需要的朋友可以參考下2014-07-07如何通過(guò)python的fabric包完成代碼上傳部署
這篇文章主要介紹了如何通過(guò)python的fabric包完成代碼上傳部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy
這篇文章主要介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy,爬蟲框架是實(shí)現(xiàn)爬蟲功能的一個(gè)軟件結(jié)構(gòu)和功能組件的集合,需要的朋友可以參考下2023-04-04淺談Python 釘釘報(bào)警必備知識(shí)系統(tǒng)講解
這篇文章主要介紹了淺談Python 釘釘報(bào)警必備知識(shí)系統(tǒng)講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python中matplotlib實(shí)現(xiàn)隨鼠標(biāo)滑動(dòng)自動(dòng)標(biāo)注代碼
這篇文章主要介紹了python中matplotlib實(shí)現(xiàn)隨鼠標(biāo)滑動(dòng)自動(dòng)標(biāo)注代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04