譯者 | 阿里云 云棲社區
摘要: 在本篇文章中,我們討論了均線交叉策略的設計、回溯檢驗、基準測試以及實踐中可能出現的若干問題,并結合Python代碼實現了一個基于均線交叉的交易策略系統。
以下為譯文
本篇文章是”Python股市數據分析”內容基于我在猶他州立大學MATH 3900 (Data Mining)課程上的一次講座,第一部分在這里。
在這些文章中,我將介紹一些關于金融數據分析的基礎知識,例如,使用pandas獲取雅虎財經上的數據,股票數據可視化,移動均線,開發一種均線交叉策略,回溯檢驗以及基準測試。而本篇文章中,我討論的話題包括均線交叉策略的設計、回溯檢驗、基準測試以及實踐中可能出現的若干問題,以供讀者思考。
注意:本篇文章所涉及的看法、意見等一般性信息僅為作者個人觀點。本文的任何內容都不應被視為金融投資方面的建議。此外,在此給出的所有代碼均無法提供任何保證。選擇使用這些代碼的個人需自行承擔風險。
交易策略我們把在未來條件滿足時將被終止的交易稱為未平倉交易。多頭倉位是指在交易過程中通過金融商品增值來獲取利潤,而空頭倉位是指在交易過程中通過金融資產價值下跌來獲取利潤。
在直接交易股票時,所有的多頭倉位看漲,所有的空頭倉位看跌。這也就是說,持看漲態度并不需要伴隨著一個多頭倉位,而持看跌態度同樣也不需要伴隨著一個空頭倉位(在交易股票期權時,更是如此)。
這里有一個例子。打算你買入了一只股票,計劃在股價上漲時以更高的價格將股票拋出。這就是多頭倉位:你持有一種金融資產,如果資產價值增長,你將從中獲利。
你的潛在利潤是無限的,而你的潛在損失受到股價的限制,因為股價永遠不會低于0。另一方面,如果你預計一只股票的價格會下跌,你可以向經紀公司籌借股票并出售,以期在后續以較低的價格回購股票,從而獲取利潤。
這種做法稱為做空股票,屬于空頭倉位,即通過股價下跌賺取收益。做空股票的潛在利潤受到股價的限制(最好的做法是,使股票變得一文不值,這樣你可以免費回購這些股票),而損失卻是無限的,因為你可能需要花費任意多的錢來買回籌借的股票。
因此,在允許投資者做空股票前,經紀人需要確保投資者保持良好的財務狀況。
任何交易員都必須有一套規則,決定她愿意在任何一筆交易上投入多少錢。例如,一名交易員可能認為在任何情況下,她在一筆交易中承受的風險都不能超過所有投資的10%。
另外,在任何交易中,交易員必須制定一個由一組條件構成的退出策略,決定她何時退出倉位,從而獲利或止損。交易員可以設置一個目標,即促使她清空倉位的最少利潤。
同樣地,交易員也要明確自身能夠承受的最大損失;如果潛在損失超過了這個金額,交易員將退出倉位,以避免任何進一步的損失(通常通過設置止損指令來實現,觸發該指令以避免進一步損失)。
如果一個方案包括促成交易的交易信號、一套能在任何特定策略情況下明確承受多少投資風險的規則、以及一個適用于任何交易的退出策略,那么我們稱這個方案為一個完整的交易策略。目前,我們關注的是如何設計和評價交易策略。
我們假設任何一筆交易的金額都是投資總資產的一個固定比例;10%看起來是一個不錯的數字。我們決定,對于任何一筆交易,如果損失超過交易金額的20%,我們將結束交易。現在,我們需要一種方法來判斷何時進入倉位以及何時退出倉位,進而獲取利潤。
在這里,我將介紹一種均線交叉策略。我們將使用兩條移動均線:一條表示長期均線,另一條表示短期均線。采用的策略如下:
當短期均線越過長期均線時,交易金融資產。
當短期均線再一次越過長期均線時,結束交易。
當短期均線高于長期均線時,我們應進行多頭交易,當短期均線再次越過(低于)長期均線時,結束此類交易。當短期均線低于長期均線時,我們應進行空頭交易,當短期均線再次越過(高于)長期均線時,結束此類交易。
現在,我們有了一個完整的策略。但在我們決定使用它之前,我們首先應該盡可能地評估這個策略的效果。回溯檢驗是一種常用的方法,該方法基于歷史數據對交易策略所能帶來的利潤多少進行評估。
例如,看看上方圖表中Apple股票的表現,如果20天均線表示短期均線,50天均線表示長期均線,這個交易策略似乎并不能產生多少利潤,至少不如你一直持有多頭倉位更有利可圖。
讓我們看看我們是否可以自動進行回溯檢驗任務。我們首先確定20天均線什么時候低于50天均線,以及相反的情況。
我們把這種差異的標志稱為行情。也就是說,如果短期均線高于長期均線,那么這是一個牛市行情(牛市規則),如果短期均線低于長期均線,則目前為熊市行情(熊市規則)。我使用以下代碼判斷當前的股市行情。
上面的最后一行表明,Apple股票在股市中的行情,有1005天為熊市,有600天為牛市,而有54天股市行情較為平穩。
行情變化時會出現交易信號。當牛市開始時,買入信號會被觸發,而當牛市結束時,拋出信號會被觸發。
同樣地,當熊市開始時,拋出信號會被觸發,而當熊市結束時,買入信號會被觸發(只有當你要做空股票,或使用一些股票期權等衍生品做空市場時,才會對這些感興趣)。
我們很容易就可以獲取交易信號。令rt表示t時刻的股市行情,st表示t時刻的交易信號,則有:
st = sing(rt – rt-1)
st ∈ {-1, 0, 1},其中-1表示”拋出”,1表示”買入”,0表示不采取任何措施,我們可以這樣獲取信號:
我們會買入Apple股票23次,并拋出Apple股票23次。如果我們僅持有多頭倉位,在6年期間只會進行23筆交易,然而,如果我們在每次多頭倉位終止后,由多頭倉位轉為空頭倉位,我們一共會進行23筆交易。(請記住,更加頻繁的交易并不一定就是好的,交易從來不是免費的。)
你可能會注意到,目前的系統并不是很健全,即使是一個短期均線超過長期均線的短暫瞬間,交易也會被觸發,并導致交易立即結束(這樣并不好,不僅僅是因為每一筆實際交易都伴隨著一筆費用,已獲得的收益會因此被迅速稀釋)。
此外,每個牛市行情都會立即轉換到熊市行情,如果你在構建一個允許看漲押注和看跌押注的交易系統,這會導致在一筆交易結束時,立即觸發另一筆在股市中反向押注的交易,這看起來又有些挑剔了。
一個更好的系統應該根據更多的證據來判斷股市正朝著發展的特定方向,但我們現在不會關心這些細節。
現在,讓我們嘗試著確定每次買入和拋出股票時的價格。
從上面我們可以看到,在2013年5月17日,Apple股票的價格大幅下跌,我們的交易系統似乎不能很好地處理這種狀況。
但是,這次股價下跌并不是因為Apple公司受到了巨大的沖擊,而是由于股票拆分。盡管派付股息不如股票拆分那樣明顯,但是這些因素仍可能影響到我們交易系統的效果。
我們不希望我們的交易系統因為股票拆分和派付股息而表現得很糟糕。我們應該如何處理這種情況?一種方法是獲取股票拆分和派付股息的歷史數據,并設計一個處理這類數據的交易系統。
這或許是最好的解決方案,能夠最為真實地反映股票的行為,但是它過于復雜。另一種解決方案是根據股票拆分和派付股息的情況調整股票價格。
雅虎財經只提供調整后的股票收盤價,但是對于我們來說,要得到調整后的開盤價、最高價、最低價,這樣就足夠了。已調整收盤價計算方式如下:
pricetadj = mt x pricet
其中,mt是用來調整股價的系數。只需進行一次除法就可以求出mt的值,因此,我們可以使用收盤價和已調整收盤價來調整股票的其他所有價格。
讓我們回到前面,調整Apple的股價,并用這些調整后的數據重新評估我們的交易系統。
你可以看到,根據股票拆分和派付股息情況調整后的股票價格有明顯的不同。從現在開始,我們將使用這些數據。
現在,讓我們創建一個價值100萬美元的虛擬投資項目,根據我們建立的規則,看看它會如何表現。規則包括:
在任何交易中,僅投資所有投資總額的10%。
如果損失超過交易金額的20%,則退出倉位。
在模擬的過程中,牢記以下幾點:
股票交易以100股為單位。
我們的止損規則包含在股價下跌至一定程度時將股票拋出的指令。因此,我們需要檢查這一期間的低價是否已經足夠得低,以至于觸發止損指令。實際上,除非我們買入了看跌期權,否則我們無法保證以設置的止損價格拋出股票,但為簡單起見,我們將這個價格作為拋出價。
每一筆交易都需要向經紀人支付一筆傭金,這部分費用應該計算在內。但在這里我們不這樣做。
回溯檢驗按如下方式進行:
我們的投資項目總值在六年間增長了10%。考慮到任何一筆交易僅涉及所有投資總額的10%,這樣的表現并不差。
請注意,這個交易策略并不會觸發我們的止損指令。難道這意味著我們不需要止損指令嗎?要回答這個問題并不簡單。畢竟,如果我們選擇了另一個不同的股價來判斷是否拋出股票,止損指令可能真的會被觸發。
止損指令會被自動觸發,且不會詢問指令被觸發的原因。這意味著股價的真實變化與短暫波動都有可能觸發止損指令,而后者我們更為關心,因為你不僅要為訂單支付費用,而且還無法保證以指定的價格拋出股票,這可能會使你的損失更大。
與此同時,你交易股票的走勢仍在繼續,如果止損指令不被觸發,你甚至可以從中獲利。也就是說,止損指令能夠幫助你保持自己的情緒,繼續持有股票,即使它已經失去了自己的價值。如果你無法監控或快速訪問自己的投資項目,例如在度假,它們也能發揮作用。
我曾介紹過一些關于贊成和不贊成止損指令的觀點,但從現在起,我不會要求我們的回溯檢驗系統考慮止損指令。雖然不太現實(我確實相信在工業中實際應用的系統能夠考慮止損規則),但這簡化了回溯檢驗任務。
更為真實的投資項目不會將投資總額的10%押注在一只股票上。更現實的做法是考慮在多只股票上分散投資。涉及多家公司的多筆交易可能會在任何時刻進行,并且大多數投資項目會選擇股票交易,而不是現金。
既然我們將在多只股票上投資,只有當移動均線交叉(不是因為止損)時才退出倉位,那么我們需要改變進行回溯檢驗的方式。
例如,我們將使用pandas中的DataFrame來記錄所有考察股票的買入、拋出訂單,前面的循環代碼也需要記錄更多的信息。
我實現了為多只股票創建訂單數據的代碼,以及一個執行回溯檢驗的函數。
這個虛擬的投資項目投資了十二只(科技)股票,最終的資產增長達到了100%左右。這很好嗎?雖然表面上看起來不錯,但我們會看到我們可以做得更好。
基準測試回溯檢驗只是評估交易策略有效性過程的一部分。我們會對策略進行基準測試,或者與其他的可行(通常是眾所周知的)策略進行比較,以確定我們所能達到的效果。
當你評估一個交易系統時,有一個策略你一定要與它比較,除了少數互惠基金與投資管理人,這個策略的效果是最好的:買入并持有SPY指數基金。有效市場假說聲稱,任何人都無法擊敗市場。
因此,投資者應該一直購買反映市場結構的指數基金。SPY指數基金是一種交易所買賣基金(一種在市場上交易的類似股票的互惠基金),其價值實際上地代表著標準普爾500指數中股票的價值。
通過買入并持有SPY指數基金,我們實際上可以嘗試將回報與市場匹配,而不是試著去擊敗市場。
我通過以下方式獲取關于SPY的數據,并根據收益簡單地買入和持有SPY指數基金。
買入和持有SPY指數基金的效果優于我們的交易系統,至少優于我們現在初期的系統,而且,我們甚至沒有說明,考慮到費用我們這個更加復雜的策略有多么的昂貴。考慮到機會成本和與主動投資策略相關的費用,我們不應該采用這樣的策略。
我們怎樣才能提高我們系統的效果呢?對于初學者而言,我們可以嘗試投資多樣化。我們之前考慮的所有股票都屬于科技公司,這意味著如果科技行業表現不佳,我們的投資項目也會反映出這種低迷的狀況。
我們可以開發一個能夠做空股票或看跌押注的系統,這樣,我們就可以利用市場上各個行業領域的走向。
我們還可以尋找一種能夠預測股價變化的方法。但是,無論我們做什么,都必須擊敗這個基準;否則,我們的交易系統中始終會存在著機會成本。
也存在著其他的基準測試策略,如果我們的交易系統擊敗了”買入和持有SPY基金”這個策略,那么我們可以與這些策略進行比較。這類的交易策略包括:
當每月收盤價高于十月均線時,買入SPY基金。
當十月均線的動量為正時,買入SPY基金。(動量是移動平均過程中的第一個差值,即MOtq = MAtq – MAt-1q。)
(我最早在這里知道了這些策略。)普遍的經驗仍然成立:對于一個包含大量活躍交易的復雜交易系統,如果一個涉及指數基金且不進行頻繁交易的簡單策略擊敗了它,那么不要使用這個復雜系統。實際上,這個要求很難滿足。
最后一點,假設你的交易系統確實在回溯檢驗中擊敗了所有的基準策略。回溯檢驗就能夠預測系統在未來的表現了嗎?不太可能。回溯檢驗存在著過擬合的可能,所以,僅僅是回溯檢驗預測的上漲并不意味著在未來會保持上漲的勢頭。
結論雖然這篇教程以一個令人沮喪的觀點收尾,但是請記住,有效市場假說有很多的反對者。我自己的看法是,隨著交易變得越來越算法化,擊敗市場也將變得更加困難。
也就是說,擊敗市場仍然是有可能的,盡管互惠基金似乎還做不到(但是請記住,互惠基金表現得如此糟糕的部分原因,是因為交易所伴隨的費用)。
這篇教程非常簡短,只涉及一種策略類型:基于移動平均線的交易策略。在實踐中也會應用許多其他的交易信號。此外,我們并沒有深入討論有關做空股票、貨幣交易或者股票期權的細節。
特別地,股票期權的形式非常豐富,能夠提供許多不同的方式來押注股票的走勢。你可以在《Python衍生分析:數據分析,模型,仿真,校準與對沖》一書中了解更多關于衍生品(包括股票期權和其他衍生品)的信息,(對于猶他州立大學的學生)這本書可以在猶他州立大學圖書館中找到。
另一個資源(也是我準備這篇教程時參考的文獻)是O’Reilly出版的圖書《Python金融分析》,也可在猶他州立大學圖書館中找到。
請記住,我們可能(甚至很常見)在股市中虧損。同樣,我們也很難在其他領域獲得像股市那樣的回報,任何投資策略都應該認真對待投資。這篇教程旨在向大家介紹評估股票交易與投資的入門知識,我希望大家能夠繼續研究這些觀點。
End.
微信回復文字,查看系列文章36大數據以獨立第三方的角度,為大數據產業生態圖譜上的需求商、應用商、服務商、技術解決商等相關公司及從業人員提供全球資訊、商機、案例、技術教程、項目對接、創業投資及專訪報道等服務。投稿/合作聯系:dashuju36@qq.com?
網址:
長按二維碼發現驚喜
評論