這是「構建更好的策略」系列的第三部分。在上一部分中,我們討論了10個被廣泛利用的市場無效性,並提供了一些交易策略的示例。在這一部分中,我們將分析開發基於模型的交易系統的一般過程。幾乎任何事情,您都可以(至少)以兩種不同的方式制定交易策略:「理想的方式」和「真實的方式」。我們從理想的開發過程開始,分為10個步驟。
理想的基於模型的策略開發
步驟1:模型
選擇上一部分中列出的其中一個無效性,或者發現一個新的無效性。您可以盯著價格曲線,尋找可以由某種市場行為解釋的可疑事物。或者反過來,對行為模式進行理論化處理,並檢查是否可以在價格中反映出來。如果您發現新內容,請隨時在此處發布!
確定模型後,確定將產生哪個價格曲線異常,並使用定量公式或至少使用定性標準對其進行描述。下一步將需要它。作為示例,我們使用上一部分中的周期性模型:
不要低估周期。有傳言說,歷史上最成功的基金之一Jim Simons的Renaissance Medallion基金可以通過分析周期的長度(C i),相位(D i)和幅度(a i)使用隱馬爾可夫模型。不用擔心,我們將在示例中使用更簡單的方法。
步驟2:研究
找出假設的異常是否確實出現在您要交易的資產的價格曲線中。為此,您首先需要足夠的交易資產歷史數據:D1,M1或Tick數據,具體取決於異常的時間範圍。需要多少數據?儘可能多,因為您想找出異常的壽命以及異常發生的市場條件。編寫腳本以檢測並顯示價格數據中的異常。對於我們的周期模型,這將是頻譜:
查看頻譜在幾個月和幾年中的變化。與隨機數據頻譜進行比較(使用Zorro,您可以使用Detrend函數將價格曲線隨機化)。如果您沒有發現異常的明顯跡象,或者與隨機數據沒有明顯差異,請改進檢測方法。如果仍然無法成功,請返回步驟1。
步驟3:算法
編寫一個算法生成交易信號。市場無效性通常對價格曲線的影響很小。因此,您的算法在區分隨機噪聲方面必須非常出色。同時,它應該儘可能的簡單,並依賴儘可能少的參數。在我們的「周期模型」中,在正弦曲線的波谷做多,波峰位置做空:
這是系統的核心。現在是第一次回測的時候了。此時的精確性能並不重要-只需確定算法是否具有優勢即可。至少在某些市場時期或情況下,它可以產生一系列有利可圖的交易嗎?如果沒有,請改進算法或編寫另一種算法,以另一種方法利用相同的異常。但請不要使用任何停止,拖曳或其他鈴聲。他們只會扭曲結果,並給您帶來幻覺,即使沒有利潤。您的算法必須能夠通過純逆轉或至少在定時退出時產生正收益。
在這一步中,您還必須決定回測數據。通常,您需要M1或報價數據才能進行實際測試。每日數據不會。數據量取決於壽命(在步驟2中確定)和價格異常的性質。自然地,時間越長,測試就越好-但越多並不總是越好。通常情況下,追溯到10年是沒有意義的,至少在您的系統利用某些實際的市場行為時至少沒有意義。市場在十年中發生了巨大變化。過時的歷史價格數據會產生非常誤導的結果。15年前具有優勢的大多數系統在當今市場上都會慘敗。但是他們可以通過看似有利可圖的回溯欺騙您。
步驟4:篩選器
無效性不會一直存在,任何市場都會經歷隨機行為時期。對於任何系統來說,至關重要的是要有一個過濾器機制來檢測效率是否低下。過濾器至少與交易信號同等重要,甚至更多-但在交易系統中通常會被遺忘。這是帶有過濾器的示例腳本:
我們將以主導周期為中心的帶通濾波器應用於價格曲線,並測量其幅度。如果幅度高於閾值,則我們得出結論認為存在低效率,我們進行交易。現在,交易持續時間也被限制為最多10個周期,因為我們在步驟2中發現主導周期在相對較短的時間內出現和消失。
在此步驟中可能會出問題的原因是,僅僅因為它可以改善測試結果而傾向於添加過濾器。任何濾波器都必須在市場行為或所用信號算法中有合理的理由。如果您的算法僅通過添加不合理的過濾器而起作用,請返回步驟3。
第5步:優化(但不要太多!)
系統的所有參數都會影響結果,但是只有少數幾個參數直接取決於價格曲線來確定交易的入場點和出場點。這些「適應性」參數應該被識別和優化。在上面的示例中,開倉由正弦曲線的相位和濾波器閾值確定,平倉由時間確定。其他參數(例如DominantPhase的濾波器常數和BandPass函數)不需要修改,因為它們的值不取決於市場情況。
適應是一個優化的過程,也是失敗的巨大機會,甚至沒有引起注意。通常,遺傳或蠻力方法可用於在參數空間的利潤峰值處找到「最佳」參數組合。為此,許多平臺甚至都具有「優化程序」。儘管此方法確實可以產生最佳的回測結果,但對於系統的實時性能完全沒有幫助。實際上,最近的一項研究(Wiecki等人,2016年)表明,優化參數越好,系統在實時交易中的表現就越差!這種矛盾效應的原因在於,為了獲得最大的利潤而進行優化會使您的系統最適合歷史價格曲線中的噪聲,因為噪聲對結果峰值的影響遠大於市場效率低下的情況。
除了產生最佳的回測結果,正確的優化還有其他目的:
l 它可以確定系統對其參數的敏感性。如果系統適合某個參數組合,但是當它們的值改變很小時就會失去優勢:返回到步驟3。
l 它可以識別參數的最佳位置。最有效的地方是參數魯棒性最高的區域,即,較小的參數變化對返回值的影響很小。它們不是峰,而是參數空間中寬闊山丘的中心。
l 它可以使系統適應不同的資產,並使其能夠交易參數略有不同的資產組合。它還可以通過與實時交易平行的固定時間間隔使其適應當前市場狀況,從而延長系統的使用壽命。
以下是參數優化的示例腳本:
這兩個優化調用使用一個起始值(在兩種情況下均為1.0)和一個範圍(0.7..2.0)來確定系統兩個基本參數的最佳位置。您可以在優化過程中生成的兩個參數的利潤因子曲線(紅色條)中標識出點:
在這種情況下,優化器將為正弦相位選擇一個參數值,對於當前資產(EUR / USD)的幅度閾值,選擇一個參數值,約為1.0(不是0.9處的峰值)。平倉時間在此步驟中未得到優化,因為稍後將在實施風險管理時與其他平倉參數一起進行優化。
步驟6:樣本外分析
當然,參數優化可以提高該策略的回測性能,因為該系統現在可以更好地適應價格曲線。因此,到目前為止的測試結果毫無價值。為了了解實際性能,我們首先需要將數據分為樣本內和樣本外時段。樣本內時間段用於訓練,樣本外時間段用於測試。最好的方法是步行分析。它使用滾動窗口進入歷史數據以將測試和訓練時段分開。
不幸的是,WFA向系統添加了兩個參數:WFA循環的訓練時間和測試時間。測試時間應足夠長,產生足夠多的交易次數。訓練時間更為關鍵,訓練時間太短將無法獲得足夠的價格數據以進行有效優化,太長也會產生不好的結果,因為市場在訓練期間可能已經發生變化。因此,訓練時間本身就是必須優化的參數。
五個周期的前向分析(在上面的腳本中添加「 NumWFOCycles = 5; 」)將回測性能從100%的年度回報降低到更現實的60%。為了僅通過幸運地選擇測試和訓練時間來防止WFA仍然產生過於樂觀的結果,在模擬的起點略有不同的情況下多次執行WFA也很有意義。如果系統有邊緣,則結果應該不會太大不同。如果它們變化很大:請返回到步驟3。
步驟7:真實性檢查
即使測試現已超出樣本範圍,但僅通過開發過程(即根據性能選擇算法,資產,測試期和其他要素)就為結果增加了很多選擇偏見。它們是由系統的真正優勢引起的,還是僅由偏頗的開發引起的?確定這一點是戰略制定中最困難的部分。
找出問題的最佳方法是White的Reality Check。但這也是最不實用的,因為它要求在參數和算法選擇方面有嚴格的紀律。其他方法不那麼好,但是更容易應用:
蒙特卡洛。通過改組而不是替換將價格曲線隨機化,然後再次進行訓練和測試。重複多次並繪製結果的分布圖。隨機化可消除所有價格異常,因此您希望性能顯著降低。但是,如果實際價格曲線的結果位於隨機分布峰值的東側,則很可能也是隨機性造成的。那意味著:回到步驟3。
變體。這與蒙特卡洛方法相反:將訓練有素的系統應用於價格曲線的變體,並希望獲得積極的結果。保持大多數異常的變量是過採樣,下降趨勢或反轉價格曲線。如果該系統使用這些變體保持盈利,但不能使用隨機價格,則您可能確實找到了一個可靠的系統。
真正的樣本外(ROOS)測試。在開發系統時,請完全忽略最後一年(2015年)。甚至從您的PC上刪除所有2015年價格歷史記錄。僅在系統完全完成後,才下載數據並運行2015測試。由於2015年數據只能以這種方式使用一次,然後被汙染,因此如果2015年系統出現故障,您將無法再對其進行修改。只需放棄它即可。
步驟8:風險管理
到目前為止,您的系統在所有測試中均倖免。現在,您可以集中精力降低其風險並提高其性能。請勿再觸摸輸入算法及其參數。您現在正在優化平倉。現在,我們可以應用各種尾隨停止機制,而不是在開發階段使用簡單的定時退出和反轉退出。例如:
l 與其在一段時間後退出,不如將每小時的止損提高一定數量。這具有相同的效果,但是將儘早關閉無利可圖的交易,並在稍後結束有利可圖的交易。
l 當交易獲勝一定數量時,將止損放置在盈虧平衡點上方一段距離處。即使鎖定利潤百分比並不能改善整體績效,對您的健康也有好處。看到有利可圖的交易回到虧損區域會導致嚴重潰瘍。
以下為示例腳本,其初始定時退出被止損限制所取代,該止損限制在每個柱線處都增加:
當然,您現在必須優化並使用退出參數再次運行前向分析。如果性能沒有提高,請考慮使用更好的退出方法。
步驟9:資金管理
資金管理有三個目的。首先,將您的利潤再投資。其次,將資金分配到投資組合中。第三,迅速確定交易書籍是否無用。打開「資金管理」一章,閱讀作者的投資建議。如果是「每筆交易投入您資本的1%」,您就會知道他為什麼要寫交易書籍。他可能還沒有通過真實交易賺錢。
假設您在給定時間t的交易量為 V(t)。如果您的系統有利可圖,那麼平均而言,您的資本C將以增長因子c與V成比例地增長:
當您遵循交易書籍的建議並始終以固定比例的資本p投資,從而V (t) = p C(t)時,您的資本將以指數pc指數增長:
不幸的是,您的資金也會隨機波動,稱為Drawdowns。虧損與交易量V(t)成正比。在無限制提款的槓桿帳戶上,從統計考慮可以看出,最大提款深度D max與時間t的平方根成正比:
因此,使用固定百分比的投資:
並且在時間T = 1 /(qp)2時:
您會看到,在時間T = 1 /(qp)2左右,無論您的策略有多盈利以及如何選擇p,虧損都會吞噬您的所有資本C(T)!這就是為什麼1%規則是個壞建議。以及為什麼我建議客戶不要將交易量與其累積利潤成比例地增加,而是與其平方根成比例-至少在槓桿帳戶上。然後,只要策略不惡化,他們就可以與追加保證金保持安全距離。
根據您是交易一種資產和一種算法還是兩者的投資組合,可以使用多種方法來計算最佳投資。還有由OptimalF公式拉爾夫·文斯,凱利公式由埃德索普,或均值/方差最優化的哈裡維茨。通常,您不會對您的策略進行硬編碼再投資,而是從外部計算投資量,因為您可能會不時提款或入金。這要求總體積是手動設置的,而不是通過自動化過程設置的。在《黑皮書》中可以找到適當的再投資和提款公式。
步驟10:準備進行實時交易
現在,您可以定義交易系統的用戶界面。確定要實時更改的參數,以及僅在系統啟動時更改的參數。提供一種控制交易量的方法,以及一個「緊急按鈕」,以在發生壞消息時鎖定利潤或套現。實時顯示所有交易相關參數。添加用於重新訓練系統的按鈕,並提供一種將實時結果與回測結果(例如冷血指數)進行比較的方法。確保可以隨時隨地對系統進行監控,例如通過在線狀態頁面。不要試圖每五分鐘查看一次。但是,當您在山頂拔出手機時,會給人留下深刻的印象。阿拉拉特(Ararat)並向您的登山者解釋:「只要檢查一下我的交易。」
真正的策略開發
到目前為止的理論,一切都很好,但是您如何真正開發交易系統?大家都知道,理論與實踐之間存在巨大差距。正如許多經驗豐富的算法交易商所證明的那樣,這是真正的開發過程:
步驟1:訪問交易論壇,找到有關具有驚人回報的新指標的主題。
步驟2:經過長時間的編碼會話後,使指示器與測試系統一起工作。如果回測結果看起來不太好,可能犯了一些編碼錯誤,調試,不斷調試。
第3步:仍然沒有好結果,但是您還有更多技巧。添加尾隨止損。現在結果看起來已經更好了。運行一周分析。對於這種策略,星期二是特別糟糕的一天嗎?添加一個阻止在星期二進行交易的過濾器。添加更多過濾器,以防止在上午10點到12點之間交易,以及價格低於14.50美元時以及滿月(周五除外)交易。等待很長時間才能完成模擬。哇,最後的回測是綠色的!
第4步:當然,您也不會被樣本中的結果所迷惑。優化所有23個參數後,進行前瞻性分析。等待很長時間才能完成模擬。但結果看起來不太好。嘗試不同的WFA周期。最終,以19分鐘的時間段和31個循環,您將獲得令人回味的回測結果!而這完全是樣本!
步驟5:實時交易。
步驟6:結果看起來不太好。
步驟7:等待很長時間,使您的銀行帳戶恢復。在等待的過程中寫一本交易書。
我已將示例腳本添加到2016腳本存儲庫中。在本系列的下一部分中,我們將研究機器學習系統的數據挖掘方法。我們將研究價格模式檢測,回歸,神經網絡,深度學習,決策樹和支持向量機。