在歷史時間序列上最大化賬戶淨值
輸入:
大小為 N 的 OHLC 外匯柱陣列,最大槓桿 L,例如 200:1,固定的買入賣出價差 S,固定的前瞻洗盤視窗 W(例如,3 根柱長,見下文)。
期望
的輸出:元組列表 {array index, action = Buy Mkt|Sell Mkt|DoNothing, Leverage, hold count}
借助事後諸葛亮的好處,建構一個貪心算法(它很少關心風險),旨在從給定數據中提取最高可能的損益。
買賣差價可確保在開倉或平倉後立即產生少量損失。固定的前瞻洗盤視窗確保算法並不總是選擇最大槓桿。例如,如果 W=3,這意味著如果算法僅多持有 3 個柱,那麼洗盤操作可能會導致損益嚴重侵蝕。因此,由於 W,必須使用調整後的槓桿,以減少對浮動賬戶餘額(外匯術語中的“權益”)的傷害。
所需輸出的範例:
$$ bar 0, Buy, 180:1, 18 $$ # 頭寸在 18 根柱後平倉,洗盤的危險很小 $$ bar 19, DoNothing, Nil, 12 $$ # 12 根柱沒有採取任何行動,可能是由於橫向移動和傳播 $$ bar 32, Sell, 13:1, 11 $$ # 頭寸在 11 根柱線後平倉,前方有洗盤的高風險 … 等等 … 請提供指導如何使用 python 數字塔或 R 來解決這個問題。我沒有做太多的事情來解決這個問題,因為我不知道該怎麼做。注意:輸入數組的大小可能非常大,所以如果全域最大值難以在多項式時間內計算,那麼“足夠好”的局部最大值就可以了。
更新:唯一值得補充的是 W 對槓桿的影響。一些例子 - 假設 W 中的任何柱線將目前交易的 P&L 帶入負數區域,在這種情況下應該輸出 DoNothing;假設 W 中的任何一根柱線將目前交易的 P&L 帶入略為正的區域,例如 +1%,在這種情況下,問題是我們應該減少多少槓桿 - 我不知道,但線性函式可能是合適的,例如 1%最大 200:1,即 W 之前的柱線為 2:1。不用說,每筆交易都以最大槓桿開始,然後在達到 W 時進行調整。
如果您提供了一個小的數字範例來說明您想要實現的目標,這將有所幫助,即一些範例條加上一個好的解決方案。
但無論如何,IIUC,我會直接將問題作為優化模型來處理:你有 $ N $ 酒吧。假設您總是在收盤時交易,那麼候選解決方案將是長度向量 $ N $ 保持沿條的位置。(交易是這個向量的變化。)
現在編寫一個函式,將這樣的向量映射到最終的損益中,給定你的柱。(該函式也可以映射為風險調整後回報的度量。)這是您的目標函式。現在使用優化算法將一些初始解向量“演化”成一個好的解。
最後,將解決方案向量轉換為元組集合。
更新,回應評論:我概述的方法的優點是通用且靈活:通用,因為您擁有完整的股權時間序列,並且您可以評估任何目標函式(例如股權回撤);靈活,因為您可以稍後添加更多限制和改進。
缺點是使用迭代優化算法,必須在每次迭代中重新計算淨值曲線,因為曲線是路徑相關的(槓桿取決於策略過去的成功)。
在計算最佳交易順序時,您有哪些時間限制?您願意花多少時間來實施它並使其更快?(參見規範參考https://xkcd.com/1205/)
就個人而言,我會嘗試一種基於本地搜尋的算法來實現所概述的方法。這樣的算法將通過增量更改解決方案來改進解決方案,這將在優化過程中提供許多更新權益曲線的機會。也就是說,您不會在每次迭代中從頭開始重新計算權益曲線,而只會針對候選解決方案中的最新變化對其進行更新。