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


# 前書きの前書き
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を動かすことができるみたい。

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

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

```bash
mkdir ~/.nvm
```

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

```.bash_profile
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](https://qiita-image-store.s3.amazonaws.com/0/35860/7799f15f-c576-83af-047a-fc45fa4cd34a.png "スクリーンショット 2017-11-07 22.01.27.png")

### APIキーの確認
* API Key
* API Secret

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

## サンプルを動かす
下記は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);
});

```

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

```bash
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
古いブラウザでも使える型らしい。
他の２つの型は比較的新しくできた型。

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

#### 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