DEVGRU

プログラミングと競馬予想について書きます

bitcoin のトレーディングボット Gekko を一瞬だけ読んでみた

ソースコードはこちら。よく名前は聞く。

github.com

Node.jsで書かれている。

肝心のアルゴリズムだが、リポジトリに入っているものは単一の指標しか見ていないので、ちょっとそのままでは使えなさそう。 RSIやMACDがしきい値以上だったら売る・買う、みたいな。

gekko/strategies at stable · askmike/gekko · GitHub

アルゴリズムは基本的にサンプル実装と見たほうがよく、実運用するのはおすすめしない。

フレームワークとして捉えると、バックテストとマーケットのアダプタがついてくるので、その部分に価値を感じる。 Zaif対応しているみたい。

アルゴリズムは書けるけど、マーケットと繋いだりバックテストしたりするのしんどい人にはオススメかもしれない。

Pythonで書きたいなあ。

世界一簡単なアルゴリズムトレードの構築方法

世界一簡単なアルゴリズムトレードの構築方法

bitcoin のシステムトレードをしている 〜2017/08/08の時点の話〜

bitcoinのシステムトレードをいろいろしているが、 エンジニアとして楽しいのはOHLC求めてテクニカル指標出して、あたりまでで、実際の売り買いとなるとそんなに結果が出なかったりするので、 またすぐに改良と称して最初の部分から作りなおしてしまっている。

ブログを書き始めた頃のものをversion6とよんでいるが、 マルチマーケット、マルチカレンシー対応、レンジバー対応したものがversion7、 Elasticsearchと機械学習を取り入れたものが現在のversion8となっている。

対応したマーケットは、bitFlyer、Zaif, coincheckだ。BITPointはこれからになる。

version8はまだ開発中で、データがある程度溜まってから 売買を行うモジュールtraderを実装することにしている。

現在、データ取得はbitFlyerがpubnubを使っていて、Node.js クライアントはまあまあ動いていくれている(Go言語のSDKはダメだった)ので、 データ取得はNode.jsを使っている。Zaif, coincheckはWebSocket で、これもNode.jsから使うのは容易である。

取得したデータは、RedisのPubSubを経由して、Goで書かれたサーバに送られる。 このサーバはRedisをSubscribeして取得した情報を1秒間バッファリングしてからElastisearchにBulk APIで送る。

以前はPostgreSQLを使っていたが、シングルクエリで複数レコードをインサートする術がGoのSQLインターフェースになかったので、 サボっていたところ、CPU使用率がえらいことになっていたのが、これで解消された。

Elasticsearchからデータを引っ張ってきて、機械学習でデータを綺麗にしてからテクニカル指標を計算し、トレンドを返してくれるサーバanalyzerはPython3で書いた。 というか、機械学習ライブラリをガッツリPythonのものを使ったのでそうせざるを得なかった。 ルーチンはJupyter Notebookを使って実装し、Bottle.py でWeb APIサーバにした。

jupyter.org

bottlepy.org

トレードについてだが、以下の書籍を忠実に実行するのが当初から目標にしている。みんな大好き(?)パンローリングだ。

ボリンジャーバンドとMACDによるデイトレード ──世界一シンプルな売買戦略 (ウィザードブックシリーズ)

ボリンジャーバンドとMACDによるデイトレード ──世界一シンプルな売買戦略 (ウィザードブックシリーズ)

この書籍はなるほどうまく行きそうなアルゴリズムがズバリ書いてあり、めんどくさいトレードの勉強なしにいきなりシステムトレードができる。

が、大きな落とし穴があり、この書籍で使用しているのは時間足ではなくレンジバーなので、 データ処理がだいぶ特殊なものになる。具体的にはOHLCの求め方だ。

レンジバーについてはいつか書く。

とにかく、この書籍の手法は基本的にレンジバーが必要で、レンジバーが作れないならこの書籍の内容は全く活きない。

トレードに必要なのは最新のテクニカル指標と、マーケットの現在の売値、買値などだが、 ときに過去数時間〜数日間の値動きが見たくなる。

そういう時には、Google Charts が使える。

Candlestick Charts  |  Charts  |  Google Developers

非常に綺麗にローソクが書け、さらに線グラフでボリンジャーバンドやSMAなどをオーバーラップできる。 マウスオーバーで値も見られる。

このような感じで、システムトレードの環境を作っている。

今後の課題はまだまだある。

  • フォワードテストによるアルゴリズム・パラメータの検証
  • スコアの記録

まだ俺達のシステムトレードは始まったばかりだ。

システムトレード 基本と原則 (ウィザードブックシリーズ)

システムトレード 基本と原則 (ウィザードブックシリーズ)

  • 作者: ブレント・ペンフォールド,長尾慎太郎,山口雅裕
  • 出版社/メーカー: パンローリング
  • 発売日: 2011/07/15
  • メディア: 単行本
  • 購入: 3人 クリック: 14回
  • この商品を含むブログ (2件) を見る

Python3ではじめるシステムトレード ──環境構築と売買戦略 (Modern alchemists series)

Python3ではじめるシステムトレード ──環境構築と売買戦略 (Modern alchemists series)

システムトレード 検証と実践 ──自動売買の再現性と許容リスク

システムトレード 検証と実践 ──自動売買の再現性と許容リスク

coincheck の WebSocket API をNode.jsから使う。

一瞬落ちていたcoincheck の WebSocket API だが、 REST APIと違ってポーリングの必要がなく、システムトレードを行うためのデータ収集には欠かせない。

結構簡単なので、以下にメモがてらコードを記載する。

Node.js v7.3.0 で、npm -i ws している。

const WebSocket = require('ws');

function subscribe(channel, callback) {
  const ws = new WebSocket('wss://ws-api.coincheck.com/');

  ws.on('open', () => {
    ws.send(JSON.stringify({ type: 'subscribe', channel }));
  });

  ws.on('message', (data) => {
    callback(JSON.parse(data));
  });

  ws.on('close', () => {
    console.error(`coincheck ${channel} is disconnected`);
    process.exit(-1);
  });

  ws.on('error', () => {
    console.error(`coincheck ${channel} error`);
    process.exit(-1);
  });
}

上記関数は以下のように呼び出す。

subscribe('btc_jpy-trades', (d) => {
  /*
  d = [
    "ID",
    "取引ペア",
    "注文のレート",
    "注文での量",
    "注文方法"
  ]
  */
});

coincheck.com

(落ちていなければ)、上記のコードで売買履歴が取れるはず。

しかし、日付が入っていないのでいまいち使えないし、配列なのでフィールドが増やせない。 どうしてここのAPIはこんなに使いづらいのか。

(了)

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

HTML5 Web標準API バイブル

HTML5 Web標準API バイブル

Node.js超入門

Node.js超入門