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



















評論