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跳

回测配置
CTA策略之商品期货简易马丁格尔
回测绩效
CTA策略之商品期货简易马丁格尔
资金曲线
CTA策略之商品期货简易马丁格尔
日志信息
CTA策略之商品期货简易马丁格尔

五、马丁格尔策略升级

马丁格尔策略最大的风险是市场一直处于单边行情,如果交易者的持仓方向与市场方向背道而驰,那么积累起来的头寸是非常恐怖的。如果交易者的初始资金是1万元,亏损时以2倍加仓,那么只需要连续亏损7次就会爆仓。但如果把倍投改为1.5,情况就会好很多,连续亏损12次才会爆仓;如果把倍投改为1.1,则需要连续亏损49次才会爆仓。因为占用的资金量比较小,操作起来风险相对变小了。

CTA策略之商品期货简易马丁格尔

上图是一个倍投数和资金投入比例图,由此可见采用较低的倍投数,所占用的资金非常小,策略抗风险能力就越强,所以为确保资金安全,实盘建议使用低倍投数,建议在实盘之前计算好倍投数,最好是能扛连续亏损十几次的倍投数。

六、总结

交易概率既是交易本质,没有人敢保证每次下单百分之百盈利。可以说当你用绝佳的理由和时机下单时,风险其实就已经存在了。马丁格尔策略尤其适用于趋势行情,只要交易者能够合理判断趋势,沿着趋势进行的方向开仓,并设置好风险回报比,也能获得非常稳健的回报。

上一篇:【Scala】05 对象特性Part2


下一篇:CMake基础 第18节 Boost单元测试框架