网格变种策略(一)

一、网格策略

网格策略,总结为四个字就是:高抛低吸。
例如:首次买入10万元,价格每下跌10,买入1万元,价格每上涨20,卖出5000元。
其最大的好处就是:行情越是震荡,获利空间越大。(反脆弱性)

二、生成模拟交易数据

随机生成交易数据的代码如下:

function generateSimulateData(base,num,lowest,maxDelta){
    var ret = [base];
    var price = base;
    var deltas = [];
    var total = base;
    var min = base;
    var max = base
    for(var i=1; i0.5?1:-1;
        var delta = Math.floor(Math.random()*maxDelta)*sign;
        price += delta;
        if( price <= lowest){
            price = lowest;
        }
        deltas.push(delta);
        ret.push(price);

        if( price > max){
            max = price;
        }
        if( price < min){
            min = price;
        }

        total += price;
    }
    var open = base;
    var close = ret[num-1];
    var avg = total/num;
    var situation = (close/open-1)*100;
    //console.log(`open=${open}, close=${close}, avg=${avg}, max=${max}, min=${min} situation=${situation.toFixed(2)}%`);
    return {s:situation.toFixed(2),prices:ret};
}

假设我们要生成100个具有如下特征的数据:开盘价为1000,价格之间的波动幅度为0-4之间,最多跌到200(会不会跌到200,不一定)可以这样调用该函数:

let simulateData = generateSimulateData(1000,100,200,5);
console.log("{s:<涨跌幅>,prices:<具体数据>}")

三、网格变种策略 v1.0

前提:

  • 资金无穷大
  • 交易以当前价格瞬间完成,不影响后续市场价格

策略做法:

  • 每秒交易一次。
  • 当前价格与上次成功交易价格相同时,不交易。
  • 当前价格大于持仓价格时,买入1。
  • 当前价格小于持仓价格时,买入2。
  • 不进行卖出操作,

策略目标:策略的涨幅大于BTC每日涨幅,跌幅小于每日跌幅。

那么策略核心代码如下:

for (let i=1; i=myAvgPrice ){
    myTotal += curPrice;
    myBuyTimes += 1;
  }
  else {
    myTotal += curPrice*2;
    myBuyTimes += 2;
  }
  myAvgPrice = myTotal/myBuyTimes;
}

模拟数据下收益情况

generateSimulateData(1000,86400,200,5);构造365次数据,最终的平均涨跌幅如下:
originAvg,模拟数据的一天平均涨跌幅。
myAvg,使用本策略后一天的平均收益率。

originalSituation:-17.50%, mySituation:56.31%
originalSituation:42.40%, mySituation:-13.41%
originalSituation:4.60%, mySituation:-14.07%
originalSituation:-64.30%, mySituation:88.32%
originalSituation:-3.20%, mySituation:11.48%
originalSituation:-0.40%, mySituation:-2.58%
originalSituation:11.30%, mySituation:-10.25%
originalSituation:56.80%, mySituation:-23.02%
originalSituation:-52.50%, mySituation:31.71%
originalSituation:-37.50%, mySituation:50.15%
originalSituation:26.20%, mySituation:-26.08%
originalSituation:-55.50%, mySituation:143.93%
originalSituation:56.70%, mySituation:-26.36%
....
originAvg:6.55% , myAvg:9.33%

从上述的数据来看,很明显,这个策略并没有达到我们要涨多跌少的目标。
因此,需要对策略做相应优化,那么...
下文再见!

代码

function generateSimulateData(base,num,lowest,maxDelta){
    let ret = [base];
    let price = base;
    let deltas = [];
    let total = base;
    let min = base;
    let max = base
    for(let i=1; i0.5?1:-1;
        let delta = Math.floor(Math.random()*maxDelta)*sign;
        price += delta;
        if( price <= lowest){
            price = lowest;
        }
        deltas.push(delta);
        ret.push(price);

        if( price > max){
            max = price;
        }
        if( price < min){
            min = price;
        }

        total += price;
    }
    let open = base;
    let close = ret[num-1];
    let avg = total/num;
    let situation = (close/open-1)*100;
    //console.log(`open=${open}, close=${close}, avg=${avg}, max=${max}, min=${min} situation=${situation.toFixed(2)}%`);
    return {s:situation.toFixed(2),prices:ret};
}

function myStrategy_1(simulatePrices){
    let myTotal = simulatePrices[0];
    let myLastPrice = simulatePrices[0];
    let myAvgPrice = myTotal;
    let myBuyTimes = 1;

    for (let i=1; i=myAvgPrice ){
            myTotal += curPrice;
            myBuyTimes += 1;
        }
        //
        else {
            myTotal += curPrice*2;
            myBuyTimes += 2;
        }

        
        myAvgPrice = myTotal/myBuyTimes;
    }
    // console.log(`myCount = ${myBuyTimes}, myTotal = ${myTotal}, myAvgPrice = ${myAvgPrice}`);

    let s = (simulatePrices[simulatePrices.length-1]/myAvgPrice-1)*100
    //console.log(`myCount = ${myBuyTimes}, myTotal = ${myTotal}, myAvgPrice = ${myAvgPrice}, situation = ${s.toFixed(2)}%`);
    return s.toFixed(2);
}

function main(){
    let originTotal = 0;
    let myTotal = 0;
    for( let i=0; i<365; ++i){
        let simulateData = generateSimulateData(1000,86400,200,5);
        let simulatePrices = simulateData["prices"];
        let originalSituation = Number(simulateData["s"]);
        let mySituation = Number(myStrategy_1(simulatePrices));
        console.log(`originalSituation:${originalSituation.toFixed(2)}%, mySituation:${mySituation.toFixed(2)}%`);
        originTotal += originalSituation;
        myTotal += mySituation;
    }
    originTotal /= 365;
    myTotal /= 365;
    console.log(`originAvg:${originTotal.toFixed(2)}% , myAvg:${myTotal.toFixed(2)}%`);
}
main();

你可能感兴趣的:(网格变种策略(一))