网格变种策略(一)

一、网格策略

网格策略,总结为四个字就是:高抛低吸。
例如:首次买入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; i<num; ++i){
        var sign = Math.floor(Math.random()*10%2)>0.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<simulatePrices.length; ++i ){
  let curPrice = simulatePrices[i];
  if( myLastPrice==curPrice ){
    continue;
  }
  if( curPrice>=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; i<num; ++i){
        let sign = Math.floor(Math.random()*10%2)>0.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<simulatePrices.length; ++i ){
        let curPrice = simulatePrices[i];

        // console.log(`curPrice:${curPrice}, myCount = ${myBuyTimes}, myTotal = ${myTotal}, myAvgPrice = ${myAvgPrice}`);
        if( myLastPrice==curPrice ){
            continue;
        }

        if( curPrice>=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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259