Primer Python for Quant D01:
Python簡介
我之前沒怎麽想過,我會寫一個python教程,畢竟這類教程實在太多了,網上的絕大多數教程都會寫得比我好。今天高頓的老師找到我時,一開始我是拒絕的,但是人家非常誠懇地說:給錢。好吧好吧,看在這麽多年交情的份上,寫一個也行。
但問題是:如何讓讀者,特別是有誌於進入量化行業的人,能從滿街都是的python教程中獲得與眾不同收獲,是一個非常難的問題。為此,在大約十五節課的基礎教程中,我將雜糅進盡可能多的金融數據的範例。整個教程將以量化交易入門,或者說金融數據分析入門為導向。這份教程的目標學員是 完全沒有編程經驗的同學 ,因此在課程設計上,我會淺顯直白,乃至有些啰嗦的去解釋一些基礎性的東西。
閱讀該教程,建議已有如下的知識儲備:
· 識字
· 一台使用windows系統的電腦
· 恒心
1.1 課程安排
我將接下來的課程安排做一個簡單的介紹:
D1:課程&Python介紹
課程第一章,簡單介紹下編程及python,以及基於anaconda的環境安裝;D2:Python基礎語法
以hello world程式為例,介紹python的基礎語法;D3:基礎數據型別
介紹python的基礎數據型別;介紹python的基礎運算方法與規則;D4:數據結構與字串
介紹常用的數據結構:列表、元組、字典、字串等,以及簡單操作;D5:控制流程
基礎控制:if、迴圈、巢狀、跳出,以及三個小例子;D6:函式
如何使用、建立一個函式,以及函式參數與返回;D7:類與物件
主要介紹物件導向的編程範式,語法其次;D8:模組
了解python的模組機制,建立使用模組、安裝第三方模組;D9:常用內建方法和模組
常用內建函式與模組:sys、os、time、datetime,etc;D10:模組:math
math庫的基本用法,以及簡單的數學運算;D11:模組:numpy
numpy庫的基本用法;D12:模組:pandas
pandas庫的基本用法;D13:模組:TA
TA庫的基本用法;D14:視覺化技術
不講matplotlib了,更新換代,講下plotly庫的基本用法,以及視覺化技巧;D15:編碼規範與偵錯
程式的偵錯與執行;基於pep8的程式碼規範;1.2 本教程試圖達到的特色
· 數據分析\量化交易指向:
這意味著常規教程中的很多東西我們不會講。比如,爬蟲,自動化運維,自動化辦公,以及互聯網技術等等。除了此類大型的框架之外,一些細節上我也做了相應的處理。最簡單的一句話:在我日常工作中沒有用到的東西我一定不會講;我用到的內容會以量化角度來做刪選性的講。因此,如果你準備從事數據分析或者量化交易工作,請忽略網上的眾多教程,因為你會浪費大量的時間在你不需要的知識上。
· 適用於完全的初學者:
在寫教程的過程中,我參(chao)考(xi)了眾多網上的優秀教程,比如,菜鳥和廖雪峰。我非常認可,絕大多數教程的品質都會超過這一份。然而,有些難以忽視的問題:其中之一就是假設了python的初學者已經掌握了某一門程式語言。因此,很多程式設計師認為的基本知識並沒有做進一步的解釋,導致了很多python的初學者對一些術語手足無措。
· 編程優先,python其次:
很多同學向我咨詢過一個問題:為什麽網上的教程我看不懂。後來我總結了一下,主要原因可能在於,很多教程講的是語言特性,而沒有解釋清楚什麽是編程。在這篇教程中,python的語言特性會盡可能的被弱化成一個載體,更多地,我希望大家能學會像程式設計師那樣思考。
1.3 Python簡介
python是一門電腦程式語言,而電腦程式語言,則是人與電腦都能讀懂的一種語言。簡單來講,當你希望你的電腦去做什麽事的時候,你必須使用電腦能理解的話來下指令,這個過程就是編程。Python是一種為提高開發速度而設計的高級語言。它擁有大量的庫,可用於幾乎任何可以想象的計算任務。很個人地講,當下社會,如果不會python的話,約等於二十年前你不會使用excel。
世界上已經有很多種程式語言了,已經超過了人類語言的數量。那麽,為什麽我們要選擇python呢?因為:
1.3.1 簡單
在我使用python很長一段時間,我都將其看作是一種「可執行的虛擬碼」。這是因為python應該是現有的程式語言中最為簡單的一門了。如果你像我一樣曾經使用C++來做數據分析的話,你會在第一時間愛上python。根據我的經驗,只要保證每天兩小時的學習時間,僅僅幾周後,一般同學就已經可以非常高效地使用python處理簡單問題了。
1.3.2 社群活躍
作為一名程式設計師,我發覺我很多時間都是用在百度\google上的。無論是新手還是有一定經驗的程式設計師,都不可避免的碰到一系列問題,而一個活躍的社群則為你的工作提供了強大的支持。使用Python的主要原因是它帶有一個數量驚人的library。比如:NumPy(向量化操作),SciPy(最佳化演算法),pandas(時間序列分析),statsmodel(統計建模),scikit-learn(統計/機器學習),IPython(互動式開發)和matplotlib(視覺化)。
1.3.3 數據友好
適合做數據分析,或者說量化的程式語言有很多種,但是從一個綜合的角度來看,python應該是最優選擇。在可以看見的幾年內,python有可能進一步擠占matlab、sas,包括R的空間,站穩數據科學程式語言的第一位置。在我目前的工作中,python大約承擔了100%的數據分析工作,並且在一些低頻交易中也有一定的使用。
對於初學者來講,很難透過縱向對比來了解python的優點。不過這不重要。但是,有兩句話我建議大家還是要記一下:
python是一門解釋型的程式語言。
用最通俗的話來講:解釋型語言是同聲轉譯,你的每一行都會即時的被機器所理解。對應的,編譯型語言(例如C++)則需要把整個程式碼檔完全轉譯後,機器才能知道自己要做什麽。
這為python帶來一個顯著的優點:即你可以準確的定位到自己的錯誤程式碼中,甚至一些錯誤無法被發覺而使得程式繼續執行。
但是,這也有問題:首先是速度,要慢了很多;其次是程式碼無法被加密,每個釋出的python指令碼,本質就是釋出原始碼。當然,這兩個小問題我們不在乎。
python是一門物件導向的程式語言。
在python中,很多基礎的語法元素都被抽象成一個類,或者說是物件。即使在眾多的高級語言之中,python的抽象程度之高也是數一數二的。
然而用python編程非常容易讓人困惑:很多教程依舊使用命令列來講解python,你會覺得python是種指令性的程式語言;python中的函式異常強大,你很容易把python當作一門程序式程式語言;然而,python是實打實的物件導向的。因此在學好python之前,我建議大家深刻記住一句話:萬物皆物件。這講使你的學習曲線更加的平滑,在學習後期的進展更快。
1.4 一些經驗性的建議
我沒有完整的帶過python的課,但是見證過有不少同學,包括公司的實習生,學習python的過程。因此,我想在前面,先給同學們一些學習建議:
· 程式碼逐字敲出來;程式碼逐字敲出來;程式碼逐字敲出來;
重要的事情說三遍。
請記住:編程屬於工科,不是理科也不是文科,不是你能看懂教材就能掌握的學科!面對編程第一時間,你要把自己想象成一個技術工,周而復始的從事著重復性的工作。因此逐字敲出程式碼,是我對眾多初學者的第一建議。
· 理解編程而非局限於python
python僅是程式語言的一種,在學會使用python的同時,我更建議大家學會編程思維,即從電腦角度來理解自己的程式碼是幹什麽用的。因為無論以後大家是否從事量化工作,或者數據分析工作,編程思維的重要性都要大於單一的程式語言。
· 學會偷懶
一個不爭的事實是:程式設計師都是懶的,能少寫程式碼就少寫。這裏牽扯到一個問題,就是程式的復用。每個人對編程的理解都不相同,我個人的一個認識是,程式的本質就是為了復用。為此,在個別情況下,我們會盡可能的讓程式碼變得簡單,並且,可以應對更多的情況,而非解決某一具體的問題。
其余的一些建議都不是很重要,但是會對你的學習過程中有幫助。例如,買一個好鍵盤和舒服的顯視器(曾經一位同學對我說,她寫程式死活寫不下去;我用了下她的膝上型電腦,發現我也寫不下去);從若幹個教程交叉學習,互相印證;找個隊友,互相監督等等。這些建議對你的編程有很大的幫助,但不是決定性的。
1.5 基於Anaconda的環境設定
1.5.1 Anaconda的安裝
其實以上都是廢話,看不看無所謂。
下面咱們來安裝python。
請拋棄網上的一些稀奇古怪的python安裝教程。 能「雙擊-下一步」解決的問題,就不用自求麻煩了,純屬腦子有病。我們直接使用anaconda,來安裝python,並設定開發環境。
Anaconda是一個python的全家桶。裏麵包含了大量常用的python庫,以及寫程式碼用的編輯器。對於絕大多戶數人來說,安裝Anaconda就解決了你所面臨的python環境問題。Anaconda的官網連結如下:
Anaconda
我不是很確定,不科學上網的話這個網站是否打得開,所以為大家準備了百度網盤的下載:
連結:https://
pan.baidu.com/s/1MxNm5R
IZO6SowKpL4VdTXw
提取碼:bgzn
復制這段內容後開啟百度網盤手機App,操作更方便哦
請註意這個版本是基於win10位的。下載完之後,請找到:
雙擊執行,一直下一步即可。
在安裝過程中,唯一需要註意的是,你會遇到是否添加環境變量的選擇。
環境變量是電腦作業系統使用的一些參數。如果你勾選了下圖中的第項個,安裝程式會跳出來一個警告,建議你不要自動添加anaconda的path。
但是我們不聽它的,勾選,繼續下一步。
最後,安裝完成。
這個時候,你的電腦的開始資料夾裏,會有anaconda出現,如下圖所示。
Anaconda安裝結束。
讓我們確定下python是否安裝成功。
點選開始->Anaconda3(64bit)->Anaconda Prompt(Anaconda3),你將啟動了一個anaconda的命令列程式。
命令列是你給電腦下指令的最直白的方式,最常用的是cmd。prompt也是一個命令列程式,隨著python學習的不斷深入,我們會時不時的使用一下。在此,我們先混個臉熟,簡單熟悉下界面。
命令列程式有一個黑底白字的互動界面(當然你可以調成白底黑子),在這裏,你和你的電腦可以直接的對話。幾乎所有的電腦的行為都可以透過命令列來發出指令,比如,我們執行下python直譯器,請在命令列內輸入:
python
透過鍵入
python
我們等於告訴電腦:啟動python直譯器。
接著,電腦懂了你的指令,輸出了python的版本等資訊,接著進入了python。
這並不是我們寫程式的地方。雖然我們可以直接在命令列下寫程式碼,但是這太復雜,不方便,因此我們結束python,把命令列關掉即可。
無論如何,當你能從命令列成功執行python直譯器時,就說明我們的安裝沒有問題。
1.5.2 Jupyter Notebook初探
如上文所述,使用命令列來寫python是個糟糕的選擇。市面上流行的程式碼編輯器有很多,包括了:
· vscode
· spyder
· pycharm
等等,而且都不錯。但是我在這裏推薦給大家的是Jupyter Notebook。Jupyter Notebook是基於網頁的用於互動計算的應用程式。其可被套用於全過程計算:開發、文件編寫、執行程式碼和展示結果。對於從事數據工作的人來說,我認為jupyter有一個非常棒的優點,即可以將你的程式碼,以筆記的形式呈現出來,方便報告與以後的檢視。本系列教程的所有文件均為jupyter格式,即使是這一篇,沒有程式碼的文章。
Jupyter Notebook啟動
點選開始->Anaconda3(64bit)->jupyter Notebook(Anaconda3),你將啟動Jupyter。
一個命令列視窗將被自動開啟,並且自動執行一些指令;同時,你的預設瀏覽器將跳轉到一個嶄新的界面,如下圖所示:
為了方便起見,請將Jupyter Notebook程式固定到你的工作列裏,右鍵,固定到工作列。這樣你下次啟動Jupyter就省事很多了。
建議大家在Documents下新建一個MyProjects資料夾,並在MyProjects資料夾下新建一個PythonLearning的資料夾,用以保存明天起,我們所需要的程式碼檔。
1.5.3 Notebook檔
下面我們會建立一個jupyter notebook檔,並依此作為樣板,來做python基礎語法的說明。
請進入到你試圖保存的資料夾裏,
當你從瀏覽器中進入到你想存放程式碼的位置後,就可以新建一個notebook文件了。
你的瀏覽器會自動開啟一個新的網頁,頁面如下。同時,你的硬碟上會會多出一個以字尾名.ipynb結尾的檔,這就是我們寫程式碼的地方。
其實,jupyter的使用要比別的編輯器簡單的多,剛開始,我們只需要註意五個地方:
- 文件名:
預設的文件名可以更改,你只需點選一下,就可以按照自己的需要更改文件的名稱了;
2. 保存\增加cell:
Jupyter中,程式碼或筆記都是在一個個cell中執行的。通常我們使用ctrl+s直接保存文件,以防遺失。而使用快捷鍵b來在當前cell下增加一個新cell;
3. 執行cell/停止執行/重新開機直譯器/重新開機直譯器並執行所有cell:
執行cell中的程式碼或者筆記,快捷鍵是ctrl+enter;如果你不小心寫了個死迴圈之類的,可以使用停止鍵;
4. cell模式切換:
notebook中,cell有兩個基本模式:用於程式碼執行的程式碼模式,用以寫筆記的md模式;同時,cell還有兩個狀態:編輯狀態和結束狀態。
5. cell:
你用以編寫程式碼或者筆記的地方。
至此,jupyter notebook的最最基本用法已經講完了。雖然jupyter還有很多能講的東西,咱們先破車上路,用起來再說。