gekko策略编写入门

相较于我国的证券市场,数字货币对于程序化交易的接受程度非常好,这可能出于两种原因:
1、交易所希望通过频繁的交易为其带来手续费收入
2、数字货币本身就是geek的产物

gekko是一个开源技术框架,可以进行基本的程序化交易。也许是由于数字货币市场中大量的用户使用程序化交易的原因,如果直接使用现成的指标作为买入、卖出依据,你会得到相当差的结果。
我使用DEMA默认指标对2017年9月-12月的EOS数据进行backtest,在市场上涨418%的同时交易却亏损42%,如下:

image
image
image

但是我们完全反向思维的将short与long对调,即short设置为大数21,long设置为小数10,确得到了盈利178%的结果。

image
image
image

这样的测试如若大家有兴趣可以自己跑,我跑了几种主流coin均出现了同样的情况。我认为这是别人的策略故意”骗炮“的结果。综上,只有自己书写的策略才能够达到实际盈利的效果。


gekko的策略库是使用js书写的,开源框架已经提供给了一些简单的策略,提供的策略放置在${gekko_PATH}/strategies文件夹中。简单介绍请参考官方文档站:

https://gekko.wizb.it/docs/strategies/creating_a_strategy.html

下面我们说一下官方文档中介绍较少的内容。

指数

在交易中存在众多指数,如MACD、CCI、RSI等,gekko开源库中提供了一些指标的实现,我们以DEMA举例。

exponential moving average (EMA)——指数平均数指标。它是一种趋向类指标,指数平均数指标是以指数式递减加权的移动平均。理解了EMA的含义后,就可以理解其用途了,简单的说,当要比较数值与均价的关系时,用MA就可以了,而要比较均价的趋势快慢时,用EMA更稳定;有时,在均价值不重要时,也用EMA来平滑和美观曲线。

EMA公式

EMA算法实现(strategies\indicators\EMA.js)如下:

var Indicator = function(weight) {
  this.input = 'price';
  this.weight = weight;
  this.result = false;
  this.age = 0;
}

Indicator.prototype.update = function(price) {
  // 第一次进入,无法计算EMA值,因为没有yesterday
  if(this.result === false)
    this.result = price;

  this.age++;
  this.calculate(price);

  return this.result;
}

//  同上方公式,
//    calculation (based on tick/day):
//  EMA = Price(t) * k + EMA(y) * (1 – k)
//  t = today, y = yesterday, N = number of days in EMA, k = 2 / (N+1)
Indicator.prototype.calculate = function(price) {
  // weight factor
  var k = 2 / (this.weight + 1);

  // yesterday
  var y = this.result;
  
  // calculation
  this.result = price * k + y * (1 - k);
}

module.exports = Indicator;

以上我们实现了EMA指标的基本运算,gekko还给出了使用GoxTradingBot思想实现的DEMA算法。该算法使用快线(short)与慢线(long)的差与两者中位数的比作为指标,当指标超过上限时触发卖出指令,当指标低于下限时触发买入指令。本文章不讨论该算法的可行性,有兴趣可移步github,或者bitcointlalk

DEMA实现(strategies\indicators\DEMA.js)如下

// 引用上面的EMA代码
var EMA = require('./EMA.js');

var Indicator = function(config) {
  this.input = 'price'  
  this.result = false;
  this.short = new EMA(config.short);
  this.long = new EMA(config.long);
}

// 分别向快线与慢线中灌入当前价格,计算当前EMA
Indicator.prototype.update = function(price) {
  this.short.update(price);
  this.long.update(price);
  this.calculateEMAdiff();
}

// 该方法来自GoxTradingBot 
// https://github.com/virtimus/GoxTradingBot/blob/85a67d27b856949cf27440ae77a56d4a83e0bfbe/background.js#L145
Indicator.prototype.calculateEMAdiff = function() {
  var shortEMA = this.short.result;
  var longEMA = this.long.result;

  this.result = 100 * (shortEMA - longEMA) / ((shortEMA + longEMA) / 2);
}

module.exports = Indicator;

最终实现DEMA算法实现(strategies\DEMA.js)如下:

// helpers
var _ = require('lodash');
var log = require('../core/log.js');

// 新模块
var method = {};

// 初始化
method.init = function() {
  // 策略名称
  this.name = 'DEMA';

  this.currentTrend;
  this.requiredHistory = this.tradingAdvisor.historySize;

  // 引用DEMA指标
  this.addIndicator('dema', 'DEMA', this.settings);
}

// 在新的蜡烛(迭代)出现时做什么?
method.update = function(candle) {
  // 啥也不做,这是模板,需要时可以加
}

// 向日志中打印每次迭代的内容
method.log = function() {
  var dema = this.indicators.dema;

  log.debug('calculated DEMA properties for candle:');
  log.debug('\t', 'long ema:', dema.long.result.toFixed(8));
  log.debug('\t', 'short ema:', dema.short.result.toFixed(8));
  log.debug('\t diff:', dema.result.toFixed(5));
  log.debug('\t DEMA age:', dema.short.age, 'candles');
}

method.check = function(candle) {
  // DEMA策略
  var dema = this.indicators.dema;
  // 当次迭代的结果,见上一个程序块中的说明。
  var diff = dema.result;
  // 这个周期的收盘价
  var price = candle.close;

  var message = '@ ' + price.toFixed(8) + ' (' + diff.toFixed(5) + ')';
  // 超过上限,触发卖出信号
  if(diff > this.settings.thresholds.up) {
    log.debug('we are currently in uptrend', message);
    // 如果触发时有仓位,则卖出
    if(this.currentTrend !== 'up') {
      this.currentTrend = 'up';
      this.advice('long');
    } else //否则啥也不做
      this.advice();
  } 
  // 低于下限,触发买入信号
  else if(diff < this.settings.thresholds.down) { 
    log.debug('we are currently in a downtrend', message);
    // 如果触发时没有仓位,则买入
    if(this.currentTrend !== 'down') {
      this.currentTrend = 'down';
      this.advice('short');
    } else //否则啥也不做
      this.advice();
  } 
  // 在上限与下限之间,啥也不做
  else {
    log.debug('we are currently not in an up or down trend', message);
    this.advice();
  }
}

module.exports = method;

附:常用的candle指标如下:

  • candle.close: the closing price of the candle
  • candle.high: the highest price of the candle
  • candle.low: the lowest price of the candle
  • candle.volume: the trading volume of that candle
  • candle.trades: number of trades in that candle

参考文献:

Gekko策略基础

Gekko官网

EMV维基百科

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

推荐阅读更多精彩内容

  • 场景:老板看中了MONO这款产品的发展前景,希望得到对应的分析论证是否可以做一款产品跟它PK,要是做的话,要做成怎...
    sanduck阅读 1,845评论 4 16
  • 在关闭朋友圈三个月后,朋友跟我抱怨,现在的朋友圈乌烟瘴气。到处是微商鸡汤和养生贴,要么就是晒娃炫富撂自拍。于是又...
    是Rourou不是肉肉阅读 648评论 0 0
  • 菜菜是不太想去参加这次的中学同学聚会的,很多人她都叫不出名字了,唯一还有联系的是当时的班花菲菲,菲菲...
    9b083c3cf91d阅读 545评论 7 2
  • 熬夜成了瘾,也习惯了没人关心。
    嫿祎阅读 305评论 0 0
  • 1 黄金赞助商 阿里云 中文:阿里云 英文:Alibaba Cloud全称:阿里云计算有限公司 域名:aliyun...
    Sting阅读 522评论 0 0