1. 程式人生 > 其它 >CTA策略之商品期貨簡易馬丁格爾

CTA策略之商品期貨簡易馬丁格爾

一、摘要

馬丁格爾策略最早起源於18世紀的法國,不過那個時候它多被用於賭桌上面,之後沒過多久就在歐洲廣為人知。理論上這是一種勝率接近於100%的策略,直到現在在很多交易市場都有它的身影,如:外匯、期貨及數字貨幣市場。然而它真地靠譜嗎?它真的就是傳說中的戰無不勝嗎?本篇就建立一個商品期貨簡易馬丁格爾策略加以論證。

二、馬丁格爾策略原理

馬丁格爾既不是交易策略,也不是交易機制,而是一種資金管理方式。其原理很簡單:交易者每次虧損一定額度,就把下一次下單量加倍,直到盈利時把下單量恢復到初始值。如此一來,只需要盈利一次,不僅可以收回之前的虧損,還能獲得第一次下單量的收益。顯而易見這是一個逆勢翻倍加倉的資金管理方式。

現假設有一枚正反兩面一樣重的硬幣,不斷的拋硬幣,出現正面和反面的概率約等於50%,接下來我們用拋這枚硬幣打賭,最初的下注金額是1元,如果出現正面贏1元,如果出現反面賠1元。理論上,硬幣出現正反的概率是一樣的,因為每次出現的結果相互獨立不受影響,即50%。

根據馬丁策略原理,每次賠錢時就把下注金額調整為上次下注金額的2倍,只需要贏一次就可以挽回之前的所有損失。但當連續虧損時,也將會輸得一無所有。如果本金只有10元,第一次下注1元,出現反面虧損1元,賬戶餘額為9元;第二次下注2元,出現反面虧損2元,賬戶餘額為7元;第三次下注4元,出現反面虧損4元,賬戶餘額為3元;這時就沒有足夠的資金下注了。

三、策略實現

/*backtest
start: 2015-06-01 00:00:00
end: 2021-04-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/


unit = 1
profits = 50
bei = 2


function main() {
    exchange.SetContractType("RM000")
    while (true) {
        let depth = exchange.GetDepth();
        if (!depth) return;
        let ask = depth.Asks[0].Price;
        let bid = depth.Bids[0].Price;
        let position = exchange.GetPosition()
        if (position.length == 0) {
            let redom = Math.random()
            unit = 1
            if (redom < 0.5) {
                exchange.SetDirection("sell")
                exchange.Sell(bid, unit, "開空")
            }
            if (redom > 0.5) {
                exchange.SetDirection("buy")
                exchange.Buy(ask, unit, "開多")
            }
        }
        if (position.length > 0) {
            let type = position[0].Type;
            let profit = position[0].Profit;
            let amount = position[0].Amount;
            if (type == 0) {
                if (profit > profits) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(bid, amount, "多頭止盈,當前盈利:" + profit)
                    unit = 1
                }
                if (profit < -profits) {
                    unit = unit * bei
                    exchange.SetDirection("buy")
                    exchange.Buy(ask, unit, "多頭加倉,當前盈利:" + profit)
                }
            }
            if (type == 1) {
                if (profit > profits) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(ask, amount, "空頭止盈,當前盈利:" + profit)
                    unit = 1
                }
                if (profit < -profits) {
                    unit = unit * bei
                    exchange.SetDirection("sell")
                    exchange.Sell(bid, unit, "空頭加倉,當前盈利:" + profit)
                }
            }
        }
        Sleep(1000 * 60 * 60 * 24)
    }
}

上面的程式碼用最簡單的方式,建立了一個商品期貨簡易馬丁格爾策略,初次下單量是1手,倍投數為2,盈虧間距是50,也就是說當虧損50元時,加倉2倍,當盈利50元時,全部平倉。點選下方連結即可複製該策略:
https://www.fmz.com/strategy/271903

四、策略回測

  • 回測開始日期:2015-06-01
  • 回測結束日期:2021-04-01
  • 資料品種:菜粕指數
  • 資料週期:日線
  • 滑點:開平倉各2跳

回測配置

回測績效

資金曲線

日誌資訊

五、馬丁格爾策略升級

馬丁格爾策略最大的風險是市場一直處於單邊行情,如果交易者的持倉方向與市場方向背道而馳,那麼積累起來的頭寸是非常恐怖的。如果交易者的初始資金是1萬元,虧損時以2倍加倉,那麼只需要連續虧損7次就會爆倉。但如果把倍投改為1.5,情況就會好很多,連續虧損12次才會爆倉;如果把倍投改為1.1,則需要連續虧損49次才會爆倉。因為佔用的資金量比較小,操作起來風險相對變小了。

上圖是一個倍投數和資金投入比例圖,由此可見採用較低的倍投數,所佔用的資金非常小,策略抗風險能力就越強,所以為確保資金安全,實盤建議使用低倍投數,建議在實盤之前計算好倍投數,最好是能扛連續虧損十幾次的倍投數。

六、總結

交易概率既是交易本質,沒有人敢保證每次下單百分之百盈利。可以說當你用絕佳的理由和時機下單時,風險其實就已經存在了。馬丁格爾策略尤其適用於趨勢行情,只要交易者能夠合理判斷趨勢,沿著趨勢進行的方向開倉,並設定好風險回報比,也能獲得非常穩健的回報。