大數(shù)據(jù)文摘作品,轉(zhuǎn)載要求見文末 編譯 | 徐宇文,蔣曄、范玥燦 卞崢,yawei xia 技術(shù)早已成為金融業(yè)的一項資產(chǎn):金融交易的高速、高頻與超大數(shù)據(jù)體量結(jié)合,促使金融機構(gòu)在一年一年不斷地加深對技術(shù)的關(guān)注,在今天,技術(shù)已經(jīng)切實成為了金融界的一項主導(dǎo)能力。 在金融界最受歡迎的編程語言中,你會看到R和Python,與C++,C#和Java這些語言并列。在本教程中,你將開始學(xué)習(xí)如何在金融場景下運用Python。本教程涵蓋以下這些方面:
從這里下載本教程的Jupyter notebook(https://github.com/Kacawi/datacamp-community) 金融場景下的Python入門指南 在進入任何交易策略之前,首先摸清基礎(chǔ)知識脈絡(luò)是有幫助的。本教程的第一部分將會專注于解釋你需要了解的Python基礎(chǔ)知識。然而,這并不意味著你應(yīng)該完全從零開始:你應(yīng)該至少學(xué)過DataCamp上的Intro to Python for Data Science (https://www./courses/intro-to-python-for-data-science)免費課程,從中你會學(xué)到如何使用Python列表,工具包以及NumPy。此外,你最好已經(jīng)了解Pandas這個廣為流傳的Python數(shù)據(jù)操作工具包,不過這不是必須的。如果你確實希望在學(xué)習(xí)本教程之前就已經(jīng)熟知Pandas,你可以考慮學(xué)習(xí)一下DataCamp上的Pandas Foundations (https://www./courses/pandas-foundations)課程。 當一家公司希望實現(xiàn)增長、從事新項目或者擴張,它可以通過發(fā)行股票來提高資產(chǎn)水平。一股代表著對公司的一部分所有權(quán),并通過金錢交易的形式發(fā)行。股票被買進和賣出:買方和賣方交易那些現(xiàn)存的、先前發(fā)行的股權(quán)。股票賣出的價格變化可以獨立于公司經(jīng)營的成功與否:股票價格反映的是供需關(guān)系。這意味著,無論何時,無論是基于成功、還是受歡迎等原因,如果一支股票被認為是搶手的,它的股價就會上漲。 注意,股票并非完全與債券等同,債券是公司通過借貸的方式進行融資的憑證,可能是從銀行貸款,或是發(fā)行債務(wù)。 如前所述, 當談及股票時,買入、賣出或者交易是非常必要的,但顯然并不局限于此:交易是資產(chǎn)買賣的行為,既可以是財政擔保,例如股票、債券;亦或者有形產(chǎn)品,例如金子和石油。 股票交易是一個現(xiàn)金交易過程,即用于購買股票而支出的現(xiàn)金轉(zhuǎn)化為對一家公司的一部分所有權(quán),這部分所有權(quán)能夠通過出售股票的形式轉(zhuǎn)化回現(xiàn)金,并且你有希望從中盈利?,F(xiàn)在,為了獲得豐厚的利潤回報,你可以選擇長期或短期的市場策略:你可能會因為認為股票價格會走高而購入股票,以期在未來以更高的價格售出,你也可能賣出股票,認為將來可以以更低的價格重新買入,以實現(xiàn)盈利。當你遵循一種固定的方式來選擇長期或短期市場策略的時候,你就已經(jīng)有了一個交易策略。 開發(fā)交易策略是一件需要經(jīng)過好幾個階段的事情,就比如,當你在建立機器學(xué)習(xí)模型的時候:你首先構(gòu)建一個策略,將它具體化成一種可以在你的電腦上測試的形式,你進行初步檢驗和回測,優(yōu)化你的策略,最后,你需要評估策略的表現(xiàn)和穩(wěn)健性。 交易策略通常通過回測來驗證:利用歷史數(shù)據(jù),利用你已開發(fā)的交易策略重新構(gòu)建那些過去應(yīng)該發(fā)生的交易。借此,你能獲知你的策略的有效性如何,你也可以以此作為新策略投入市場前的優(yōu)化和提升的起始點。當然,這一切都在很大程度上依賴于一個根本性的理論或者說信仰,那就是任何在過去表現(xiàn)良好的策略也將在未來繼續(xù)表現(xiàn)良好,以及,任何在過去表現(xiàn)不好的策略在未來也將會表現(xiàn)很差。 一個時間序列指的是一個在時間維度依次均勻分布的有序的數(shù)值數(shù)據(jù)點。在投資領(lǐng)域,時間序列追蹤一些特定的數(shù)據(jù)點在特定時間段的變動,例如股票價格,這些數(shù)據(jù)基于正則區(qū)間進行記錄。如果你仍然對這到底是長什么樣子的心存疑問,那么請看一下下面的例子:你可以看到日期被置于x軸,價格標注于y軸。所謂“在時間維度依次均勻分布”在這個例子中就是指日期在x軸上以14天的間隔均勻分布:請注意3/7/2005和下一個點3/31/2005的間隔,以及4/5/2005 和 4/19/2005的間隔。 然而,你在處理股票數(shù)據(jù)的時候可能經(jīng)常會發(fā)現(xiàn)的是,數(shù)據(jù)并不只有兩個包含了時間和價格的列,而是更常見的是,你會有5個列分別包含了在這段時間內(nèi)的時間期間、開盤、最高、最低以及收盤價。這意味著,如果你的周期被設(shè)置為每日更新,一天的所有記錄就能告訴你這一天內(nèi)任何一支股票的開盤和收盤價以及極高和極低波動值。 現(xiàn)在,你已經(jīng)對學(xué)習(xí)本教程所需要掌握的基本概念具備了基本的認知,這些概念將會很快再次出現(xiàn),而你將會在這份教程中對他們了解更多。 準備你的工作環(huán)境是一件簡單的事:你基本只需要確保你的系統(tǒng)上有Python和IDE。然而,你有多種方法可以著手準備,而其中一些可能會稍微更簡單一些。 舉個例子,Anaconda是一個Python和R的高性能分布工作空間,并且包含了100多個最受歡迎的Python、R和Scala數(shù)據(jù)科學(xué)工具包。此外,安裝了Anaconda你就可以通過conda獲取超過720個工具包,以及我們在Anaconda種配置的最新的工具包、從屬工具和環(huán)境管理工具。以及,除此之外,你還能通過它獲取 Jupyter Notebook 和 Spyder IDE。 聽起來像是工作量很大,對嗎? 你可以從這里安裝Anaconda,也別忘了從DataCamp的Jupyter Notebook教程Jupyter NotebookTutorial: The Definitive Guide中查看如何建立你的Jupyter Notebook。 顯然,Anaconda并不是你唯一的選項:你還可以看一下Canopy Python distribution (https://www./products/canopy/)(收費), 或者試試Quant Platform(http:///)。 在使用比如Jupyter或Spyder IDE的基礎(chǔ)上,后者提供了一些額外的好處, 因為它還為你提供了在瀏覽器上進行金融分析所需的一切!通過Quant平臺,你將會獲取基于GUI的金融工程的、可交互的和基于Python的金融分析以及你自有的基于Python的分析工具庫。此外,你還可以進入一個論壇來跟你的同行一起探討解決方案和疑問。 當你在金融中使用Python的時候,你將會經(jīng)常用到數(shù)據(jù)操作工具包,Pandas。但你也會用到其他的工具包例如NumPy,SciPy,Matplotlib等等,它們將會在你一旦深入的時候出現(xiàn)。 現(xiàn)在,讓我們先關(guān)注在Pandas上,并且用它來分析時間序列數(shù)據(jù)。這一部分將會解釋你可以怎樣使用Pandas輸入數(shù)據(jù),探索和操作數(shù)據(jù)。在這之上,你還會學(xué)到如何對你輸入的數(shù)據(jù)進行一些常見的金融分析。pandas-datareader 工具包讓你可以從Google,Yahoo! 金融和世界銀行等渠道讀入數(shù)據(jù)。如果你想要獲得更新版的這項功能所能觸及的數(shù)據(jù)源列表,可以去看一下文檔。這個教程中,我們將會使用這個工具包從Yahoo! 金融上讀入數(shù)據(jù)。 注意,Yahoo API 的終端最近有所變動,而且如果你已經(jīng)想要開始自己使用這個工具庫了,你需要安裝一個暫時的補丁來利用pandas-datareader從Yahoo金融抓取數(shù)據(jù),直到正式的補丁完善。在開始之前,請確保閱讀了這份說明。 當然,請別擔心,在這份教程中,我們已經(jīng)為你載入了數(shù)據(jù),所以在學(xué)習(xí)如何在金融中通過Pandas使用Python的時候,你不會面對任何問題。聰明的思考角度是,雖然pandas-datareader提供了大量抓取數(shù)據(jù)的選項,它仍然不是唯一選項:例如,你還可以利用像Quandl這樣的其它的工具庫從Google金融獲取數(shù)據(jù)。 關(guān)于如何使用Quandl直接抓取金融數(shù)據(jù)的更多信息,請參見這個網(wǎng)頁。 最后,如果你已經(jīng)在金融行業(yè)工作了一段時間,你可能知道最常用于數(shù)據(jù)操作的工具是Excel。因此,你需要知道如何將Python和Excel整合到一起。 更多信息請查看DataCamp的Python Excel Tutorial:The Definitive Guide 。 當你終于在工作空間中獲得數(shù)據(jù)以后,你要做的第一件事就是趕緊上手。然而,既然你現(xiàn)在對付的是時間序列數(shù)據(jù),這看起來便可能不是很直接了,因為你的行標簽中帶有了時間值。 但是,請別擔心!讓我們首先按部就班地利用一些函數(shù)開始探索數(shù)據(jù),如果你先前已經(jīng)有了一些R的編程經(jīng)驗,或者你已經(jīng)使用過Pandas, 你可能已經(jīng)對這些函數(shù)有所了解了。 無論哪種情況,你都會覺得這非常簡單! 正如你在下面的代碼中看到的,你已經(jīng)用過pandas_datareader來輸入數(shù)據(jù)到工作空間中,得到的對象aapl是一個數(shù)據(jù)框(DataFrame),也就是一個二維帶標記的數(shù)據(jù)結(jié)構(gòu),它的每一列都有可能是不同的數(shù)據(jù)類型?,F(xiàn)在,當你手頭有一個規(guī)則的數(shù)據(jù)框的時候,你可能首先要做的事情之一就是利用head() 和tail() 函數(shù)窺視一下數(shù)據(jù)框的第一和最后一行。幸運的是,當你處理時間序列數(shù)據(jù)的時候,這一點是不變的。 小貼士:也可以利用describe() 函數(shù)來獲取一些有用的總結(jié)性統(tǒng)計數(shù)據(jù) 請從這里找到一些附帶的練習(xí) 正如你在介紹部分所看到的,數(shù)據(jù)清楚地包含了四個列,包括蘋果的股票每天的開盤價和收盤價,和極高和極低的價格變動。此外,你還得到了兩個額外的列:Volume 和Adj Close。前一個列是用來記錄在這一天內(nèi)交易的股權(quán)總量。后者則是調(diào)整的收盤價格:當天的收盤價格經(jīng)過細微的調(diào)整以適應(yīng)在后一天開盤前所發(fā)生的任何操作。你可以使用這一個列來檢驗歷史回報或者對歷史回報做一些細致的分析。 前一個列是用來記錄在這一天內(nèi)交易的股權(quán)總量。后者則是調(diào)整的收盤價格:當天的收盤價格經(jīng)過細微的調(diào)整以適應(yīng)在后一天開盤前所發(fā)生的任何操作。你可以使用這一個列來檢驗歷史回報或者對歷史回報做一些細致的分析。 請注意行標簽是如何包含日期信息的,以及你的列和列標簽是如何包含了數(shù)值數(shù)據(jù)的。 小貼士:如果你現(xiàn)在想要使用pandas 的to_csv()函數(shù)把這些數(shù)據(jù)存儲為csv格式的文件,或是通過read_csv()函數(shù)把數(shù)據(jù)讀入回Python。這一點在一些特定場景下是極其便利的,例如說Yahoo API終端發(fā)生了變動,你難以再次獲取數(shù)據(jù)的情況。 現(xiàn)在,你已經(jīng)簡要地檢查了你的數(shù)據(jù)的第一行,并且已經(jīng)查看了一些總結(jié)性統(tǒng)計數(shù)據(jù),現(xiàn)在我們可以稍微深入一步了。 做這件事的一種方法是通過篩選,例如說某一個列的最后十行數(shù)據(jù)來檢查行標簽和列標簽。后者則被稱為取子集,因為你得到的是數(shù)據(jù)中的一個小的自己。取子集得到的結(jié)果是一個序列,也就是一個帶標簽的,可以是任何數(shù)據(jù)類型的一維數(shù)組。 請記住,DataFrame結(jié)構(gòu)是一個二維標記的數(shù)組,它的列中可能包含不同類型的數(shù)據(jù)。 在下面的練習(xí)中,將檢查各種類型的數(shù)據(jù)。首先,使用index和columns屬性來查看數(shù)據(jù)的索引和列。接下來,通過只選擇DataFrame的最近10次觀察來取close列的子集。使用方括號[ ]來分隔這最后的十個值。您可能已經(jīng)從其他編程語言(例如R)中了解了這種取子集的方法??偠灾?,將后者分配給變量ts,然后使用該type()函數(shù)來檢查ts的類型。您可以在這里進行練習(xí)。 方括號可以很好地對數(shù)據(jù)進行取子集,但這可能不是使用Pandas最習(xí)慣的做法。這就是為什么您還應(yīng)該看看loc()和iloc()函數(shù):您可以使用前者進行基于標簽的索引,后者可用于位置索引。 在實踐中,這意味著您可以將行標簽(如標簽2007和2006-11-01)傳遞到loc()函數(shù),同時傳遞整數(shù)(如22與43)到iloc()函數(shù)。 完成原文中的練習(xí),了解loc()和iloc()兩者是如何工作的。 小貼士:如果您仔細查看子集的結(jié)果,您會注意到數(shù)據(jù)中缺少某些日期; 如果您仔細觀察這個模式,您會發(fā)現(xiàn)通常缺少兩三天;這些天通常是周末或公共假期,這些并不是您需要的數(shù)據(jù)。沒有什么可擔心的:它完全正常,您不必補全這些缺失的日期。 除了索引之外,您還可能想要探索一些其他技術(shù)來更好地了解您的數(shù)據(jù)。您永遠不知道還會出現(xiàn)什么。我們嘗試從數(shù)據(jù)集中抽取大約20行,然后對數(shù)據(jù)進行重新采樣,使得aapl按照每月進行采樣而不是每天采樣。您可以利用sample()和resample()函數(shù)來完成這項功能。 非常簡單直接,不是嗎? resample()函數(shù)經(jīng)常被使用,因為它為您的時間序列的頻率轉(zhuǎn)換提供了精細的控制和更多的靈活性:除了自己指定新的時間間隔,并指定如何處理丟失的數(shù)據(jù)之外,還可以選擇指示如何重新取樣您的數(shù)據(jù),您可以在上面的代碼示例中看到。這與asfreq()方法形成清晰的對比,它只有前面兩種選擇。 小貼士:在上述DataCamp Light塊的IPython控制臺中自己嘗試一下。傳遞aapl.asfreq('M', method='bfill')看看會發(fā)生什么! 最后,在您將數(shù)據(jù)探索提升到一個新的水平之前,請先可視化您的數(shù)據(jù)并對數(shù)據(jù)執(zhí)行一些常見財務(wù)分析,您可能已經(jīng)開始計算每天開盤價和收盤價之間的差額。您可以在Pandas的幫助下輕松執(zhí)行這項算術(shù)運算;只需將aapl數(shù)據(jù)Close列的值減去Open列的值。或者說,aapl.Close減去aapl.Open。您可以在aapl DataFrame中創(chuàng)建一個新的叫做diff的列存儲結(jié)果,然后使用del再次刪除它。 小貼士:請確保注釋掉最后一行代碼,以便aapl DataFrame 的新列不會被刪除,這樣您可以檢查算術(shù)運算的結(jié)果! 當然,以絕對的方式知道了收益,可能已經(jīng)幫助您了解您是否做出了一個好的投資,但作為一個金融分析師,您可能會對更有力地衡量股票價值更有興趣,比如某種股票的價值大幅上漲或下跌了多少。這樣做的一個方法是計算每日的百分比變化。 現(xiàn)在知道這一點很好,但不要擔心; 您會進一步深入它! 本節(jié)介紹了一些您在開始執(zhí)行先驗分析之前,可以首先探索數(shù)據(jù)的方法。但是,在這方面您還可以走得更遠。如果您想了解更多,請考慮使用我們的Python Exploratory Data Analysis。 下一步,將使用head(),tail(),索引等等探索您的數(shù)據(jù)。您可能還需要將您的時間序列數(shù)據(jù)可視化。Pandas的繪圖整合了Matplotlib,使得這項任務(wù)變得容易; 只需使用plot()函數(shù)并傳遞相關(guān)參數(shù)即可。此外,您還可以使用grid參數(shù)用以指示在繪圖的背景中添加網(wǎng)格。 如果您在原文中運行代碼,您將會看到以下圖表: 如果您想對Matplotlib了解更多,以及如何開始使用它,請查看DataCamp的Intermediate Python for Data Science課程。 常見的財務(wù)分析 現(xiàn)在,您已經(jīng)了解了數(shù)據(jù),時間序列數(shù)據(jù)以及如何使用pandas快速瀏覽數(shù)據(jù),現(xiàn)在是深入了解一些您可以做的常見財務(wù)分析的時候了,以便您可以開始制定交易策略。 在本節(jié)的其余部分,您將了解有關(guān)回退、移動窗口、波動率計算和普通最小二乘回歸(OLS)的更多信息。 您可以在原文中閱讀并練習(xí)更多關(guān)于常見財務(wù)分析的內(nèi)容。 創(chuàng)建交易策略 現(xiàn)在您對數(shù)據(jù)做了一些初步分析,現(xiàn)在是制定您的第一個交易策略的時候了;但在您進入所有這些之前,為什么不先了解一些最常見的交易策略呢?經(jīng)過簡短介紹,您無疑將更簡單地實現(xiàn)您的交易策略。 您可能還記得,在介紹中,交易策略是一個關(guān)于長期或短期進入市場的固定計劃,但還有更多的信息您還沒有真正得到;一般來說,有兩個常見的交易策略:動量策略和震蕩策略。 首先,動量策略也被稱為分離或趨勢交易。當您遵循這一策略時,您會這樣做的原因是您認為數(shù)據(jù)的移動將繼續(xù)朝著當前的方向發(fā)展。換句話說,您相信股票有可以發(fā)現(xiàn)和利用的慣性,即向上或向下的趨勢。 這個策略的一些例子是移動均線交叉,雙均線交叉和海龜交易: 移動均線交叉發(fā)生在資產(chǎn)的價格從移動平均線的一邊移動到另一邊的時候。這種交叉代表了勢頭的變化,可以作為進入或退出市場的決定點。您會看到這個策略的一個例子,本教程后面的定量交易的“您好世界”。 雙均線交叉發(fā)生在短期平均線跨越長期平均線時。該信號用于識別正在短期平均線的方向上移動的慣性。當短期平均線跨越長期平均線并處于其上方時,產(chǎn)生買入信號,而賣出信號是由短期平均過往長期平均線而低于平均水平觸發(fā)的。 海龜交易最初是由Richard Dennis教導(dǎo)的一個眾所周知的趨勢跟蹤交易。其基本策略是買入20日高點和賣出20天低點的期貨。 其次,震蕩策略也被稱為融合或循環(huán)交易。這一策略背離了數(shù)量運動最終會逆轉(zhuǎn)的觀點。這可能看起來有點抽象,但是當您使用這個例子時它就不會這么抽象了。回歸中值策略,實際上是您相信股票會回到自己的平均水平,那么當您偏離這個平均值時您就可以利用它。 這聽起來很實用,是嗎? 除了回歸中值策略,這種策略的另一個例子是與其相似的配對交易中值回歸?;貧w中值策略基本上表明股票回歸中值,而配對交易策略拓展了這一點,并指出如果兩個股票相關(guān)性相對較高,如果其中一個與另一個移動相關(guān),則可以使用兩個股票價格差異的變化表示交易事件。這意味著如果兩個股票之間的相關(guān)性有所下降,那么價格較高的股票就可以被視為一個空頭。另一方面,價格較低的股票應(yīng)該處于長期狀態(tài),因為其價格將會升高,回歸平均水平。 除了這兩種最常見的策略之外,還有一些您可能偶爾會遇到的其他一些策略,例如預(yù)測策略,這種預(yù)測策略試圖預(yù)測股票的方向或價值,如基于某些歷史因素的隨后的未來時間段。還有高頻交易(HFT)策略,利用了亞毫秒級的市場微觀結(jié)構(gòu)。 這就是關(guān)于現(xiàn)在未來的所有音樂; 讓我們現(xiàn)在關(guān)注開發(fā)您的第一個交易策略! 如上所述,您將從量化交易的“您好世界”開始:移動均線交叉。您將開發(fā)的策略很簡單:您可以創(chuàng)建兩個獨立的簡單移動平均線(SMA),它們具有不同的回溯期,假設(shè)是40天和100天。如果短時移動平均線超過長移動平均線,那么您就走長線,如果長移動平均線超過短移動平均線,則退出。 記住,當您走長線時,您認為股票價格會上漲,將來會以更高的價格賣出(=買入信號); 當您走短線的時候,您賣出您的股票,期望您能以更低的價格買回來,實現(xiàn)利潤(=賣出信號)。 當您剛剛開始時,這個簡單的策略可能看起來很復(fù)雜,但讓我們一步步來:
在準備工作之后,是時候在各自的長短時間窗口中創(chuàng)建一組短和長的簡單移動平均線了。利用的rolling()函數(shù),啟動滾動窗口計算:在函數(shù)中,指定window和min_period,并設(shè)置center參數(shù)。在實踐中,您將short_window或long_window傳遞給rolling()函數(shù), 由于窗口觀測必須要有值,將1設(shè)置為最小值,并設(shè)置False使標簽不設(shè)定在窗口的中心。接下來,不要忘記鏈接mean()函數(shù),以便計算滾動的平均值。 在計算了短期和長期窗口的平均值后,當短移動平均線跨過長移動平均線時,您應(yīng)該創(chuàng)建一個信號,但只能在該周期大于最短移動平均窗口期間創(chuàng)建信號。在Python中,需要滿足這么一個條件:signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:]。請注意,您添加[short_window:]用以滿足條件“只能在大于最短移動平均窗口期間”。當條件為真時,初始化為0.0的signal列將被1.0覆蓋。一個“信號”被創(chuàng)建了!如果條件為假,則0.0保留原始值,不生成信號。您可以使用NumPy的where()函數(shù)設(shè)置此條件。與您剛才讀到的一樣,您分配這個結(jié)果的變量是signals['signal'][short_window],用以在該周期大于最短移動平均窗口期間創(chuàng)建信號。 最后,您可以收集信號的差異,用以產(chǎn)生實際的交易訂單。換句話說,在signals DataFrame的這一列中,無論您是買入還是賣出股票,您可以區(qū)分長倉和空頭。 請看這里的代碼。 這不是太難了?輸出signals DataFrame并檢查結(jié)果。重點是這個DataFrame 中positions和signal列的意義。當您繼續(xù)前進時,您會看到,這將變得非常重要! 當您花費時間了解您的交易策略的結(jié)果時,就可以使用Matplotlib快速繪制所有的這些(短期和長期移動平均線以及買入和賣出信號): 您可以在這里(https://www./community/tutorials/finance-python-trading)找到這個圖表的代碼。 這結(jié)果很酷,不是嗎? 對交易策略進行回溯測試 現(xiàn)在你已經(jīng)掌握了你的交易策略,下一步對它進行回溯測試并計算其業(yè)績是一個很好的想法。但是,在深入了解這一點之前,你可能需要稍微了解下回溯測試(backtesting)的缺陷,在回測器(backtester)中需要哪些組件以及你可以使用哪些Python工具來回測你的簡單算法。 若你已經(jīng)具備了這些知識,你可以繼續(xù)開始運用你的回測器(backtester)。 回溯測試除了“測試交易策略”之外,還對相關(guān)歷史數(shù)據(jù)的策略進行了測試,來確保你在采取行動之前,這是一項切實可行的策略。通過回溯測試,交易員可以在一段時間內(nèi)模擬和分析具體策略的交易風(fēng)險和盈利能力。但是,當你做回溯測試時,請明智的記住這其中會存在一些開始時可能并不明顯的陷阱。 例如,存在一些外部事件,如市場制度轉(zhuǎn)變,這些通常是監(jiān)管變化或宏觀經(jīng)濟事件,絕對會影響你的回溯測試。還有流動性方面的限制,如禁止賣空,可能會嚴重影響到你的回溯測是。 接下來,你可能會提醒自己一些其他陷阱,在你比如,過度擬合一個模型(優(yōu)化偏差)時,在你因認為這樣更好(介入)而忽略策略規(guī)則,或者在你意外地將信息引入到過去的數(shù)據(jù)(前視偏誤)時。 當你真正去做自己的策略并回溯測試它們的時候,你會發(fā)現(xiàn)教程提到的這些陷阱只占需要考慮的很小一部分。 除了陷阱之外,了解回測器通常由四個基本組成部分組成是很有幫助的。它們通常情況下都會出現(xiàn)于回測器中。因此,一個回測器包括以下內(nèi)容:
除了這四個組成部分之外,還有更多你可以添加到你的回測器中,這取決于策略的復(fù)雜性。你完全可以不局限于這四個組成部分。但是,在這個初學(xué)者教程中,你只需要關(guān)注將這些基本的組成部分在代碼中運行。 如上所述,一個回測器由一個策略、一個數(shù)據(jù)處理程序,一個投資組合和一個執(zhí)行處理程序組成。你已經(jīng)實現(xiàn)了上述策略,并且你也有了可以訪問數(shù)據(jù)處理程序的入口. 通過運用pandas-datareader 或者Pandas庫將保存在Excel里面的數(shù)據(jù)導(dǎo)入到Python。接下來需要執(zhí)行的組件則是執(zhí)行處理程序和投資組合。 但是,由于你剛剛開始,你不會專注于實現(xiàn)執(zhí)行處理程序。取而代之的是,你將在下面看到如何開始創(chuàng)建一個可以生產(chǎn)訂單并管理損益的投資組合:
接下來,你創(chuàng)建一個DataFrame來儲存?zhèn)}位(股票數(shù)量)的差異
你的portfolio還包含了一個cash列,這是你剩下可以花費的資金:
代碼可以在這里(https://www./community/tutorials/finance-python-trading)被找到。 作為你的回溯測試的最后一個練習(xí),通過Matplotlib的幫助可視化投資組合的價值或者顯示多年來的portfolio['total'] 和你回溯測試的結(jié)果: 在這里(https://www./community/tutorials/finance-python-trading#gs.Splq1kQ)找到代碼。 請注意,對于本教程,回測器的Pandas代碼以及交易策略以你可以輕松地用交互式來瀏覽的方式組成。在現(xiàn)實生活的應(yīng)用程序中,你可能會選擇一個包含類并更加面向?qū)ο蟮脑O(shè)計,其中包含所有的邏輯。你可以在這里找到帶有面向設(shè)計的與移動平均交叉策略相同的示例或者查看此演示文稿。 你現(xiàn)在看到如何用Python流行的數(shù)據(jù)操作包Pandas來實現(xiàn)一個回溯測試器。但是,你也可以看到,很容易犯錯,而且這可能不是每次使用最萬無一失的選項:因為你需要從頭開始構(gòu)建大部分組成部分,即使你已經(jīng)利用Pandas來獲取結(jié)果。 這就是為什么使用一個回溯測試平臺是很常見的,例如為你的回溯器選擇Quantopian。Quantopian是一個免費的,以社區(qū)為中心,用于建立和執(zhí)行交易策略的托管平臺。它由一個名為zipline用于算法交易的Python庫支持。你可以在本地調(diào)用庫,但為了這個初學(xué)者教程的目的,你將用Quantopian(https://www./community/)來編譯和回測你的算法。在你進行此操作之前,請確保你首先進行注冊了并登錄。 接下來,你可以很簡單地開始。點擊“新算法”(New Algorithm)來開始編寫你的交易算法,或選擇一個已經(jīng)被編碼的例子,讓你更好地了解你正在處理的事情 :) 讓我們從簡單開始并制作一個新的算法,但仍然遵循移動平均交叉的簡單示例,這是你能在ziplineQuickstart guides(http://www./)中找到的標準示例。碰巧這個例子與上一節(jié)中實現(xiàn)的簡單交易策略非常相似。但是,你看到的下面代碼塊中以及上面截圖中的結(jié)構(gòu)與本教程中迄今為止所看到的結(jié)構(gòu)有一些不同,即你有兩個開始工作的定義,及initialize() 和handle_data()。 在這里(https://www./community/tutorials/finance-python-trading)找到代碼。 當程序啟動時,第一個函數(shù)被調(diào)用并執(zhí)行一次啟動邏輯。作為一個參數(shù),initialize() 函數(shù)接受一個context,用于儲存在回溯測試或?qū)崟r交易期間的狀態(tài),并且可以在算法的不同部分中被引用,如下面的代碼所示;你會看到context在第一個移動平均窗口的定義中返回。你會看到你通過符號來制定查找安全的結(jié)果(在這種情況下,股票),(AAPL在這種情況下)并指定到context.security。 handle_data() 函數(shù)在模擬或現(xiàn)場交易中每分鐘被調(diào)用一次,已決定每分鐘防止什么訂單(如果有的話)。該函數(shù)需要context 和data 作為輸入:context與上文剛剛讀到的相同,而data是儲存多個API函數(shù)的對象,例如current() 來檢索給定資產(chǎn)給定領(lǐng)域的最新值或者history() 來獲取歷史定價或交易量數(shù)據(jù)的追蹤窗口。這些API函數(shù)不在下面的代碼中返回也不在本教程的范圍內(nèi)。 請注意 你在Quantopian控制臺敲入的代碼只能在平臺運行而不能在本地Jupyter Notebook中,比如!你會看到data對象允許你檢索price, 用于forward-filled,通過得到最近的已知價格,如果有的話。如果沒有,將返回一個NaN值。 你在上面代碼塊中看到的另一個儲存你的投資組合重要信息的對象是portfolio。正如你在context.portfolio.positions代碼中看到的,該對象儲存在context中也可以作為用戶提供給你的核心函數(shù)訪問。 注意 你剛剛讀到的positions,是用來儲存?zhèn)}位對象并包括股數(shù)和支付的價格等信息。此外,你能看到 portfolio 還有cash property來獲取你投資組合中的現(xiàn)金數(shù)額,而positions對象也有amount property來查看某一倉位的全部股數(shù)。 order_target() 放置一個訂單來調(diào)整目標股數(shù)的倉位。如果資產(chǎn)中沒有倉位,則設(shè)置一個完整目標數(shù)的訂單。如果資產(chǎn)中有倉位,則設(shè)置一個目標股數(shù)或合約與當有持有量差額的訂單。放置負面目標訂單將導(dǎo)致一個做空倉位等同于特定的負數(shù)。 建議:如果你對函數(shù)或?qū)ο笥腥魏我蓡?,請確保查看Quantopian Help page(https://www./help),其中包含有關(guān)本教程中簡要介紹的所有內(nèi)容(以及更多)。 當你使用initialize() 和handle_data() 函數(shù)(或復(fù)制粘貼上述代碼)到界面左側(cè)的控制臺中創(chuàng)建策略時,只需按“構(gòu)建算法”(Build Algorithm)按鈕構(gòu)建代碼并且運行回溯測試。如果你按“運行完全的回測”(Run Full Backtest)按鈕,則會運行完整的回溯測試,這與你在構(gòu)建算法時運行的基本相同,但你將能夠更詳細地查看更多內(nèi)容?;厮轀y試,無論是“簡單”還是完整版,運行都可能需要一段時間,請確保注意頁面頂部的進度條! 你可以在這里(https://www./tutorials/getting-started)找到更多關(guān)于如何開始Quantopian的信息。 請注意Quantopian是開始使用zipline的簡潔方式,但是你通常會移動在本地庫里使用它,比如,你的Jupyter notebook里。 改進交易策略 你已經(jīng)成功地做了一個交易算法,并通過Pandas,Zipline和Quantopian進行回溯測試。可以說你已經(jīng)被普及了如何用Python進行交易。但是,當你完成了交易策略的編寫并回溯測試它,你的工作還沒有結(jié)束;你可能希望改進你的策略。這里有一個或多個算法來持續(xù)地改進模型,例如KMeans,K近鄰(KNN),分類或遞歸樹和遺傳算法。這將是以后DataCamp教程的話題。 除了你可以使用其他算法之外,你還可以觀察到你可以通過使用投資組合來改善策略。只將一個公司或符號并入你的策略,通常不會有太多改進。你還會在評估你的移動平均交叉策略看到改進提醒。其他你可以添加或采取不同的做法是使用風(fēng)險管理框架或使用事件驅(qū)動的回溯測試來幫助減輕你之前閱讀到的前瞻性偏差。還有許多其他可以改善你策略的方式,但現(xiàn)在,這是一個很好的開始! 評估移動平均線交叉策略 改進你的策略并不意味著你已經(jīng)完成了。你可以輕松使用Pandas來計算一些指標,來進一步判斷你的簡單交易策略。在本節(jié)中,你將了解夏普比率,最大跌幅和復(fù)合年增長率(GAGR)。 在這里(https://www./community/tutorials/finance-python-trading)獲取更多閱讀和訓(xùn)練。 除了這兩個指標外,你還可以考慮許多其他因素,如回報分配,貿(mào)易水平指標… 再進一步! 干的漂亮,你已經(jīng)通過了這個Python金融介紹教程!你已經(jīng)學(xué)會了很多基礎(chǔ)知識,但還有更多的需要你去發(fā)現(xiàn)! 查看Yves Hilpisch的Python For Finance書,這本書適合一些有金融背景,但是不太了解Python的人。Michael Heydt的“Mastering Pandas for Data Science”也值得推薦給想要開始在金融領(lǐng)域運用Python的人。也請確保瀏覽Quantstart’s articles(https://www./articles)和this complete series on Python programmingfor finance(https:///python-programming-creating-automated-trading-strategy/)作為算法交易的入門教程。 如果你對如何運用R進行你的金融實踐之旅,可以考慮Datacamp的Quantitative Analyst with R (https://www./tracks/quantitative-analyst-with-r)方向。與此同時,我們將繼續(xù)發(fā)布第二篇關(guān)于如何開始Python在金融領(lǐng)域的運用的文章。請查看Jupyter notebook of this tutorial(https://github.com/Kacawi/datacamp-community)。 原文鏈接:https:///datacamp/python-for-finance-algorithmic-trading-60fdfb9bb20d |
|