单商品小卖部策略V2.0_年化130%

Author: 区班量化, Date: 2019-10-18 18:01:30
Tags: Grid

曾有人统计,从市场趋势而言,80%的时间都是处于震荡趋势的。网格策略就是应对震荡的一种策略。网格策略具体实现起来有多种方式,但是实质是设定一个相对稳定的加仓策略,只要价格波动满足策略的条件就执行加仓。我们举个例子,比如说价格每跌5%我们就加仓总资金的20%,这样我们在执行最多五次加仓后将会满额使用资金。这里我们同样也可以每上涨5%则减掉初始资金20%的仓位,那么五次后我们将清仓,这就是网格策略的基本思路。 区班主今天介绍一种量化策略,类似网格交易,但是在此基础上,做了一些改进,在某些情况下,可以达到130%的年化收益。区班主把其命名为小卖部策略,就是想象操作者是一个小卖部的经营者。他瞄准市场的一个公允价格,一旦高于公允价格;他就抛出货品,低于公允价格,他就买入货品。另外他有一个小本子,记录了上次的交易价格,一旦货品价格低于上次的交易价格,他也可以突发买入,反之亦然。为了避免无限操作,当资金低于1成或者高于1成时,停止操作。 具体描述一下步骤: 步骤一:观察商品的波动率,找一个公允价格指标,可以是某均线(30分钟线的20周期),也可以是布林中线;默认买入5成仓,并记录成交价格; 步骤二:如果低于公允价格指标3%就指示买入;高于公允价格3%就指示卖出;并记录成交价格; 如果低于上次成交价格5%再指示买入;高于成交价格5%再指示卖出;并记录成交价格; 步骤三:根据当前仓位,决定收到买入指令时,如何操作;仓位1成和9成之间波动,超过此区间不操作,但是可以记录成交价格;每次操作只买入2成仓或1成仓,避免无限操作。 之所以该策略叫单商品小卖部策略,因为该小卖部只有一种商品。后续做为改进方向,我们希望可以增加多种商品轮动,甚至背靠背做空对冲。 我们来运行一下回测,首先我们选择波动率大的ETH来作为该种商品,周期是2019年1月1日到10月10日,这个区间有暴涨,也有暴跌。 可以看到,回测效果还是不错,达到了130%的年化率,另外创造了1651元的交易费用,这个结果应该是交易所和交易者都欢喜的策略。 缺点就是最大回撤还是有点高,达到30%左右。主要的回撤发送在商品大幅下跌的阶段。想想也很好理解,因为这个策略是锚定交易商品的,如果商品价格下跌,那么可能在高位囤了一些货,还没有来得及释放给市场,随着时间拉长,应该能补回来。 注册币乎后https://m.bihu.com/signup?i=1ewtKO&s=4&c=4 ,搜索 物联网区块链 可以联系到作者区班主。 另外需要提醒读者注意的是,本策略还和商品选择有关。尽量选择波动大,且长期看来升值的商品。另一个角度上来说,如果你会结合商品来调节参数,那么再小的波动,只要能覆盖手续费,应该也不是问题。


/*backtest
start: 2019-01-01 00:00:00
end: 2019-10-10 00:00:00
period: 1d
exchanges: [{"eid":"OKEX","currency":"ETH_USDT","stocks":0}]
args: [["OpMode",1,10989],["MaxAmount",1,10989],["TradeFee",0.001,10989]]
*/
//注册币乎后https://m.bihu.com/signup?i=1ewtKO&s=4&c=4
//搜索 物联网区块链 可以联系到作者区班主
function main() {
    var isInit = 1; //表示初始态
    var allAmount;
    var cashRatio;
    var initAccount = _C(exchange.GetAccount);
    var lastPrice;
    var wantRatio;
    var wantOper=0;//期待的操作,0不操作,1买入,-1卖出
    Log(initAccount);
    var mhigh;
    var mlow;
    while (true) {
        var mrecords = exchange.GetRecords(PERIOD_M30);
        //一定周期内的高低点
        mhigh=TA.Highest(mrecords, mnum, 'High');
        mlow=TA.Lowest(mrecords, mnum, 'Low');
        
        var midLine = (mhigh+mlow)/2;
        var ticker = _C(exchange.GetTicker);
        var account = _C(exchange.GetAccount);
        var nowPrice=ticker.Sell;
        var obj;
        
        if (isInit == 1) {  //初始化状态为默认仓;     
            //账户现金乘以比例,除以当前价格,保留小数前3位
            obj = $.Buy(_N(account.Balance * initRatio / ticker.Sell, 3));
            if (obj) { //如果购买成功,就标志开仓
                      opAmount = obj.amount;
                      lastPrice = obj.price;
                      isInit=0; //初始化成功
                      account = _C(exchange.GetAccount);
                      Log("初始开仓:购买量", opAmount);
                      Log("目前持币数", account.Stocks);
            }
        }else{ //日常操作检测
            if(nowPrice>midLine*1.03||nowPrice>lastPrice*1.07){
                wantOper=-1;
            }else if(nowPrice<midLine*0.97||nowPrice<lastPrice*0.93){
                wantOper=1;
            }else{
                wantOper=0;
            }
            
            if (wantOper==-1) { //离市平仓
                lastPrice=nowPrice; //不管买没买成功都修改了一下价格
                allAmount=account.Balance+account.Stocks*ticker.Sell; //计算出总金额
                cashRatio=parseFloat((account.Balance/allAmount).toFixed(3));
                
                if(cashRatio>0.9){ //现金比例大于0.9,不做任何操作 
                    wantRatio=0;
                }else if(cashRatio>0.8){ //现金比例超过0.8,可以抛一成仓 
                    wantRatio=0.1;
                }else{ //其他情况都可以抛掉2成仓
                    wantRatio=0.2;
                }
                
                obj = $.Sell(_N(allAmount*wantRatio/ticker.Sell, 3)); 
                if(obj){
                    opAmount = obj.amount;
                    Log("平仓:卖出量",opAmount);
                    nowAccount = _C(exchange.GetAccount);
                    Log("目前现金",nowAccount.Balance,"盈利",allAmount - initAccount.Balance);
                }
            }else if (wantOper==1) { //开仓买入
                lastPrice=nowPrice; //不管买没买成功都修改了一下价格
                allAmount=account.Balance+account.Stocks*ticker.Sell; //计算出总金额
                cashRatio=parseFloat((account.Balance/allAmount).toFixed(3));
                //Log("准备买入",cashRatio);
                if(cashRatio<0.1){ //现金比例小于0.1,已没钱买了
                    wantRatio=0;
                }else if(cashRatio<0.2){ //现金比例超过0.2,可以买一成仓 
                    wantRatio=0.1;
                }else{ //其他情况都可以买2成仓
                    wantRatio=0.2;
                }
                
                obj = $.Buy(_N(allAmount*wantRatio/ticker.Sell, 3)); 
                if(obj){
                    opAmount = obj.amount;
                    Log("买入:买入量",opAmount);
                    nowAccount = _C(exchange.GetAccount);
                    Log("目前现金",nowAccount.Balance,"盈利",allAmount - initAccount.Balance);
                }
            }
        }
        Sleep(Interval*1000);
    }
}

Related

More

kangx1987 回测不怎么样啊