本文翻譯自2018年最熱門的Python金融教程 Python For Finance: Algorithmic Trading。
這篇 Python 金融教程向您介紹算法交易等內(nèi)容。
技術(shù)已成為金融領(lǐng)域的一項(xiàng)資產(chǎn):金融機(jī)構(gòu)已不僅僅是單純的金融機(jī)構(gòu)了,它正向著技術(shù)公司演進(jìn)。除了技術(shù)帶來(lái)的創(chuàng)新速度和競(jìng)爭(zhēng)優(yōu)勢(shì)以外,金融交易的速度、頻率和大數(shù)據(jù)量,使得金融機(jī)構(gòu)對(duì)技術(shù)的關(guān)注度日益提高,技術(shù)確已成為金融業(yè)的主要推動(dòng)力。
在最熱門的金融編程語(yǔ)言中,有R語(yǔ)言、Python,還有C++、C#和Java。在本教程中,你將學(xué)習(xí)如何開始使用Python進(jìn)行金融分析,其內(nèi)容如下:
Python金融入門必備基礎(chǔ)知識(shí):對(duì)于那些剛接觸金融的人,首先要了解有關(guān)股票和交易策略的知識(shí),什么是時(shí)間序列數(shù)據(jù),以及如何設(shè)置工作空間。
常見(jiàn)的金融分析方法:介紹時(shí)間序列數(shù)據(jù)和常見(jiàn)的金融分析方法,比如使用Python包Pandas進(jìn)行移動(dòng)窗口、波動(dòng)率計(jì)算等等。
簡(jiǎn)單的動(dòng)量策略開發(fā):首先逐步完成開發(fā)過(guò)程,然后開始編寫簡(jiǎn)單的算法交易策略。
回溯測(cè)試策略:使用Pandas、zipline和Quantopian回溯測(cè)試制定的交易策略。
評(píng)估交易策略:優(yōu)化策略使之獲得更好的表現(xiàn),并最終評(píng)估策略的性能和穩(wěn)健性。
從這里下載本教程的 Jupyter notebook 代碼。
Python 金融入門
在進(jìn)入交易策略學(xué)習(xí)之前,最好先來(lái)了解基礎(chǔ)知識(shí)。本教程的第一部分將著重于介紹入門所需的Python基礎(chǔ)知識(shí)。但這并不意味著你將完全從零開始:你至少需要完成 DataCamp 的免費(fèi)課程 Intro to Python for Data Science course,從而學(xué)會(huì)如何使用Python列表、包和NumPy。此外,盡管不是必需,但仍希望你能了解Pandas的基本知識(shí),這是眾所周知的Python數(shù)據(jù)處理包。
然后我建議你參加DataCamp的課程 Intro to Python for Finance,學(xué)習(xí)Python金融的基本知識(shí)。如果你還想要把新學(xué)的Python數(shù)據(jù)科學(xué)技能用于真實(shí)的金融數(shù)據(jù),可以考慮參加 Importing and Managing Financial Data in Python 課程。
股票和交易
當(dāng)一家公司想要擴(kuò)張或承接新項(xiàng)目時(shí),它可以發(fā)行股票來(lái)募集資金。股票代表在公司所有權(quán)中占的份額,并以金錢兌換的形式發(fā)放。股票可以買入和賣出:買賣雙方交易現(xiàn)存的曾發(fā)行的股票。賣出股票的價(jià)格獨(dú)立于公司業(yè)績(jī),股價(jià)反應(yīng)的是供需關(guān)系。這意味著,每當(dāng)一只股票因?yàn)槌晒Α⑹軞g迎等原因被認(rèn)為是‘值得的’,那么它的股價(jià)就會(huì)上漲。
請(qǐng)注意,股票和債券并不完全相同。債券是公司通過(guò)借貸的形式籌集資金,無(wú)論是作為銀行貸款還是發(fā)行債券。
正如你剛才讀到的那樣,買賣或者交易是我們談?wù)摴善彼豢杀苊獾?,但?dāng)然不僅限于此:交易是一種買賣資產(chǎn)的行為,可以是像股票、債券這樣的金融證券,或者是如黃金、石油這樣的有形資產(chǎn)。
股票交易是這樣一個(gè)過(guò)程:買入股票就是將現(xiàn)金轉(zhuǎn)換成公司所有權(quán)的股份,反之,賣出股票就是將股份換回現(xiàn)金。這一切交易都希望能從中獲取利潤(rùn)?,F(xiàn)在,為了獲得豐厚的利潤(rùn),在市場(chǎng)上要么做多,要么做空:要么你認(rèn)為股價(jià)會(huì)上漲并在將來(lái)的高價(jià)位上賣出股票,要么賣出你的股票,期望在低價(jià)位上買回而盈利。當(dāng)你按照固定的計(jì)劃在市場(chǎng)上做多或做空時(shí),你就有了一個(gè)交易策略。
開發(fā)交易策略需要經(jīng)歷若干階段,就如同構(gòu)建機(jī)器學(xué)習(xí)模型那樣:首先制定一個(gè)策略,并以能在電腦上測(cè)試的形式實(shí)現(xiàn)它,然后進(jìn)行初步測(cè)試或回溯測(cè)試,優(yōu)化你的策略,最后評(píng)估策略的性能和穩(wěn)健性。
交易策略通常通過(guò)回溯測(cè)試來(lái)驗(yàn)證:根據(jù)策略制定的規(guī)則,使用歷史數(shù)據(jù),重構(gòu)過(guò)去可能發(fā)生的交易。通過(guò)這種方式,你能夠了解策略的有效性,并在將其應(yīng)用于真實(shí)市場(chǎng)前,把它作為策略優(yōu)化的起點(diǎn)。當(dāng)然,這通通依賴于以下信念:任何在過(guò)去表現(xiàn)良好的策略,也會(huì)在將來(lái)取得好的成績(jī),同樣,任何在過(guò)去表現(xiàn)差勁的策略,在將來(lái)也不可能有好的表現(xiàn)。
時(shí)間序列數(shù)據(jù)
時(shí)間序列是在連續(xù)的、等間距的時(shí)間點(diǎn)上取得的一系列數(shù)據(jù)點(diǎn)。在投資中,時(shí)間序列跟蹤選定數(shù)據(jù)點(diǎn)(如股票價(jià)格)的變動(dòng),它是在特定的時(shí)間跨度內(nèi),等間隔地記錄數(shù)據(jù)點(diǎn)。如果你還是疑惑它到底長(zhǎng)什么樣子,來(lái)看看下面的例子:
x軸代表日期,y軸代表價(jià)格。在上圖中,“連續(xù)的、等間距的時(shí)間點(diǎn)” 就是x軸上以14天為間隔的時(shí)間刻度:注意 3/7/2005 和它的下一個(gè)點(diǎn) 3/31/2005 之間的差值,以及 4/5/2005 和 4/19/2005 等等。
然而,你常見(jiàn)的股票數(shù)據(jù)不僅僅只有時(shí)間和價(jià)格這兩列,大部分時(shí)候有5列,包括時(shí)間、開盤價(jià)、最高價(jià)、最低價(jià)和收盤價(jià)。這意味著,如果時(shí)間間隔設(shè)置為天,你將會(huì)得到某只股票那一天的開盤價(jià)、收盤價(jià),以及最高、最低價(jià)。
現(xiàn)在,你具備了學(xué)習(xí)完本教程的基本概念。接下來(lái)這些概念馬上又會(huì)出現(xiàn),并在后續(xù)的學(xué)習(xí)中變得更深入。
設(shè)置工作空間
準(zhǔn)備工作空間是一項(xiàng)簡(jiǎn)單的工作:基本上只需確保你的系統(tǒng)運(yùn)行了Python和集成開發(fā)環(huán)境(IDE)。然而仍有些辦法可以讓你更容易地開始。
以Anaconda為例,它是Python和R的高性能發(fā)行版本,包含了超過(guò)100個(gè)最受歡迎的Python、R和Scala數(shù)據(jù)科學(xué)包。此外,安裝Anaconda將使你能通過(guò)conda輕松地安裝超過(guò)720個(gè)包,這里conda是集成在Anaconda中的著名管理器,用于管理包、依賴項(xiàng)和環(huán)境。除此之外,Anaconda還包含了Jupyter Notebook和Spyder集成開發(fā)環(huán)境。
聽起來(lái)不錯(cuò),對(duì)吧?
你可以從這里下載安裝Anaconda,同時(shí)不要忘了通過(guò)這篇教程Jupyter Notebook Tutorial: The Definitive Guide查看如何設(shè)置Jupyter Notebook。
當(dāng)然,Anaconda并不是你唯一的選擇:你可以嘗試收費(fèi)的 Canopy Python 發(fā)行版本,或者是 Quant Platform。
Quant Platform 相比于 Jupyter 或 Spyder IDE 更有優(yōu)勢(shì),因?yàn)樗蚰闾峁┝嗽跒g覽器中進(jìn)行金融分析所需的一切。通過(guò) Quant Platform,你可以訪問(wèn)基于圖形用戶界面的金融工程,進(jìn)行基于Python的交互式金融分析,以及使用你自己的Python分析庫(kù)。更重要的是,你還可以通過(guò)論壇與小伙伴們討論問(wèn)題和解決方案。
Python金融基礎(chǔ):Pandas
當(dāng)你使用Python進(jìn)行金融分析,會(huì)經(jīng)常使用到數(shù)據(jù)處理包 Pandas。但當(dāng)你深入時(shí),也會(huì)涉及諸如 NumPy、SciPy、Matplotlib 這些包。
現(xiàn)在,讓我們只關(guān)注 Pandas 并使用它分析時(shí)間序列數(shù)據(jù)。本節(jié)將介紹如何使用 Pandas 導(dǎo)入、探索以及處理數(shù)據(jù)。最重要的是,你將了解如何對(duì)導(dǎo)入的數(shù)據(jù)進(jìn)行常見(jiàn)的金融分析。
將金融數(shù)據(jù)導(dǎo)入Python
pandas-datareader
包允許從谷歌、雅虎財(cái)經(jīng)、世界銀行等數(shù)據(jù)源中讀取數(shù)據(jù)。如果你想知道此函數(shù)提供的最新的數(shù)據(jù)源列表,可參閱此文檔。在本教程中,你將使用pandas-datareader
包讀取雅虎財(cái)經(jīng)的數(shù)據(jù)。首先請(qǐng)確保安裝了此包的最新版本,可通過(guò) pip with pip install pandas-datareader
命令實(shí)現(xiàn)。
提示:如果你想安裝最新的開發(fā)版本,或者遇到任何問(wèn)題,都可以在這里查看安裝說(shuō)明。
請(qǐng)注意雅虎API端口最近已更改,如果你已經(jīng)開始使用該庫(kù),則需要安裝一個(gè)臨時(shí)的修復(fù)補(bǔ)丁,直到該補(bǔ)丁被合并到主干中才能使用pandas-datareader
包從雅虎財(cái)經(jīng)獲取數(shù)據(jù)。在你開始之前,請(qǐng)確保查閱了此問(wèn)題 。
無(wú)需擔(dān)心,在本教程中數(shù)據(jù)已提前為你加載好,所以你在使用Pandas學(xué)習(xí)Python金融時(shí)不會(huì)遇到任何問(wèn)題。
即便pandas-datareader
提供了向Python導(dǎo)入數(shù)據(jù)的許多選擇,它也不是唯一能獲取金融數(shù)據(jù)的包:比如Quandl 庫(kù),就可以獲取谷歌金融數(shù)據(jù):
更多關(guān)于如何使用 Quandl 獲取金融數(shù)據(jù)的信息,可參考此網(wǎng)頁(yè)。
最后,如果你已經(jīng)在金融領(lǐng)域工作了一段時(shí)間,你可能知道最常用的數(shù)據(jù)處理工具是Excel。在這種情況下,你需要了解如何將Excel集成到Python中。
查看 DataCamp 的教程 Python Excel Tutorial: The Definitive Guide ,獲取更多相關(guān)知識(shí)。
使用時(shí)間序列數(shù)據(jù)
當(dāng)你最終將數(shù)據(jù)導(dǎo)入工作空間后,首先要做的事情就是將手弄臟(指清洗、整理數(shù)據(jù)——譯者注)。然而,現(xiàn)在要處理的是時(shí)間序列數(shù)據(jù),這看起來(lái)可能不那么簡(jiǎn)單,因?yàn)樗饕侨掌跁r(shí)間數(shù)據(jù)。
即便如此也不用擔(dān)心。讓我們一步步來(lái),首先使用函數(shù)來(lái)探索數(shù)據(jù)。如果你先前已經(jīng)有R或者Pandas的編程經(jīng)驗(yàn),那么對(duì)于這些函數(shù)就不陌生了。
沒(méi)關(guān)系,你將發(fā)現(xiàn)這很容易!
如上述代碼塊所示,使用pandas_datareader
將數(shù)據(jù)導(dǎo)入工作空間。所得到的對(duì)象 aapl
是數(shù)據(jù)框,一個(gè)二維數(shù)據(jù)結(jié)構(gòu),其每一列可以是不同類型的數(shù)據(jù)?,F(xiàn)在當(dāng)你手頭有了一個(gè)常規(guī)的數(shù)據(jù)框時(shí),首先要做的事情之一是運(yùn)行 head()
和 tail()
函數(shù)來(lái)查看開始和結(jié)束的幾行數(shù)據(jù)。幸運(yùn)的是,當(dāng)你使用時(shí)間序列數(shù)據(jù)時(shí),這一點(diǎn)并不會(huì)改變。
提示:請(qǐng)務(wù)必使用 describe()
函數(shù)來(lái)查看數(shù)據(jù)的統(tǒng)計(jì)摘要信息。
正如介紹中所述,這一數(shù)據(jù)包含四列,分別是蘋果股票每天的開盤價(jià)、收盤價(jià),以及最高、最低價(jià)。此外還有另外兩列,成交量和調(diào)整的收盤價(jià)。
成交量(Volume)這一列記錄每天交易的股票數(shù)量。調(diào)整的收盤價(jià)(Adj Close)是將當(dāng)天的收盤價(jià)進(jìn)行調(diào)整,以包含第二天開盤前的任何舉措。可以使用此列檢查或深入分析歷史回報(bào)情況。
注意索引或行標(biāo)簽如何包含日期,以及列或列標(biāo)簽如何包含數(shù)值。
提示:可以使用Pandas中的 to_csv()
函數(shù)將該數(shù)據(jù)保存為csv文檔,并且通過(guò) read_csv()
函數(shù)將數(shù)據(jù)重新讀回到Python中。當(dāng)因雅虎API端口被更改而無(wú)法獲取數(shù)據(jù)時(shí),這一方法是非常方便的。
現(xiàn)在你已經(jīng)簡(jiǎn)單地查看了數(shù)據(jù)的前幾行以及一些統(tǒng)計(jì)信息,是時(shí)候更深入一些了。
一種方法是檢查索引和列,并選擇某列的最后10行數(shù)據(jù)。后者被稱為構(gòu)造子集,因?yàn)槟氵x擇了數(shù)據(jù)中的一小部分。構(gòu)造子集得到一個(gè)序列(Series),它是一個(gè)可以存儲(chǔ)任何數(shù)據(jù)類型的一維數(shù)組。
請(qǐng)記住數(shù)據(jù)框結(jié)構(gòu)是一個(gè)二維數(shù)組,它的每一列可以存儲(chǔ)不同的數(shù)據(jù)類型。
讓我們?cè)诮酉聛?lái)的練習(xí)中檢查上面所說(shuō)的一切。首先,使用 index
和 columns
屬性來(lái)查看數(shù)據(jù)的索引和列。接著選取數(shù)據(jù)集中 Close
列的最后10個(gè)觀測(cè)量。使用方括號(hào) []
挑出最后10個(gè)數(shù)值。你也許從其他編程語(yǔ)言(比如R語(yǔ)言)中獲知了這一構(gòu)造子集的方法。最后,將后者指定給變量 ts
,并使用 type()
函數(shù)查看 ts
的類型。
方括號(hào)可以很好的對(duì)數(shù)據(jù)取子集,但它可能不是Pandas中最慣用的方法。這就是你還需學(xué)習(xí) loc()
和 iloc()
函數(shù)的原因:前者用于基于標(biāo)簽的索引,后者用于位置索引。
實(shí)際上,這意味著你可以將行標(biāo)簽,如 2007
和 2006-11-01
傳遞給 loc()
函數(shù),而將整數(shù) 22
和 43
傳遞給 iloc()
函數(shù)。
完成下面的練習(xí)來(lái)了解 loc()
和 iloc()
的工作方式。
提示:如果仔細(xì)查看子集數(shù)據(jù),你會(huì)發(fā)現(xiàn)某些天的數(shù)據(jù)是缺失的;如果你更仔細(xì)地觀察其模式,你會(huì)發(fā)現(xiàn)經(jīng)常是缺失兩或三天;這些天是周末或者假日,所以并不包含在你的數(shù)據(jù)中。沒(méi)什么可擔(dān)心的:這很正常,也無(wú)需填補(bǔ)缺失的日期。
除了索引,你可能還想研究其他技術(shù)來(lái)更好的了解數(shù)據(jù)。你永遠(yuǎn)不知道還會(huì)發(fā)生什么。讓我們嘗試從數(shù)據(jù)集中采集20行數(shù)據(jù)樣本,然后按月而不是天對(duì)數(shù)據(jù) aapl
進(jìn)行重新采樣??梢允褂?nbsp;sample()
和 resample()
函數(shù)來(lái)實(shí)現(xiàn):
非常直截了當(dāng),不是嗎?
resample()
函數(shù)使用頻繁,因?yàn)樗鼮闀r(shí)間序列的頻率轉(zhuǎn)換提供了精細(xì)而靈活的控制:除了指定新的時(shí)間間隔,處理缺失數(shù)據(jù)以外,還能選擇對(duì)數(shù)據(jù)重新采樣的方式,如上述代碼所示。asfreq()
方法與之類似,不過(guò)只能實(shí)現(xiàn)前兩項(xiàng)功能。
提示:在 IPython 控制臺(tái)中嘗試代碼 aapl.asfreq("M", method="bfill")
,并查看其輸出結(jié)果。
最后,在進(jìn)行數(shù)據(jù)可視化和常見(jiàn)的金融分析這些進(jìn)階的數(shù)據(jù)探索之前,你可能已經(jīng)開始計(jì)算每天開盤價(jià)和收盤價(jià)之間的差值了。在Pandas的幫助下,可以輕易地實(shí)現(xiàn)這一算數(shù)運(yùn)算;只需將 aapl
數(shù)據(jù)的 Open
列數(shù)值減去該數(shù)據(jù)的 Close
列數(shù)值即可。換言之,就是從 aapl.Open
中減去 aapl.Close
。將結(jié)果存入 aapl
數(shù)據(jù)框中新的一列 diff
中,另外可以使用 del
將其刪除:
提示:請(qǐng)確保注釋掉最后一行代碼,這樣 aapl
數(shù)據(jù)框的新列不會(huì)被刪除,并且你可以檢查算術(shù)運(yùn)算的結(jié)果!
當(dāng)然,了解絕對(duì)收益可幫助你知道自己是否做了一個(gè)好的投資。但是作為一名定量分析者,你可能對(duì)使用相對(duì)方法衡量股票價(jià)值更感興趣,比如某只股票上漲或下跌的幅度。計(jì)算每日的百分比變化便是這樣一種方法。
現(xiàn)在知道這一點(diǎn)很好,不過(guò)也不用擔(dān)心,接下來(lái)你將會(huì)越來(lái)越深入地進(jìn)行了解。
本節(jié)介紹了在開始預(yù)分析之前,進(jìn)行數(shù)據(jù)探索的一些方法。但是仍有可提高的余地,如果你想了解更多,可閱讀 Python Exploratory Data Analysis 這篇教程。
可視化時(shí)間序列數(shù)據(jù)
在使用 head()
, tail()
,索引等方法探索數(shù)據(jù)之后,你大概想要可視化時(shí)間序列數(shù)據(jù)。多虧了Pandas的繪圖功能整合了 Matplotlib 包,使這項(xiàng)任務(wù)變得容易了;只要使用 plot()
函數(shù)并傳遞給它相關(guān)的參數(shù)即可。另外,也可以使用 grid
參數(shù)來(lái)為圖片添加網(wǎng)格背景。
讓我們檢查并運(yùn)行以下代碼,看看如何繪制這樣一幅圖!
如果你想進(jìn)一步了解 Matplotlib 包,并學(xué)習(xí)如何開始使用它,那么可以查看 DataCamp的課程 Intermediate Python for Data Science。