前言
正如我前面所講,量化交易背後是有著一套嚴謹計算的過程的。我們進行量化交易時,如果進行原始數據的分析,一般避免不了進行數據的運算。
所以,按照我跟大家講的量化交易學習路線,我們需要先學習下numpy和pandas,這兩個是python進行數據運算和處理的兩個比較重要的依賴包。
我們本篇文章先來看下,量化交易計算的Numpy。
這裡,我必須先友情提示下,接下去兩章的內容會比較枯燥,因為涉及到一些數據計算和統計的東西,而且後續不一定直接使用這兩個包,因為大部分量化工具都已封裝好數據處理。但是學好這兩個知識,對於我們後續對行情數據的分析,瞭解量化工具包如何處理數據流的處理方法有比較重要的意義。
Numpy是什麼?
首先,我們來了解下啥是Numpy。
先看下概念:
NumPy是使用Python進行科學計算的基本包。其中包括:
- 一個強大的N維數組對象
- 複雜(廣播)功能
- C/C++與FORTRAN代碼集成工具
- 有用的線性代數、傅立葉變換和隨機數能力
除了明顯的科學用途外,NumPy還可以作為通用數據的高效多維容器。可以定義任意數據類型。這使得NumPy能夠無縫、快速地與各種數據庫集成。
稍等。。是不是看的有點頭暈,分分鐘想放棄學習,有沒有?特別是第4點,感覺又要回到高中大學時學習數學,高數的痛苦感覺啦?
別急!!!
深奧的理論概念一般都是用來嚇唬學生的,其實我們在實際應用Numpy的時候,沒有涉及到這麼深奧的東西。我們只需要掌握以下內容:
- 數據類型
- 數組類型
- 類型轉換
- 創建數組
- 數組索引
- 數組切片
- 改變維度
這些都是跟數組有關的,是不是就比較清晰了?雖然裡面有些概念還不懂,比如啥切片啊,索引啊~沒事,不急,後續介紹。
Numpy包在量化交易中,起到的作用是數據的計算。使用這個包,我們可以很輕鬆的處理量化數據,比如股票行情數據,期貨行情數據等等。
下面我們開始numpy的學習。
Numpy安裝
首先,我們來看下如何安裝numpy。
win+R,輸出cmd打開,確認,命令窗口。
直接命令行安裝Numpy,記得需要先安裝python。python安裝前面已經講過了哦。
<code>pip
install numpy/<code>
數組生成及基本操作
指定數據,創建一個簡單的數組
<code>import
numpyas
np a = np.array([1
,2
,3
], dtype=np.int32)
我們指定了一個一維數組,3個元素分別1,2,3。控制檯輸出:
[1 2 3]
int32
同理,我們可以構建多維數組,可以直接使用自帶方法構建全1數組,全零數組等。
<code>a
=
np.array([[1,
2
,
3
],
[2,
3
,
4
]])
print(a)
a
=
np.ones((4,
4
),
dtype=np.int)
print(a)
a
=
np.zeros((3,
4
))
print(a)
a
=
np.empty((4,
5
))
print(a)
/<code>
打印查看結果:
[[1 2 3]
[2 3 4]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[6.23042070e-307 4.67296746e-307 1.69121096e-306 1.37962524e-306
1.89146896e-307]
[7.56571288e-307 3.11525958e-307 1.24610723e-306 1.37962320e-306
1.29060871e-306]
[2.22518251e-306 1.33511969e-306 1.78022342e-306 1.05700345e-307
1.11261027e-306]
[1.11261502e-306 1.42410839e-306 7.56597770e-307 6.23059726e-307
1.78016909e-306]]
連續數組及變換
下面我們重點看下連續數組和變換。我們之所以獨立開來講,是因為這個跟我們的行情數據關係密切。我們的行情數據,不管股票還是期貨,外匯等的所有數據,都是連續不斷的數據構成的一個段完整的行情。
連續數組創建,創建一個數組,從1到50,步長為1.注意,arrange產生數組是左閉右開的,所以下標要到51,才是創建50個數據。生成數組之後,我們將其變換為2行的二維數組,注意列數乘以行數要等於改數組的元素個數。
<code>傳/<code>
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
49 50]
[[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25]
[26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50]]
數組基本運算
數組的基本運算,我們需要掌握一些基本的運算即可,我們下面結合行情數據來講解相關運算內容。
假設有一段行情,我們需要知道這段的最高價,最低價,以及行情的五日均線。我們可以用numpy的素組一些內置函數的運算來實現,很簡單。
下面我們通過示例來演示。
1 首先,我們來看下數組的運算。構造數組,分別一個整數型數組和一個小數型數組,再分別將兩個數組相加,形成新的數組。代碼如下:
<code># 生成10
到20
的隨機數組 np.set_printoptions(precision=1
) data_1 = np.random
.rand(50
)"生成小數型數組:"
, data_1) data_2 = np.random
.randint(15
,20
, size=50
)"生成整數型數組:"
, data_2) data = data_2 + data_1"合併後生成的數組:"
, data)/<code>
生成小數型數組: [0.8 0.2 0. 0.3 1. 0.4 1. 0.4 1. 0.8 0.1 0.7 0.6 1. 0.7 0.9 0.6 1.
0.8 0.6 0.1 0.9 0.3 0.5 0.7 0.8 0.6 0.5 0.7 0.6 1. 0.1 0.3 0.4 0.8 0.8
1. 0.5 1. 0.9 0.9 0.9 0.9 0.6 0.1 0.2 0.9 0.3 0.8 0.9]
生成整數型數組: [15 17 18 15 16 15 18 16 18 18 16 19 18 15 18 16 16 17 19 17 19 16 15 17
15 17 15 15 18 15 18 16 17 15 18 15 19 18 19 18 16 19 19 17 18 19 19 19
19 19]
合併後生成的數組: [15.8 17.2 18. 15.3 17. 15.4 19. 16.4 19. 18.8 16.1 19.7 18.6 16.
18.7 16.9 16.6 18. 19.8 17.6 19.1 16.9 15.3 17.5 15.7 17.8 15.6 15.5
18.7 15.6 19. 16.1 17.3 15.4 18.8 15.8 20. 18.5 20. 18.9 16.9 19.9
19.9 17.6 18.1 19.2 19.9 19.3 19.8 19.9]
以上,我們構造了一段行情數據,設置行情價格為15~20元範圍波動。下面,我們求出行情最大價格,
2 調用內部函數求數組最大最小值。
<code> max_index = np.argmax(data)'最大值元素索引%d'
% np.argmax(data)) min_index = np.argmin(data)'最小值元素索引%d'
% np.argmin(data))/<code>
最大值元素索引38
最小值元素索引3
我們求最終獲得數組的:
最大值索引為38,即從第38個元素(從0開始數),值為20.
最大值索引為3,即從第3個元素(從0開始數),值為15.3
3 求出5日移動平均價格數組
下面,我們求5日移動均線的數組,5日均線的計算方法,就是第5個數的時候,將其前面4個包括自身值相加除以5.
<code>def
moving_average
(a, n=
5
): ret = np.cumsum(a, dtype=float) ret[n:
] = ret[n:
] - ret[:-n
]return
ret[n -1
:
] / n print('5日移動均線:'
, moving_average(data))/<code>
控制檯輸出:
5日移動均線: [16.7 16.6 16.9 16.6 17.3 17.7 17.8 18. 18.4 17.8 17.8 18. 17.4 17.2 18. 17.8 18.2 18.3 17.7 17.3 16.9 16.6 16.4 16.4 16.7 16.6 16.9 17. 17.3 16.7 17.3 16.7 17.4 17.7 18.6 18.6 18.8 18.8 19.1 18.6 18.5 18.9 18.9 18.8 19.2 19.6]
以上三個步驟就是我們求利用numpy數組求得行情最大最小值,並且求出5日移動均線數據。
這樣的數據,看的是不是很累?下面我們利用plot將其畫出來。
利用matplotlib畫圖,我們之前的文章已經稍微講過了,下面我們利用plot直接畫出圖形。
<code># 畫圖整理 x = np.arange(1
,51
,1
) plt.plot(x,data
,'--*y'
) # 最大值 plt.plot(max_index,data
[max_index],'rs'
) show_max='[key:'
+str(max_index)+' value:'
+str(round(data
[max_index],1
))+']'
plt.annotate(show_max, xytext=(max_index,data
[max_index]), xy=(max_index,data
[max_index])) # 最小值 plt.plot(min_index,data
[min_index],'gs'
) show_max='[key:'
+str(min_index)+' value:'
+str(round(data
[min_index],1
))+']'
plt.annotate(show_max, xytext=(min_index+1
,data
[min_index]), xy=(min_index,data
[min_index])) # 均線 x_2 = np.arange(5
,51
,1
) plt.plot(x_2, moving_average(data
)) mpl.rcParams['font.sans-serif'
]=['SimHei'
] #用來指定默認字體 SimHei為黑體 mpl.rcParams['axes.unicode_minus'
]=False plt.title('行情及五日均線模擬圖'
) plt.savefig('./20200414.png'
) plt.show()/<code>
最終,畫出的圖形如下:
這裡,我們畫出了整段行情,並且標註除了最大最小价格,畫出5日的移動均線。
以上完整代碼均已傳到VX公號:大操手量化投資,歡迎關注並獲取相關代碼。後續最新文章會陸續在上面更新。
以上是我們本章的內容,關於numpy,進行數組運行,結合我們量化交易的行情數據進行的講解。希望大家能學有所得!
好啦,本章內容就到這裡。歡迎關注【大操手量化投資】,一起學習量化交易相關知識,量化交易從小白到高手的路程!