LoginSignup
16
26

More than 5 years have passed since last update.

bitFlyer Lightning API を使ってAIトレードをやりたい! 【環境構築編】

Posted at

前書きの前書き

AIトレードは実際の金銭を扱います。
知識のない人はやらないようにしましょう。
知識のあるひとも自己責任でやりましょう。

これらの記事は、AIトレードの基盤を作ることを目標としていて、稼ぐことは目標としていません。
どちらかと言うとデータマイニングです。
稼げれば何よりですが、もう一度。

自己責任でやってください

前書き

ずーっとDeepLearningを使ってAIトレードやりたいなぁやりたいなぁって思っていました。
メタトレーダーだとWindowsだし、口座開設とかめんどくさいし、いろいろあってなかなか着手できていませんでした。

そんな中、さくっと使えそうなAPIが公開されているじゃありませんか!
ということで、色々学んだことを活かしつつやっていきたいと思います。

開発環境

PC

  • 機種名 : MacBook Pro
  • OS : Yosemite 10.11.5
  • プロセッサ名 : Intel Core i5 2.6 GHz
  • メモリ : 16 GB
  • グラフィック : Intel Iris 1536MB

言語/ライブラリ

  • Node.js 8.9.0
    • request
    • crypto
  • Python 3系(未定)
    • Tensor Flow
    • Chainer どっちか使う予定

DB(未定:学習用データ等を入れる予定)

  • postgresql
  • mysql

全体の流れ

  1. Node.jsを使ってREST APIでのやり取りができる環境を作る
  2. 取得したデータをDBに登録する
  3. 登録したデータをPython側で取得し学習させる

本編の流れ

  1. Node.js 環境構築
  2. APIキーを発行する
  3. サンプルを動かす
  4. サンプルを改良する

本題

とりあえず、やることやっていきます。

Node.js 環境構築

次のサイトを参考に環境構築を進めていきます。

いまアツいJavaScript!ゼロから始めるNode.js入門〜5分で環境構築編〜
https://liginc.co.jp/web/programming/node-js/85318

いきなりガン無視 HomebrewでNode.jsインストール

Nvmをインストール!

Node Version Managerをインストールします。
Node.jsのバージョンとかパッケージ管理するためのツールかな?
指定したバージョンのNode.jsを動かすことができるみたい。

brew install nvm
nvm ls-remote
nvm install 8.9.0
node -v
nvm alias default v8.9.0

nvmの設定フォルダの作成

nvmの設定を入れておくフォルダを作成します。

mkdir ~/.nvm

コンソール起動時の設定

コンソール起動時に設定を読み込むように設定しましょう。
.bash_profileに下記4行を記載しておきます。

if [[ -s ~/.nvm/nvm.sh ]];
  then source ~/.nvm/nvm.sh
fi
export NODE_PATH=/usr/local/lib/node_modules

APIキーを発行する

bitFlyerのアカウントを作る

iOSアプリからちゃちゃっとアカウントを作ります。
アカウント作って入金したり、もろもろは自己責任でお願いしますね?

二段階認証の設定を行う

Google AuthenicatorでQRコード読み込んだら使えるようになるのでそれを使って下さい。

APIキーの発行

今回はあくまでデータの取得を目標としています。
なので、取得系にチェックを入れて、「GET」と名前をつけました。
注文を入れたり、入金送金に関するチェックはよく考えて、実績ができてからやりましょう。

スクリーンショット 2017-11-07 22.01.27.png

APIキーの確認

  • API Key
  • API Secret

上記2つのキーが発行されます。
2つとも使いますので、公開せず大切に取っておきましょう。

サンプルを動かす

下記はbitFlyerのサンプルです。

example.js
// Node.js のサンプル
var request = require('request');
var crypto = require('crypto');

var key = '{{ YOUR API KEY }}';
var secret = '{{ YOUR API SECRET }}';

var timestamp = Date.now().toString();
var method = 'POST';
var path = '/v1/me/sendchildorder';
var body = JSON.stringify({
    product_code: 'BTC_JPY',
    child_order_type: 'LIMIT',
    side: 'BUY',
    price: 30000,
    size: 0.1
});

var text = timestamp + method + path + body;
var sign = crypto.createHmac('sha256', secret).update(text).digest('hex');

var options = {
    url: 'https://api.bitflyer.jp' + path,
    method: method,
    body: body,
    headers: {
        'ACCESS-KEY': key,
        'ACCESS-TIMESTAMP': timestamp,
        'ACCESS-SIGN': sign,
        'Content-Type': 'application/json'
    }
};
request(options, function (err, response, payload) {
    console.log(payload);
});

これをそのまま使うと「新規注文を出す」となってしまうので、すこし改造します。
methodを「GET」に。
pathを「板情報取得」に。
bodyを「空」に。

example.js
// Node.js のサンプル
var request = require('request');
var crypto = require('crypto');

var key = '{{ YOUR API KEY }}';
var secret = '{{ YOUR API SECRET }}';

var timestamp = Date.now().toString();
var method = 'GET'; // ここ
var path = '/v1/getboard'; // ここ
var body = ''; // ここ

var text = timestamp + method + path + body;
var sign = crypto.createHmac('sha256', secret).update(text).digest('hex');

var options = {
    url: 'https://api.bitflyer.jp' + path,
    method: method,
    body: body,
    headers: {
        'ACCESS-KEY': key,
        'ACCESS-TIMESTAMP': timestamp,
        'ACCESS-SIGN': sign,
        'Content-Type': 'application/json'
    }
};
request(options, function (err, response, payload) {
    console.log(payload);
});

とりあえず動かしてみましょう。

node example.js > getboard.json
getboard.json
{
  "mid_price": 33320,
  "bids": [
    {
      "price": 30000,
      "size": 0.1
    },
    {
      "price": 25570,
      "size": 3
    }
  ],
  "asks": [
    {
      "price": 36640,
      "size": 5
    },
    {
      "price": 36700,
      "size": 1.2
    }
  ]
}

サンプルを改良する

とりあえず、定数は定数らしく、変数は変数らしくしておきましょう。

example.js
// Node.js のサンプル
const request = require('request');
const crypto = require('crypto');

const KEY = '{{ YOUR API KEY }}';
const SECRET = '{{ YOUR API SECRET }}';

let timestamp = Date.now().toString();
const METHOD = 'GET';
const PATH = '/v1/getboard';
const BODY = '';

let text = timestamp + METHOD + PATH + BODY;
let sign = crypto.createHmac('sha256', SECRET).update(text).digest('hex');

let options = {
    url: 'https://api.bitflyer.jp' + PATH,
    method: METHOD,
    body: BODY,
    headers: {
        'ACCESS-KEY': KEY,
        'ACCESS-TIMESTAMP': timestamp,
        'ACCESS-SIGN': sign,
        'Content-Type': 'application/json'
    }
};

request(options, function (err, response, payload) {
    console.log(payload);
});

定数と変数

javascriptには大きく分けて3つの型がある。

  1. var
  2. const
  3. let

これらの使い分けを簡単に。

var

古いブラウザでも使える型らしい。
他の2つの型は比較的新しくできた型。

ただ、よっぽど古い環境じゃなければ普通は使わない。
よって今回の実装では使わない。

const

定数ですね。
もちろん定数としても使うし、不変オブジェクトを入れたりする。
例えばこんなのとか。

node.js
const request = require('request');
const crypto = require('crypto');

const KEY = '{{ YOUR API KEY }}';
const SECRET = '{{ YOUR API SECRET }}';

下の、KEY,SECRETとかは定数文字列なんで説明するほどでもないでしょう。

requireについて

簡単に言うと、htmlファイルにjsのライブラリをわざわざ書いて使うのがめんどくさいので、jsに直接書き込めるようにしちゃおうって言うおまじないです。

  • node.jsのrequire
  • Cの#include
  • javaのimport

とりあえずはこんな認識で合ってると思う。
commonJSの機能?ライブラリ?らしい。

requireで読み込んだライブラリは、わざわざ再代入とかしないので、constでオブジェクトを作ります。

letについて

簡単に言うと変数。

再代入が必要な場合letを使う。
処理の中で値が変わるものはletを使いましょう。

3種類についてまとめ

  1. 基本的にはconst
  2. 値が変わるものはlet
  3. 何か理由がある場合var

感想

全体として

やっぱり目的がないと何も始められないので、明確な目的ができてよかった。
構想は頭のなかにあったので、暇を見つけてアウトプットしていければと思っています。
とりあえずは環境構築までやって板情報の取得はできたので、今度は、取得したデータをDBに登録していきます。

Node.jsについて

とりあえず触った感想として、ただのjavascriptじゃねーかと。
前にPepperタブレットを作成する際にjsを触ってたんでそんなに触るのに手こずらなかった。

bitFlyer Lightning APIについて

こちらはまだ触りながら色々調べていこうかなと言ったところです。

関連URL

bitFlyer
https://lightning.bitflyer.jp/

いまアツいJavaScript!ゼロから始めるNode.js入門〜5分で環境構築編〜
https://liginc.co.jp/web/programming/node-js/85318

16
26
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
26