書名: Python量化交易作者名: 張楊飛本章字?jǐn)?shù): 1344字更新時(shí)間: 2019-09-23 11:07:13
第2章 Python量化編程基礎(chǔ)
本章首先介紹了Python語(yǔ)言作為量化交易入門語(yǔ)言的理由,然后講解了Python的基礎(chǔ)概念,介紹常用的數(shù)據(jù)分析庫(kù)NumPy與Pandas,以及機(jī)器學(xué)習(xí)庫(kù)scikit-learn,最后講解繪圖庫(kù)Matplotlib的基本用法。
純粹從計(jì)算機(jī)性能和速度出發(fā),C++語(yǔ)言無(wú)疑是量化交易的最佳選擇,它是最接近計(jì)算機(jī)底層的語(yǔ)言。C++語(yǔ)言通過對(duì)CPU多核多線程的優(yōu)化,合理分配內(nèi)存及顯卡計(jì)算等,可充分“榨干”硬件的每一份性能,在微秒必爭(zhēng)的高頻交易世界去追求更低的延時(shí)。在高頻交易領(lǐng)域,只有更快的速度才能搶到價(jià)格更低的單子,交易成本就會(huì)低于對(duì)手。所以只要交易數(shù)量足夠大,積少成多,其贏利是“恐怖”的。
為了保證交易系統(tǒng)的高效性和穩(wěn)健性,公司會(huì)習(xí)慣讓IT團(tuán)隊(duì)自主開發(fā)或者購(gòu)買C++搭建的底層通用平臺(tái)開發(fā)程序,對(duì)內(nèi)部組件進(jìn)行封裝,對(duì)外提供行情和交易API接口,可以讓其他編程語(yǔ)言,如Python、C#和R等語(yǔ)言接入來(lái)開發(fā)策略。
但從新手入門量化交易的角度來(lái)看,Python語(yǔ)言則打敗強(qiáng)大的C++語(yǔ)言,成為新手最受歡迎的語(yǔ)言,原因有以下幾點(diǎn)。
(1)在高頻交易領(lǐng)域,必須靠速度來(lái)賺錢。但是對(duì)于中低頻的交易,速度就顯得不那么重要了,一定程度的網(wǎng)絡(luò)延時(shí)或者交易系統(tǒng)延時(shí)還是能接受的,贏利重心轉(zhuǎn)向交易策略。所以C++語(yǔ)言的特性在中低頻交易中并不能凸顯出來(lái)。
(2)在研發(fā)交易策略上,C++語(yǔ)言不是一個(gè)很好的選擇。作為靜態(tài)語(yǔ)言,什么都要自己定義,這會(huì)浪費(fèi)大量的精力。打個(gè)比方,拿到一份股票數(shù)據(jù),不管是分析歷史價(jià)格趨勢(shì)還是波動(dòng)性,第一件事就是通過畫圖來(lái)直觀感受。Python語(yǔ)言有非常強(qiáng)大的數(shù)據(jù)分析庫(kù),不到十行代碼就能夠輕松搞定。若用C++語(yǔ)言的話,肯定會(huì)花大量的時(shí)間在編譯、調(diào)試、再編譯上。當(dāng)最后把圖畫出來(lái),發(fā)現(xiàn)已經(jīng)碼完上百行代碼了。所以用C++語(yǔ)言去研發(fā)策略的話,大部分的精力容易先浪費(fèi)在“造輪子”上,之后才會(huì)考慮策略本身的問題。人的精力和天賦是有限的,很難同時(shí)兼顧數(shù)學(xué)建模和底層代碼調(diào)試這種差距巨大的工作。而Python語(yǔ)言則提供很多造好的“輪子”,例如,科學(xué)計(jì)算庫(kù)NumPy與Pandas、數(shù)據(jù)繪圖庫(kù)Matplotlib、技術(shù)指標(biāo)計(jì)算庫(kù)TA-Lib等。這些“輪子”是用強(qiáng)大的C++語(yǔ)言編寫并且封裝好的,在需要的時(shí)候直接調(diào)用就可以了。Python膠水語(yǔ)言的特性可以讓研究員放心地把精力放在數(shù)學(xué)建模上。
(3)C++操作的煩瑣也間接反映其學(xué)習(xí)曲線過于陡峭,對(duì)于量化交易新手而言非常不友好。與之相反,Python因?yàn)槠湔Z(yǔ)法非常像英語(yǔ),學(xué)習(xí)的邊際成本會(huì)大幅度降低。Python容易到連小學(xué)生都可以學(xué),例如為了響應(yīng)2017年國(guó)務(wù)院發(fā)布《新一代人工智能發(fā)展規(guī)劃》,山東省最新出版的小學(xué)信息技術(shù)六年級(jí)教材加入了Python語(yǔ)言的學(xué)習(xí)內(nèi)容。
綜上所述,Python倚著其易學(xué)性、強(qiáng)大的數(shù)據(jù)分析庫(kù),以及可擴(kuò)展性成為新手入門量化交易的首選語(yǔ)言。
2.1 Python運(yùn)行環(huán)境搭建
因大多數(shù)初學(xué)者是Windows用戶,所以本次Python運(yùn)行環(huán)境的搭建是基于Windows的,并且在以后講述的章節(jié)中用到vn.py 1.9.0版本,Python的安裝版本為Python 2.7(用戶亦可直接安裝vn.py 1.9.2 LTS版本,二者相差不大)。
2.1.1 安裝Anaconda2-5.0.0(32位)
Anaconda是一個(gè)基于Python的環(huán)境管理工具,其中包含了Conda,Python,NumPy,Scipy,Jupyter Notebook在內(nèi)的超過180個(gè)科學(xué)庫(kù)及其依賴項(xiàng)。
Conda是包及其依賴項(xiàng)和環(huán)境的管理工具,適用于Python,R,Ruby,Lua,Scala,Java,JavaScript,C/C++和Fortran語(yǔ)言。Conda可以用于快速安裝、運(yùn)行和升級(jí)包及其依賴項(xiàng),在計(jì)算機(jī)中便捷地創(chuàng)建、保存、加載和切換環(huán)境。因?yàn)镃onda同樣是一個(gè)環(huán)境管理器,僅需要幾條命令,就可以創(chuàng)建一個(gè)完全獨(dú)立的環(huán)境來(lái)運(yùn)行不同的Python版本,同時(shí)支持在常規(guī)的環(huán)境中使用常用的Python版本。
由于兼容vn.py的需要(詳見第3章),要求安裝特定版本,即Anaconda2 5.0.0-Windows-x86,如圖2-1所示。

圖2-1 Anaconda安裝界面
這里要說(shuō)明一下,Anaconda2 5.2.0對(duì)應(yīng)的是vn.py 1.9.0,也是本書所使用的版本。若使用vn.py 1.8.1或者以前的版本,則需安裝Anaconda2-4.0.0,另外在2019年推出vn.py 2.0版本后,將會(huì)兼容Anaconda3 64位的版本。
安裝完成后要進(jìn)入Anaconda Prompt,在Prompt上可以使用conda或者pip命令來(lái)安裝對(duì)應(yīng)的Python依賴庫(kù),如圖2-2所示。

圖2-2 Anaconda Prompt界面
2.1.2 設(shè)置Anancoda環(huán)境
安裝nb_conda用于Jupyter Notebook自動(dòng)關(guān)聯(lián)nb_conda的環(huán)境,如圖2-3所示。

圖2-3 安裝nb_conda
conda install nb_conda
在終端中使用:
conda create -n env_name package_names
在上面的命令中,env_name是所創(chuàng)建環(huán)境的名稱,package_names是用戶要安裝在環(huán)境中的包名稱。
當(dāng)同時(shí)使用Python 2.x和Python 3.x中的代碼時(shí)這很有用。創(chuàng)建具有特定Python版本的環(huán)境,例如,創(chuàng)建環(huán)境名稱為py2,并安裝Python2,在終端中輸入:
conda create -n py2 python=2
創(chuàng)建環(huán)境名稱為py3,并安裝最新版本的Python3,在終端中輸入:
conda create -n py3 python=3
由于用戶做的項(xiàng)目不同,有時(shí)候會(huì)用到Python2,有時(shí)候會(huì)用到Python3。所以可以在自己的計(jì)算機(jī)上創(chuàng)建了這兩個(gè)環(huán)境,并分別取名:py2,py3。這樣用戶可以根據(jù)不同的項(xiàng)目輕松使用不同版本的Python。
最后,如果用戶要安裝特定版本(例如Python 3.6),輸入下面命令,如圖2-4所示。

圖2-4 創(chuàng)建Python環(huán)境命令
conda create -n py3.6 python=3.6
2.1.3 創(chuàng)建共享環(huán)境
共享環(huán)境的作用在于能夠讓其他用戶在安裝的創(chuàng)作者代碼中使用所有包,并確保這些包的版本正確。比如,A開發(fā)了一個(gè)藥店數(shù)據(jù)分析系統(tǒng),提交給項(xiàng)目部署系統(tǒng)的B來(lái)部署,但是B并不知道A當(dāng)時(shí)開發(fā)時(shí)使用的是Python哪個(gè)版本,以及使用了哪些包和包的版本。為解決這個(gè)問題,A可以在當(dāng)前的環(huán)境終端中使用:
conda env export > environment.yaml
將A當(dāng)前的環(huán)境保存為yaml文件(包括Python版本和所有包的名稱),讓B及其他人更輕松地安裝A的代碼的所有依賴項(xiàng),如圖2-5所示。

圖2-5 創(chuàng)建共享環(huán)境
2.1.4 列出共享環(huán)境
如圖2-6所示,輸入下面命令可以列出共享環(huán)境:

圖2-6 列出共享環(huán)境
conda env list
2.1.5 安裝Jupyter Notebook
Jupyter Notebook是基于網(wǎng)頁(yè)的用于交互計(jì)算的應(yīng)用程序,它可以在網(wǎng)頁(yè)頁(yè)面中直接編寫和運(yùn)行代碼,代碼的運(yùn)行結(jié)果也會(huì)直接在代碼塊下顯示。在編程過程中如果需要編寫說(shuō)明文檔,可在同一個(gè)頁(yè)面中以Markdown的格式編寫。安裝Jupyter Notebook的命令:
conda install jupyter notebook
安裝完后,在Anaconda Prompt中輸入命令“jupyter notebook”,按Enter鍵便以網(wǎng)頁(yè)的形式打開。單擊“new”選項(xiàng)就會(huì)顯示創(chuàng)建出來(lái)的Python環(huán)境,如圖2-7所示。

圖2-7 Jupyter Notebook界面上的Python環(huán)境
圖2-7所示的Python[conda root]和Python[default]指的是Anaconda默認(rèn)環(huán)境,即Python2。
在圖2-7右上角“new”選項(xiàng)單擊“Python[conda env:py3]”進(jìn)入新的頁(yè)面,可輸入第一行Python代碼“Hello world”,單擊圖2-8所示方框的運(yùn)行按鈕或用快捷鍵“Ctrl+Enter”即可執(zhí)行代碼。

圖2-8 運(yùn)行按鈕
安裝好Python后就可以開始正式學(xué)習(xí)了。為了更好掌握Python語(yǔ)言的基本用法,這里將Python語(yǔ)言分成4部分逐一講解,分別是數(shù)據(jù)、函數(shù)、條件判斷和循環(huán)。
- Node.js Design Patterns
- Objective-C應(yīng)用開發(fā)全程實(shí)錄
- Xcode 7 Essentials(Second Edition)
- 機(jī)械工程師Python編程:入門、實(shí)戰(zhàn)與進(jìn)階
- Learning Laravel 4 Application Development
- Amazon S3 Cookbook
- Mastering AndEngine Game Development
- Learning Network Forensics
- RabbitMQ Essentials
- Julia高性能科學(xué)計(jì)算(第2版)
- Android玩家必備
- 響應(yīng)式架構(gòu):消息模式Actor實(shí)現(xiàn)與Scala、Akka應(yīng)用集成
- Learning Python Data Visualization
- JavaScript Concurrency
- Wearable:Tech Projects with the Raspberry Pi Zero