十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
有些Python小白對numpy中的常見函數(shù)不太了解,今天小編就整理出來分享給大家。
成都創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、電商網(wǎng)站制作開發(fā)、微信平臺小程序開發(fā)、微信營銷、系統(tǒng)平臺開發(fā),與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
Numpy是Python的一個科學(xué)計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經(jīng)提供了類似于矩陣的表示形式,不過numpy為我們提供了更多的函數(shù)。
數(shù)組常用函數(shù)
1.where()按條件返回數(shù)組的索引值
2.take(a,index)從數(shù)組a中按照索引index取值
3.linspace(a,b,N)返回一個在(a,b)范圍內(nèi)均勻分布的數(shù)組,元素個數(shù)為N個
4.a.fill()將數(shù)組的所有元素以指定的值填充
5.diff(a)返回數(shù)組a相鄰元素的差值構(gòu)成的數(shù)組
6.sign(a)返回數(shù)組a的每個元素的正負(fù)符號
7.piecewise(a,[condlist],[funclist])數(shù)組a根據(jù)布爾型條件condlist返回對應(yīng)元素結(jié)果
8.a.argmax(),a.argmin()返回a最大、最小元素的索引
改變數(shù)組維度
a.ravel(),a.flatten():將數(shù)組a展平成一維數(shù)組
a.shape=(m,n),a.reshape(m,n):將數(shù)組a轉(zhuǎn)換成m*n維數(shù)組
a.transpose,a.T轉(zhuǎn)置數(shù)組a
數(shù)組組合
1.hstack((a,b)),concatenate((a,b),axis=1)將數(shù)組a,b沿水平方向組合
2.vstack((a,b)),concatenate((a,b),axis=0)將數(shù)組a,b沿豎直方向組合
3.row_stack((a,b))將數(shù)組a,b按行方向組合
4.column_stack((a,b))將數(shù)組a,b按列方向組合
數(shù)組分割
1.split(a,n,axis=0),vsplit(a,n)將數(shù)組a沿垂直方向分割成n個數(shù)組
2.split(a,n,axis=1),hsplit(a,n)將數(shù)組a沿水平方向分割成n個數(shù)組
數(shù)組修剪和壓縮
1.a.clip(m,n)設(shè)置數(shù)組a的范圍為(m,n),數(shù)組中大于n的元素設(shè)定為n,小于m的元素設(shè)定為m
2.a.compress()返回根據(jù)給定條件篩選后的數(shù)組
數(shù)組屬性
1.a.dtype數(shù)組a的數(shù)據(jù)類型
2.a.shape數(shù)組a的維度
3.a.ndim數(shù)組a的維數(shù)
4.a.size數(shù)組a所含元素的總個數(shù)
5.a.itemsize數(shù)組a的元素在內(nèi)存中所占的字節(jié)數(shù)
6.a.nbytes整個數(shù)組a所占的內(nèi)存空間7.a.astype(int)轉(zhuǎn)換a數(shù)組的類型為int型
數(shù)組計算
1.average(a,weights=v)對數(shù)組a以權(quán)重v進行加權(quán)平均
2.mean(a),max(a),min(a),middle(a),var(a),std(a)數(shù)組a的均值、最大值、最小值、中位數(shù)、方差、標(biāo)準(zhǔn)差
3.a.prod()數(shù)組a的所有元素的乘積
4.a.cumprod()數(shù)組a的元素的累積乘積
5.cov(a,b),corrcoef(a,b)數(shù)組a和b的協(xié)方差、相關(guān)系數(shù)
6.a.diagonal()查看矩陣a對角線上的元素7.a.trace()計算矩陣a的跡,即對角線元素之和
以上就是numpy中的常見函數(shù)。更多Python學(xué)習(xí)推薦:PyThon學(xué)習(xí)網(wǎng)教學(xué)中心。
VWAP(Volume-Weighted Average Price 成交量加權(quán)平均價格)是一個非常重要的經(jīng)濟學(xué)量,它代表著金融資產(chǎn)的平均價格。某個價格的成交量越高,該價格所占的權(quán)重就越大。VMAP就是以成交量為權(quán)重計算出來的加權(quán)平均
VWAP(Volume-Weighted Average Price 成交量加權(quán)平均價格)是一個非常重要的經(jīng)濟學(xué)量,它代表著金融資產(chǎn)的”平均“價格。某個價格的成交量越高,該價格所占的權(quán)重就越大。VMAP就是以成交量為權(quán)重計算出來的加權(quán)平均值,常用于算法交易。
下面使用python來計算成交量加權(quán)平均價格:
1.將數(shù)據(jù)讀入數(shù)組。
2.計算VWAP。
view plainprint?
import numpy as np
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
vwap = np.average(c, weights=v)
print "VMAP =", vwap
//The output is
VWAP = 350.589549353
這樣我們就計算出了VWAP,我們僅僅調(diào)用了average函數(shù),并將v作為權(quán)重參數(shù)使用,就完成了VWAP的計算。
savetxt
import numpy as np
i2 = np.eye(2)
np.savetxt("eye.txt", i2)
3.4 讀入CSV文件
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #index從0開始
3.6.1 算術(shù)平均值
np.mean(c) = np.average(c)
3.6.2 加權(quán)平均值
t = np.arange(len(c))
np.average(c, weights=t)
3.8 極值
np.min(c)
np.max(c)
np.ptp(c) 最大值與最小值的差值
3.10 統(tǒng)計分析
np.median(c) 中位數(shù)
np.msort(c) 升序排序
np.var(c) 方差
3.12 分析股票收益率
np.diff(c) 可以返回一個由相鄰數(shù)組元素的差
值構(gòu)成的數(shù)組
returns = np.diff( arr ) / arr[ : -1] #diff返回的數(shù)組比收盤價數(shù)組少一個元素
np.std(c) 標(biāo)準(zhǔn)差
對數(shù)收益率
logreturns = np.diff( np.log(c) ) #應(yīng)檢查輸入數(shù)組以確保其不含有零和負(fù)數(shù)
where 可以根據(jù)指定的條件返回所有滿足條件的數(shù)
組元素的索引值。
posretindices = np.where(returns 0)
np.sqrt(1./252.) 平方根,浮點數(shù)
3.14 分析日期數(shù)據(jù)
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1:datestr2num}, unpack=True)
print "Dates =", dates
def datestr2num(s):
return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday()
# 星期一 0
# 星期二 1
# 星期三 2
# 星期四 3
# 星期五 4
# 星期六 5
# 星期日 6
#output
Dates = [ 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 4. 0. 1. 2. 3. 4. 0.
1. 2. 3. 4.]
averages = np.zeros(5)
for i in range(5):
indices = np.where(dates == i)
prices = np.take(close, indices) #按數(shù)組的元素運算,產(chǎn)生一個數(shù)組作為輸出。
a = [4, 3, 5, 7, 6, 8]
indices = [0, 1, 4]
np.take(a, indices)
array([4, 3, 6])
np.argmax(c) #返回的是數(shù)組中最大元素的索引值
np.argmin(c)
3.16 匯總數(shù)據(jù)
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
#得到第一個星期一和最后一個星期五
first_monday = np.ravel(np.where(dates == 0))[0]
last_friday = np.ravel(np.where(dates == 4))[-1]
#創(chuàng)建一個數(shù)組,用于存儲三周內(nèi)每一天的索引值
weeks_indices = np.arange(first_monday, last_friday + 1)
#按照每個子數(shù)組5個元素,用split函數(shù)切分?jǐn)?shù)組
weeks_indices = np.split(weeks_indices, 5)
#output
[array([1, 2, 3, 4, 5]), array([ 6, 7, 8, 9, 10]), array([11,12, 13, 14, 15])]
weeksummary = np.apply_along_axis(summarize, 1, weeks_indices,open, high, low, close)
def summarize(a, o, h, l, c): #open, high, low, close
monday_open = o[a[0]]
week_high = np.max( np.take(h, a) )
week_low = np.min( np.take(l, a) )
friday_close = c[a[-1]]
return("APPL", monday_open, week_high, week_low, friday_close)
np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s") #指定了文件名、需要保存的數(shù)組名、分隔符(在這個例子中為英文標(biāo)點逗號)以及存儲浮點數(shù)的格式。
0818b9ca8b590ca3270a3433284dd417.png
格式字符串以一個百分號開始。接下來是一個可選的標(biāo)志字符:-表示結(jié)果左對齊,0表示左端補0,+表示輸出符號(正號+或負(fù)號-)。第三部分為可選的輸出寬度參數(shù),表示輸出的最小位數(shù)。第四部分是精度格式符,以”.”開頭,后面跟一個表示精度的整數(shù)。最后是一個類型指定字符,在例子中指定為字符串類型。
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)
def my_func(a):
... """Average first and last element of a 1-D array"""
... return (a[0] + a[-1]) * 0.5
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
np.apply_along_axis(my_func, 0, b) #沿著X軸運動,取列切片
array([ 4., 5., 6.])
np.apply_along_axis(my_func, 1, b) #沿著y軸運動,取行切片
array([ 2., 5., 8.])
b = np.array([[8,1,7], [4,3,9], [5,2,6]])
np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8],
[3, 4, 9],
[2, 5, 6]])
3.20 計算簡單移動平均線
(1) 使用ones函數(shù)創(chuàng)建一個長度為N的元素均初始化為1的數(shù)組,然后對整個數(shù)組除以N,即可得到權(quán)重。如下所示:
N = int(sys.argv[1])
weights = np.ones(N) / N
print "Weights", weights
在N = 5時,輸出結(jié)果如下:
Weights [ 0.2 0.2 0.2 0.2 0.2] #權(quán)重相等
(2) 使用這些權(quán)重值,調(diào)用convolve函數(shù):
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
sma = np.convolve(weights, c)[N-1:-N+1] #卷積是分析數(shù)學(xué)中一種重要的運算,定義為一個函數(shù)與經(jīng)過翻轉(zhuǎn)和平移的另一個函數(shù)的乘積的積分。
t = np.arange(N - 1, len(c)) #作圖
plot(t, c[N-1:], lw=1.0)
plot(t, sma, lw=2.0)
show()
3.22 計算指數(shù)移動平均線
指數(shù)移動平均線(exponential moving average)。指數(shù)移動平均線使用的權(quán)重是指數(shù)衰減的。對歷史上的數(shù)據(jù)點賦予的權(quán)重以指數(shù)速度減小,但永遠(yuǎn)不會到達(dá)0。
x = np.arange(5)
print "Exp", np.exp(x)
#output
Exp [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]
Linspace 返回一個元素值在指定的范圍內(nèi)均勻分布的數(shù)組。
print "Linspace", np.linspace(-1, 0, 5) #起始值、終止值、可選的元素個數(shù)
#output
Linspace [-1. -0.75 -0.5 -0.25 0. ]
(1)權(quán)重計算
N = int(sys.argv[1])
weights = np.exp(np.linspace(-1. , 0. , N))
(2)權(quán)重歸一化處理
weights /= weights.sum()
print "Weights", weights
#output
Weights [ 0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]
(3)計算及作圖
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
ema = np.convolve(weights, c)[N-1:-N+1]
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, ema, lw=2.0)
show()
3.26 用線性模型預(yù)測價格
(x, residuals, rank, s) = np.linalg.lstsq(A, b) #系數(shù)向量x、一個殘差數(shù)組、A的秩以及A的奇異值
print x, residuals, rank, s
#計算下一個預(yù)測值
print np.dot(b, x)
3.28 繪制趨勢線
x = np.arange(6)
x = x.reshape((2, 3))
x
array([[0, 1, 2], [3, 4, 5]])
np.ones_like(x) #用1填充數(shù)組
array([[1, 1, 1], [1, 1, 1]])
類似函數(shù)
zeros_like
empty_like
zeros
ones
empty
3.30 數(shù)組的修剪和壓縮
a = np.arange(5)
print "a =", a
print "Clipped", a.clip(1, 2) #將所有比給定最大值還大的元素全部設(shè)為給定的最大值,而所有比給定最小值還小的元素全部設(shè)為給定的最小值
#output
a = [0 1 2 3 4]
Clipped [1 1 2 2 2]
a = np.arange(4)
print a
print "Compressed", a.compress(a 2) #返回一個根據(jù)給定條件篩選后的數(shù)組
#output
[0 1 2 3]
Compressed [3]
b = np.arange(1, 9)
print "b =", b
print "Factorial", b.prod() #輸出數(shù)組元素階乘結(jié)果
#output
b = [1 2 3 4 5 6 7 8]
Factorial 40320
print "Factorials", b.cumprod()
#output
networkx是python的一個庫,它為圖的數(shù)據(jù)結(jié)構(gòu)提供算法、生成器以及畫圖工具。近日在使用ryu進行最短路徑獲取,可以通過該庫來簡化工作量。該庫采用函數(shù)方式進行調(diào)用相應(yīng)的api,其參數(shù)類型通常為圖對象。
函數(shù)API的調(diào)用,按照以下步驟來創(chuàng)建構(gòu)建圖:
1.networkx的加載
在python中調(diào)用networkx通常只需要將該庫導(dǎo)入即可
import networkx as nx
2.圖對象的創(chuàng)建
networkx提供了四種基本圖對象:Graph,DiGraph,MultiGraph,MultiDiGraph。
使用如下調(diào)用方式,可以創(chuàng)建以上四種圖對象的空圖。
G=nx.Graph()
G=nx.DiGraph()
G=nx.MultiGraph()
G=nx.MultiDiGraph()
在 networkx中,圖的各個節(jié)點允許以哈希表對象來表示,而對于圖中邊的各個參量,則可以通過與邊相關(guān)聯(lián)的方式來標(biāo)識,一般而言,對于權(quán)重,用weight作為keyword,而對于其他的參數(shù),使用者可以采用任何除weight以外的keyword來命名。
3.在2中,創(chuàng)建的只是一副空圖,為了得到一個有節(jié)點、有邊的圖,一般采用下面這個函數(shù):
1
2
G.add_edge(1,2) #default edge data=1
G.add_edge(1,2) #specify edge data=0.9
add_edge()函數(shù),該函數(shù)在調(diào)用時需要傳入兩個參數(shù)u和v,以及多個可選參數(shù)
u和v即圖中的兩個節(jié)點,如果圖中不存在節(jié)點,在調(diào)用時會自動將這兩個節(jié)點添加入內(nèi),同時構(gòu)建兩個節(jié)點之間的連接關(guān)系,可選參數(shù)通常指這條邊的權(quán)重等關(guān)系參量。需要注意的是,如果圖中已經(jīng)存在了這條邊,重新進行添加時會對這條邊進行跟新操作(也就是覆蓋了原有的信息)。
對于該函數(shù),除了上述的構(gòu)建方式以外,還有以下幾種方式來創(chuàng)建邊:
1
2
3
G.add_edge(*e) # single edge as tuple of two nodes
G.add_edge(1, 3, weight=7, capacity=15, length=342.7) #using many arguements to create edge
G.add_edges_from( [(1, 2)] ) # add edges from iterable container
有時候,當(dāng)采用默認(rèn)方式創(chuàng)建邊以后,我們可能還會往邊里面添加邊的相關(guān)參數(shù),這時候,可以采用下面的方式來更新邊的信息:
1
2
3
4
5
#For non-string attribute keys, use subscript notation.
G.add_edge(1, 2)
G[1][2].update({0: 5}) #更新邊的信息
G.edges[1, 2].update({0: 5}) #更新邊的信息
#上述兩種更新方式,擇一選取即可
細(xì)心的朋友可能注意到我在寫創(chuàng)建圖的內(nèi)容的時候,提到了add_edges_from()函數(shù),該函數(shù)也是用來創(chuàng)建邊的,該方式與add_edges()略有不同,比之a(chǎn)dd_edges()采用一個一個節(jié)點的方式進行創(chuàng)建,它來的更為便利。這個函數(shù)在調(diào)用時,需要一個節(jié)點元組作為參數(shù)以及多個可選參數(shù)作為邊的信息。你可以這么傳遞:
默認(rèn)創(chuàng)建節(jié)點之間的邊:
1
G.add_edges_from([(u,v)])
也可以這么寫,在創(chuàng)建的同時添加信息:
1
G.add_edges_from([(3, 4), (1, 4)], label='WN2898')
通過上述方式,就構(gòu)建了一個3-4-1的圖的連接,并給每條邊打上了標(biāo)簽。
由此你就可以創(chuàng)建出自己的圖模型了。
在 python實現(xiàn)資產(chǎn)配置(1)----Markowitz 投資組合模型 中, 我們已經(jīng)見過如何使用Markowitz求得最優(yōu)資產(chǎn)配比. 這是一種在已知未來各資產(chǎn)的概率分布,然后再求解的方法.
Markowitz模型輸入?yún)?shù)包括歷史數(shù)據(jù)法和情景分析法兩種方法,情景分析法的缺點是主觀因素,隨意性太強,因此使用歷史數(shù)據(jù)法, 將資產(chǎn)的均值和協(xié)方差輸入模型是比較常見的作法. 不過, 不足之處很明顯: 未來的資產(chǎn)收益率分布不一定與過去相同. 此外, Markowitz 模型結(jié)果對輸入?yún)?shù)過于敏感.
Black-Litterman模型就是基于此的改進. 其核心思想是將投資者對大類資產(chǎn)的觀點 (主觀觀點) 與市場均衡收益率 (先驗預(yù)期收益率)相結(jié)合,從而形成新的預(yù)期收益率(后驗預(yù)期收益率). 這里的先驗預(yù)期收益率的分布可以是貝葉斯推斷中的先驗概率密度函數(shù)的多元正態(tài)分布形式,投資者的主觀觀點就是貝葉斯推斷中的似然函數(shù)(可以看作新的信息, 因為做出主觀判斷必然是從外界獲取得到了這些資產(chǎn)的收益率變化信息), 而相應(yīng)的, 后驗預(yù)期收益率也可以從后驗概率密度函數(shù)中得到. 具體的推導(dǎo)可以看我的這篇文章: 從貝葉斯定理到貝葉斯推斷 .
BL模型的求解步驟包括下面幾步:
(1) 使用歷史數(shù)據(jù)估計預(yù)期收益率的協(xié)方差矩陣作為先驗概率密度函數(shù)的協(xié)方差.
(2) 確定市場預(yù)期之收益率向量, 也就是先驗預(yù)期收益之期望值. 作為先驗概率密度函數(shù)的均值. 或者使用現(xiàn)有的期望值和方差來反推市場隱含的均衡收益率(Implied Equilibrium Return Vector), 不過在使用這種方法時, 需要知道無風(fēng)險收益率 的大小.
(3) 融合投資人的個人觀點,即根據(jù)歷史數(shù)據(jù)(看法變量的方差)和個人看法(看法向量的均值)
(4) 修正后驗收益.
是均衡收益率協(xié)方差的調(diào)整系數(shù),可以根據(jù)信心水平來判斷. 是歷史資產(chǎn)收益率的協(xié)方差矩陣, P是投資者的觀點矩陣, 是似然函數(shù)(即投資者觀點函數(shù))中的協(xié)方差矩陣,其值為 的對角陣, 是先驗收益率的期望值.
(5) 投資組合優(yōu)化: 將修正后的期望值與協(xié)方差矩陣即 重新代入Markowitz投資組合模型求解.
(1)定義求解函數(shù),輸入為投資者觀點P,Q以及目前資產(chǎn)的市場收益率矩陣,輸出為后驗的市場收益率和協(xié)方差矩陣.
(2) 實列分析
我們繼續(xù)研究 python實現(xiàn)資產(chǎn)配置(1)----Markowitz 投資組合模型 中的五支股票: 白云機場, 福建高速, 華夏銀行, 生益科技和浙能電力. 假設(shè)現(xiàn)在分析師的觀點為:
獲取股票數(shù)據(jù), 并且獲得后驗的均值和方差:
這時候,已經(jīng)可以使用Markowitz模型進行資產(chǎn)的配置. 定義新的函數(shù)blminVar以求解資產(chǎn)配置權(quán)重. 該函數(shù)的輸入變量為blacklitterman函數(shù)的輸出結(jié)果, 以及投資人的目標(biāo)收益率goalRet.假設(shè)目標(biāo)收益率為年化70%,則goalRet = 0.7:
輸出結(jié)果為:
0-5分別對應(yīng)上面的五只股票.