(1) 單位矩陣,即主對角線上的元素均爲1,其他元素均爲0的正方形矩陣。
在NumPy中能夠用eye函數建立一個這樣的二維數組,咱們只須要給定一個參數,用於指定矩陣中1的元素個數。
例如,建立3×3的數組:python
import numpy as np I2 = np.eye(3) print(I2)
[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
(2) 使用savetxt函數將數據存儲到文件中,固然咱們須要指定文件名以及要保存的數組。算法
np.savetxt('eye.txt', I2)#建立一個eye.txt文件,用於保存I2的數據
note: ,NumPy中的loadtxt函數能夠方便地讀取CSV文件,自動切分字段,並將數據載入NumPy數組數據庫
c, v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) # usecols的參數爲一個元組,以獲取第7字段至第8字段的數據 # unpack參數設置爲True,意思是分拆存儲不一樣列的數據,即分別將收盤價和成交量的數組賦值給變量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'>
vwap = np.average(c,weights=v) print('成交量加權平均價格vwap =', vwap)
成交量加權平均價格vwap = 350.5895493532009
NumPy中的mean函數能夠計算數組元素的算術平均值函數
print('c數組中元素的算數平均值爲: {}'.format(np.mean(c)))
c數組中元素的算數平均值爲: 351.0376666666667
t = np.arange(len(c)) print('時間加權平均價格twap=', np.average(c, weights=t))
時間加權平均價格twap= 352.4283218390804
h, l = np.loadtxt('data.csv', delimiter=',', usecols=(4,5), unpack=True) print('h數據爲: \n{}'.format(h)) print('-'*10) print('l數據爲: \n{}'.format(l))
h數據爲: [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數據爲: [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數據的最大值爲: {}'.format(np.max(h))) print('l數據的最小值爲: {}'.format(np.min(l)))
h數據的最大值爲: 364.9 l數據的最小值爲: 333.53
print('h數據的最大值-最小值的差值爲: \n{}'.format(np.ptp(h))) print('l數據的最大值-最小值的差值爲: \n{}'.format(np.ptp(l)))
h數據的最大值-最小值的差值爲: 24.859999999999957 l數據的最大值-最小值的差值爲: 26.970000000000027
m = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) print('m數據中的中位數爲: {}'.format(np.median(m)))
m數據中的中位數爲: 352.055
# 數組排序後,查找中位數 sorted_m = np.msort(m) print('m數據排序: \n{}'.format(sorted_m)) N = len(c) print('m數據中的中位數爲: {}'.format((sorted_m[N//2]+sorted_m[(N-1)//2])/2))
m數據排序: [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數據中的中位數爲: 352.055
print('variance =', np.var(m))
variance = 50.126517888888884
var_hand = np.mean((m-m.mean())**2) print('var =', var_hand)
var = 50.126517888888884
注意:樣本方差和整體方差在計算上的區別。整體方差是用數據個數去除離差平方和,而樣本方差則是用樣本數據個數減1去除離差平方和,其中樣本數據個數減1(即n-1)稱爲自由度。之因此有這樣的差異,是爲了保證樣本方差是一個無偏估計量。學習
在學術文獻中,收盤價的分析經常是基於股票收益率和對數收益率的。
簡單收益率是指相鄰兩個價格之間的變化率,而對數收益率是指全部價格取對數後兩兩之間的差值。
咱們在高中學習過對數的知識,「a」的對數減去「b」的對數就等於「a除以b」的對數。所以,對數收益率也能夠用來衡量價格的變化率。
注意,因爲收益率是一個比值,例如咱們用美圓除以美圓(也能夠是其餘貨幣單位),所以它是無量綱的。
總之,投資者最感興趣的是收益率的方差或標準差,由於這表明着投資風險的大小。spa
(1) 首先,咱們來計算簡單收益率。NumPy中的diff函數能夠返回一個由相鄰數組元素的差值構成的數組。這有點相似於微積分中的微分。爲了計算收益率,咱們還須要用差值除之前一天的價格。不過這裏要注意,diff返回的數組比收盤價數組少一個元素。returns = np.diff(arr)/arr[:-1]
注意,咱們沒有用收盤價數組中的最後一個值作除數。接下來,用std函數計算標準差:
print ("Standard deviation =", np.std(returns))code
(2) 對數收益率計算起來甚至更簡單一些。咱們先用log函數獲得每個收盤價的對數,再對結果使用diff函數便可。
logreturns = np.diff( np.log(c) )
通常狀況下,咱們應檢查輸入數組以確保其不含有零和負數。不然,將獲得一個錯誤提示。不過在咱們的例子中,股價總爲正值,因此能夠將檢查省略掉。orm
(3) 咱們極可能對哪些交易日的收益率爲正值很是感興趣。
在完成了前面的步驟以後,咱們只須要用where函數就能夠作到這一點。where函數能夠根據指定的條件返回全部知足條件的數組元素的索引值。
輸入以下代碼:
posretindices = np.where(returns > 0)
print "Indices with positive returns", posretindices
便可輸出該數組中全部正值元素的索引。
Indices with positive returns (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28]),)blog
(4) 在投資學中,波動率(volatility)是對價格變更的一種度量。歷史波動率能夠根據歷史價格數據計算得出。計算曆史波動率(如年波動率或月波動率)時,須要用到對數收益率。年波動率等於對數收益率的標準差除以其均值,再除以交易日倒數的平方根,一般交易日取252天。
用std和mean函數來計算,代碼以下所示:
annual_volatility = np.std(logreturns)/np.mean(logreturns)
annual_volatility = annual_volatility / np.sqrt(1./252.)
(5) sqrt函數中的除法運算。在Python中,整數的除法和浮點數的除法運算機制不一樣(python3已修改該功能),咱們必須使用浮點數才能獲得正確的結果。與計算年波動率的方法相似,計算月波動率以下:
annual_volatility * np.sqrt(1./12.)
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) returns = np.diff(c)/c[:-1] print('returns的標準差: {}'.format(np.std(returns))) logreturns = np.diff(np.log(c)) posretindices = np.where(returns>0) print('retruns中元素爲正數的位置: \n{}'.format(posretindices)) annual_volatility = np.std(logreturns)/np.mean(logreturns) annual_volatility = annual_volatility/np.sqrt(1/252) print('每一年波動率: {}'.format(annual_volatility)) print('每個月波動率:{}'.format(annual_volatility*np.sqrt(1/12)))
returns的標準差: 0.012922134436826306 retruns中元素爲正數的位置: (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28], dtype=int64),) 每一年波動率: 129.27478991115132 每個月波動率:37.318417377317765
本文參考《Python數據分析基礎教程:NumPy學習指南》