趨勢交易能賺錢嗎?商品期貨動量效應挖掘初探
在聚寬社群,有人分享了一套商品期貨動量模型,今天借聚寬量化實驗室分享該策略給各位讀者們:
作者開發的策略很簡單,主要目標在於驗證動量策略在商品市場的有效性,為了驗證結果可靠,作者測試了很多期貨品種(4個金屬、6個化工、9個農產品、7個工業品,幾乎要把期貨全品種都驗證了),把資金曲線整合到一起輸出成今天的模型。
因為很多人都懷疑,期貨使用很簡單的趨勢交易方法,就可以賺錢嗎?也擔心我們在模型裡放置了很多複雜條件,或者說擬合調優了引數,才能有較好的績效。
你們真是股票做太多了,沒有去放眼看看其他資產。
本文收集了一些資料,也做了一個最簡單的模型,來證明商品期貨市場,確實存在最簡單原始的動量(可以理解為慣性)效應,無論是股票還是期貨甚至數字貨幣市場,價格延續上一段時間的方向繼續波動,是非常值得探索的一種價格執行方式,也是最容易被數量化的分析方式所捕捉的。
什麼是動量效應
這種類似慣性方向運動的價格變化現象被稱作動量效應。比較專業地說:動量效應是由Jegadeesh和Titman(1993)提出的,是指股票的收益率有延續原來的運動方向的趨勢,即過去一段時間收益率較高的股票在未來獲得的收益率仍會高於過去收益率較低的股票。
美股市場,熱門股票和市場指數都呈現很強的動量效應
我們嘗試過通過均線、高低點突破、通道等方式捕捉動量,讓模型在動量產生時候入場,在動量衰竭或已經呈現反向執行(反轉)時候出場。其中均線表達了最近的平均波動,高低點突破錶達了一個價格區間被突破後,交易者是否會一致認為價格繼續執行,通道突破更大的含義在乎過濾噪音,在通道內部的動量我們確認為不被信任的動量,必須突破通道的上下軌,我們才開倉交易。
動量是可以分析觀測,並且把握的,而反轉雖然也有辦法捕捉,並轉化成收益,但是它更傾向於隨機。隨機波動非常可怕,這是我們大部分利潤被消耗的核心原因,所以做模型,選品種,選週期一定要儘可能避免隨機波動,且建模資料量儘可能大,這樣才能準確觀測把握動量波動。
商品期貨或者股票等市場上的動量,又主要分為兩種,其實是兩個不同的觀察維度導致的。進一步展開剛才說的動量效應,多位學者研究發現,動量效應主要以兩種形式存在。
第一種是時間序列動量效應,指的是前期上漲的品種在未來一段時間有可能繼續上漲,前期下跌的品種在未來一段時間有可能繼續下跌。
另一種是橫截面動量效應,指的是在同一個時間點上,做多相同時間區間內漲幅較高的品種,做空漲幅較低的品種,可以獲得持續穩定的收益。比如每日漲幅前5名,下一日我們繼續做多,每日跌幅前5名,下一日繼續做空。
為什麼會產生動量
今天我們主要介紹時間序列動量的最原始驗證和捕捉方法。但是在此之前,我想再說一點題外話,為什麼會存在動量效應。股票市場上的這些動量效應和反轉效應,來源於投資者的心理認知偏差,比如:
(1)過度自信
人們在決策中總是傾向於過高估計自己的判斷力和決策力,進而容易忽視情況變化造成決策失誤。通常人們認為對某事抱有90%的把握時,事實證明成功的概率大約只有70%。
(2)後悔厭惡
後悔厭惡指當人們做出錯誤的決策時,對自己的行為感到痛苦。為了避免痛苦,人們常常做出許多看起來是非理性的行為。
(3)損失厭惡
損失厭惡是指人們面對同樣數量的收益和損失時,感到損失比收益更加令他們難以忍受。
(4)錨定效應
錨定效應是指人們在對某人某事做出決策時,易受第一印象或者第一資訊支配,人們在接受決策時,會不自覺地給予最初資訊過多的關注。
(5)從眾心理
當人們發現自己與多數人的判斷不一致時,感受到一定的壓力,從而改變原來自己正確的判斷。
圖片來自《大數投資》
這些心理的認知偏差影響了投資者的決策行為,從而使股票市場對某種趨勢反應過度或者反應不足,並最終導致動量效應和反轉效應。
時間序列動量模型原理
股票或期貨價格上漲和下跌,也就是價格執行的幅度,就是動量。動量可以使用百分比度量,也可以使用ATR度量,前者沒有價格量綱,後者有價格量綱,可以再除以時間段內均價去量綱。
根據海通證券研報,Moskowitz, Ooi 和 Pedersen(2012)使用 1985 年至 2009 年間 58 個商品期貨品種的資料研究發現,商品期貨具有明顯的時間序列動量效應,做多前期上漲的品種,做空前期下跌的品種構建的多品種投資組合可以取得持續穩定的超額收益。我們使用我國商品期貨品種來驗證該策略的有效性。
策略邏輯:
做多前 R 個交易日上漲的品種,
做空前 R 個交易日下跌的品種,
每隔 H 個交易日調整一次;
回測時間:2005/01/04 – 2017/01/26;
品種選取:調倉日選取上市滿半年,同時主力合約前 20 個交易日日均成交量大於1 萬手的期貨品種作為可選標的;
引數:
排序期 R 和持有期 H:10 個交易日;
倉位:50%;
保證金:20%;
交易成本:單邊萬分之三;
備註:避免起點日期的影響,將初始資金等權分配到 10 個賬戶中,每個賬戶初始
日期相差一個交易日,將 10 個賬戶裡的資金彙總計算每日的淨值。
如此簡單的策略,可以取得23.58%的年化收益率,收益風險比和calmar 比率分別為1.15和0.96。而同期等權做多策略年化收益率僅為-1.76%,最大回撤高達88%。這說明了靜態持有大宗商品肯定是不行的,這不是一種投資思路,大宗商品的價格具有極大的不確定性。
閱讀更多資料我們可知:動量效應打破了有效市場假說,曾被認為是一種市場“異常”,但隨後,越來越多的股票市場和其他型別的交易市場(如期貨市場)都被證明存在動量效應。且動量因子作為 CTA 量化策略追蹤趨勢的主要因子之一。
不知大家是否留意到,該策略是包含引數的,時間序列動量策略涉及的引數主要有回溯期和持有期。回溯期指計算動量因子的時間長度,用R表示,代表建倉日前一天開始向前推R天,計算這R天的平均收益率;持有期指建倉後持有組合的時間長度,用H表示,代表每隔H天建倉,持有組合至下個建倉日。
根據華泰期貨研究所的資料,當引數組合在10-5情況下收益最高,也就是說用過去10日衡量動量,再持有5天。這樣不斷迴圈向前回測,如果一個品種的動量為正,就做多,為負,就做空。策略不設計任何止損止盈邏輯,因為如果動量發生反轉,我們更傾向於考核模型本省的動量分析能力,來發出出場指令。
在聚寬平臺做期貨策略相對輕鬆,因為有一些可用模板和函式,並且保證了模型的可移植性,關鍵問題還是,用指數回測,然後在當時的真實主力合約上交易,這件事顯得非常靠譜,比一些本地化的PC軟體全部交易在指數合約上完成要真實很多。
首先設計模型第一部分,做回測的環境設定,需要注意我們在這裡使用了定時執行函式run_weekly,大致來完成每5個交易日的調倉效果,為什麼不用計數器每過5天定期調倉呢,之後為大家解讀。
通過market_open函式,我們完成了價格資料的獲取,計算了ATR值,計算了動量值g.Momentum,發出了動量大於0還是小於0的訊號值g.Signal。
Trade函式負責下單,因為我們是一次完成多品種下單,所以要用for迴圈完成,這裡的ins是每個期貨品種,g.instruments我們最初定義的本次模型所覆蓋的品種。這種下單模式,可以理解為,使用TB、MC等軟體,講模型掛載在很多期貨合約上,一起執行。
get_future_code函式是我們自己寫出來各品種的合約完整程式碼,如A8888.XDCE,它可以幫助我們在模型裡更便捷呼叫商品期貨品種屬性,其實也可以通過聚寬的API完成,但是我已經習慣了直接寫成一個dict資料型別。
在獲取交易手數的函式方面,涉及到分配資金這個重要工作,我們撰寫了兩個版本的函式,分別是ATR倒數頭寸,和無ATR等資金版本。
前者也是ATR波動率倒數頭寸(每次使用10%的資金去承擔風險),可以理解為是等波動率配置資金:
cash*0.10/(g.ATR[IndexFuture]future_coef_list[symbol])
後者完全沒有考慮波動率,是等權配置頭寸
合約保證金的表示式是:open_pricefuture_Contract_Size[symbol]g.MarginRate,實際上對於cash,也不應該全部使用,而是應該一個倉位比率,比如cash*0.33,以不超過1/3的倉位去開倉,這裡測試階段,我沒有乘以這個比率:
cash/(open_pricefuture_Contract_Size[symbol]g.MarginRate)
時間序列動量測試效果
之前說過,我們使用了定時函式完成回測工作,而沒有采用日期計數器模式。因為在測試中我們發現,時間序列動量模型會存在較為嚴重的路徑依賴。
何為路徑依賴?
比如我們從2017年1月2日和1月16日,兩個不同的回測週期執行模型,會得到不一樣的結果,在某些品種上差異還挺大。實際上我們發現,上圖中下半部分回測只不過是錯過了關鍵的一兩次開倉,導致整體收益大幅度落後上圖。這屬於測試中的重要誤差。
所以解決此問題方法有兩種:
1、將調倉分散:比如T日開始,每隔5天調倉,則在T日,T 1日,T 2日,T 3日,T 4日,每天都執行模型,分配20%資金交易。這樣基本上避免了路徑依賴問題,但是較為消耗資金,股票類模型尤其如此。
2、使用定時函式:5日的調倉變為run_weekly驅動的每週調倉,這樣還能避免因為3天、7天的節假日造成的某些週日期較少,但是依然間隔週末的問題。因為每隔一個週末,交易者心態都會發生較大變化,市場資金面也是一樣,所以理論上的每5日調倉,應該等同於每週調倉。在資金非常充裕的情況下,要分配到周1~周5,資金不足可以不分配。
按照研報上推薦的週期,10日計算動量,5日調倉,我們獲得此績效如上圖。看起來資金曲線很棒,說明期貨動量效應確實顯著,但是如果變化調倉期,到半個月(等效10日)效果就不行了(下圖),看來還是需要以較快的頻度調倉。
需要注意的是,下圖的多組資金曲線的回測,是通過【研究】呼叫【回測】得到的,具體過程在這裡講過:
https://www.joinquant.com/post/4351?tag=algorithm
上圖為持有期半個月,無ATR的資金曲線
切換回到5日調倉,以等資金模式測試,變化動量計算週期引數,得到下圖。直觀感受是,盈利更高了,回撤更小了,在2016年之後模型的盈利保持情況較好:
上圖為等資金倉位,5日調倉的效果
然後我們註釋掉等資金模組,開啟ATR倒數頭寸模組,得到多組測試績效如下:
上圖為ATR倒數倉位,5日調倉的效果
兩組看上去差異不大,實際上,我們通過匯出績效到Excel仔細觀察後發現顯然ATR組的收益風險比或者說Calmar比率(Calmar Ratio,收益和最大回撤之間的關係)要更好:
以研報和我們實測最佳引數來看,的確是ATR的回撤要更小,在商品期貨這種槓桿市場,更小的回撤,意味著我們可以以更大的槓桿比率去交易,所以一定要多關注最大回撤這個績效指標。在這個很小範圍內(5組)的引數變化測試中,等資金組的Calmar比率是3.99,ATR倒數(等波動率)組的Calmar比率是2.66,提升比率達到50%左右。
今天的對於期貨市場時間序列動量策略的分析基本結束,也許你會認為計算規則過於簡單,缺乏了很多非線性約束或者過濾條件,但實際上,我們保持了系統的魯棒性,驗證了基本的時間序列動量存在性,通過ATR倒數頭寸保持了系統的收益風險比提升。我們想告訴各位讀者,商品期貨上,做序列動量交易,來實現中長期的盈利,忍受略長時間(半年左右)的回撤,是絕對沒錯的。
接下來一段時間,我們可能將研究重點放在截面動量上,以做多“上漲前N名的期貨品種”,做空“下跌前N名的期貨品種”,依然是構建一個相當清晰簡單的策略,來尋找在日頻截面上,全市場是否可以通過做多做空的對衝方式得到較為穩健的收益。時間序列動量也依然有大量可供挖掘的模型,我們會逐步在聚寬平臺實現。
點選“原文連結”,在這裡可以找到本策略對應的完整原始碼。動量效應真的如此有效?快來試試吧,它可不像小市值因子那樣脆弱。