基於numpy 的統計分析
阿新 • • 發佈:2018-12-12
注:本文一下程式碼均在jupter notebook中完成
一、檔案讀寫
1.利用savetxt函式將資料儲存到檔案
語法:np.savetxt(filename,data)
import numpy as np #匯入模組
#準備一個數據 data
arr=np.array(range(6))
arr
np.savetxt('arr.txt',arr) #執行 arr儲存到當前資料夾中,執行結果是科學計數法
2.讀取csv檔案
語法:loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’) fname:
需求:將CSV檔案(如下圖)中的收盤價和成交量分別放入陣列
#用close這個變數存放收盤價,用amount這個變數來存放成交量
close,amount=np.loadtxt('data.csv',delimiter=',' ,usecols=(6,7),unpack=True,skiprows=1)
#也可以用負值
#close,amount=np.loadtxt('data.csv',delimiter=',',usecols=(-2,-1),unpack=True,skiprows=1)
close #輸出來看一看
array([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])
amount #輸出來看一看
array([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.])
二、基於Numpy的股價統計分析應用
1.利用average函式實現計算成交量加權平均價格
成交量加權平均價格:VWAP(Volume-Weighted Average Price,成交量加權平均價格)是一個非常重要的經濟學量,代表著金融資產的“平均”價格。
某個價格的成交量越高,該價格所佔的權重就越大。所以本需求中需要用成交量為權重,計算價格的平均值。利用average函式完成。
語法:np.average()
# 成交量加權平均價格,計算每一天收盤價的加權平均數
vwap=np.average(close,weights=amount) #weight :權重
vwap #輸出vwap
350.5895493532009
#正常的close收盤價平均數 np.mean()算術平均數
np.mean(close)
351.0376666666667
2.min函式和max函式實現計算最大值和最小值
語法: np.max() 最大值 np.min() 最小值 需求:計算股價近期最高價的最大值和最低價的最小值
#將csv檔案中的最高價用high變數儲存,最低價用low變數儲存
high,low=np.loadtxt('data.csv',delimiter=',',usecols=(4,5),unpack=True,skiprows=1)
np.max(high) #計算最高價中的最大值
364.9
np.min(low)#計算最低價中的最小值
333.53
3.ptp函式計算陣列元素的極差
語法:np.ptp()
np.ptp(high) #計算最高價這一列的極差
24.859999999999957
相當於:
np.max(high)-np.min(high)
24.859999999999957
4.計算收盤價的中位數
語法:np.median()
#求收盤價的中位數
np.median(close)
另一種求中位數的方法:
# 中位數 先排序 再取中間
sorted_close=np.sort(close)
sorted_close.size #看是奇數個還是偶數個
30 #偶數個
#長度
N=sorted_close.size
N1=int((N-1)//2) #取整數部分 #14
N2=int(N/2) #15
#求中位數
(sorted_close[N1]+sorted_close[N2])/2
5.利用方差明確投資風險的大小
方差是指各個資料與所有資料算術平均數的離差平方和除以資料個數所得到的值。 語法:np.var()
# 計算方差 np.var()
np.var(close)
【注】方差越小表示股價越穩定,所以股價變動過於劇烈的股票一定會給持有者製造麻煩。投資需謹慎!!!
6.計算股票收益率、年波動率及月波動率
波動率(volatility)是對價格變動的一種度量。歷史波動率可以根據歷史價格資料計算得出。計算曆史波動率(如年波動率或月波動率)時,需要用到對數收益率。
- 年波動率等於對數收益率的標準差除以其均值,再除以交易日倒數的平方根,通常交易日取252天。
- 月波動率等於對數收益率的標準差除以其均值,再除以交易月 倒數的平方根,交易月為12月。
要用到的變數:
- 對數收益率, logreturns
- 對數收益率的標準差, year_std
- 對數收益率的均值,year_mean
- 交易日倒數的平方根 day_reverse = np.sqrt(1/252)
- 交易月倒數的平方根 month_reverse = np.sqrt(1/12)
# 股票收益率:相鄰兩天的差除以前一天的價格
returns=np.diff(close)/close[:-1]
# 收盤價對數 np.log() 求對數函式,底數是e
log_close=np.log(close)
# 對數收益率
logreturns = np.diff( log_close)
logreturns #輸出對數收益率
array([ 0.00953488, 0.01668775, -0.00205991, -0.00255903, 0.00887039,
0.01540739, 0.0093908 , 0.0082988 , -0.01015864, 0.00649435,
0.00650813, 0.00200256, 0.00893468, -0.01339027, -0.02183875,
-0.03468287, 0.01177296, 0.00075857, 0.01528161, 0.01440064,
-0.011103 , 0.00801225, 0.02090904, 0.00122297, -0.01297267,
0.00112499, -0.00929083, -0.01659219, 0.01522945]
# 對數收益率 的均值
year_mean = np.mean(logreturns)
# 對數收益率的標準差
year_std = np.std(logreturns)
#計算年波動率
#年波動率等於對數收益率的標準差除以其均值,再除以交易日倒數的平方根,通常交易日取252天。
year=year_std/year_mean/np.sqrt(1/252)
#月波動率
#月波動率等於對數收益率的標準差除以其均值,再除以交易月倒數的平方根,交易月為12月。
month=year_std/year_mean/np.sqrt(1/12)
獲取對數收益率為正值的:(演示一下where的作用) 方法一:
posretindices=np.where(logreturns>0) #where方法得到的是匹配條件的下標
logreturns[posretindices] #輸出下標為posretindices的logreturns中的值
array([0.00953488, 0.01668775, 0.00887039, 0.01540739, 0.0093908 ,
0.0082988 , 0.00649435, 0.00650813, 0.00200256, 0.00893468,
0.01177296, 0.00075857, 0.01528161, 0.01440064, 0.00801225,
0.02090904, 0.00122297, 0.00112499, 0.01522945])
方法二:簡單粗暴
logreturns[logreturns>0]