仮想通貨の自動売買システム作ったら、満足した話

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

「安く買って高く売る」だけならシステム化したら億万長者！
そう、私はこのシステムで投資金を***20％減らしました***。
（主に減った原因はシステムが原因ではなく、投資判断のミスになります）

**本投稿ではソースコードの開示は行いません。
仮想通貨の売買方法やシステム化時の勘所を記載いたします。
また、収支などの詳細はダミーデータでの記載となります。**

# 時系列

| 日付 | 概要 | 心理状況 |
|:---:|:-----|:--------|
| 2017/10 | 仮想通貨取引 | 楽しい |
| 2018/1 | システム化しよう！ | 楽しい |
| 2018/1 | システム稼働開始 | 楽しい |
| 2018/4 | 取引所のAPIがクソ → システム停止 | イライラ |
| 2018/7 | 損してもいっか → システム再開 | 冷静（データ取ろう） |
| ～ 現在 |  |  |

# 取引手法

- 裁定取引

> 裁定取引（アービトラージ）とは、同一の価値を持つ商品の一時的な価格差（歪み）が生じた際に、割高なほうを売り、割安なほうを買い、その後、両者の価格差が縮小した時点でそれぞれの反対売買を行うことで利益を獲得しようとする取引のこと。 
> 出典：https://www.smbcnikko.co.jp/terms/japan/sa/J0288.html

マニュアルで取引している時から取引所間での価格差が激しいなと感じており、これをシステム化すればよい結果が残せるのではないかと考えてこの手法を選択しました。テクニカルな手法による売買については時系列データが必要だったり状態管理が面倒だったこともあります。

## 取引手法の例

裁定取引（アービトラージ）だと以下のような事をプログラム的に瞬間的に実行します。
人間が介在できる時間はほぼ無く取引所での価格差の利益はほぼプログラムが得ていると考えられます。

### 片道（資金の移動を手動）

1. 取引所Ａで、70万円 で 1 btc 売れる
2. 取引所Ｂで、69万円 で 1 btc 買える
3. 取引所Ａ、取引所Ｂで同時に 1 btc を取引する
4. btc と 円 の資金を元の取引所に出金・送金する
5. 実質 1万円 儲かった
6. 「1」に戻る

メリット：わかりやすい
デメリット：資金の移動が面倒

### 往復（全部プログラムまかせ）

1. 取引所Ａで、70万円 で 1 btc 売れる
2. 取引所Ｂで、69万円 で 1 btc 買える
3. 取引所Ａ、取引所Ｂで同時に 1 btc を取引する *※ 1万円儲かる*
4. 取引所Ａで、70万円 で 1 btc 買える
5. 取引所Ｂで、69.5万円 で 1 btc 売れる
6. 取引所Ａ、取引所Ｂで同時に 1 btc を取引する *※ 5千円損する*
7. 実質 5千円 儲かった
8. 「1」に戻る

メリット：資金の移動をしなくていい
デメリット：損する機会がある

# プログラム

## 開発環境

- Cloud9
- node.js

## 概要

- 設定ファイル
  - シミュレーションモード（売買は行わない）
  - 対象取引所の設定
  - 対象通貨の設定
  - 取引量の設定
  - 取引所＋通貨毎に閾値（損益（％））を設定
- 各取引所の保有通貨を取得
- 各取引所に対して売買を実行

（実装していない機能）

- 注文キャンセル
- 自動送金
- 自動出勤
- 通貨のバランス調整（APIが失敗してバランスが崩れる事が多い）

### 設定ファイル（例）

Json形式で設定を保存しており、概要で説明したような設定が可能となっています。
"_" のプロパティはコメントを記載しているだけでプログラム中からデータの読み込みは行いません。

```
{
    "comment" :
    {
        "_" : " ------------------------------------ ",
        "_" : " (*)はgitの自動裁定売買プログラムと互換設定 ",
        "_" : " ------------------------------------ ",
        "_" : " * demoMode               = デモモード（実際の取引を行いません） ",
        "_" : "   tradeType              = 取引手法（oneway, twoway） ",
        "_" : "                                 oneway  = 対象通貨-->ベース通貨 での裁定動作",
        "_" : "                                 twoway  = 対象通貨-->ベース通貨-->対象通貨 での裁定動作",
        "_" : " * iterationInterval      = 監視インターベル（ms） ",
        "_" : " * depositInterval        = 財布インターベル（ms） ",
        "_" : "  ",
        "_" : "   coinBrand              = 使用する通貨（_jpy, _usd, _btc）をカンマ区切りで設定できます ",
        "_" : "   coinEexclude           = 除外する通貨（btm_btc, bcd_btc）をカンマ区切りで設定できます ",
        "_" : " * minTargetProfitPercent = 値幅（％）がこれ以上の場合に表示 ",
        "-" : "                                 ※ 取引手数料が 0.2％ ある場所があるのでこれ以下にすると損する場合がある",
        "_" : " * maxSize                = 取引通貨数量（最大） ",
        "_" : " * minSize                = 取引通貨数量（最小） ",
        "_" : "  ",
        "_" : "   brokers.[xxxx].name    = 表示名 ",
        "_" : " * brokers.[xxxx].enabled = ブローカーの有効・無効 ",
        "_" : " * brokers.[xxxx].key     = ブローカー接続時のＡＰＩキー値 ",
        "_" : " * brokers.[xxxx].secret  = ブローカー接続時のＡＰＩシークレット値 ",
        "_" : "  "
    },

    "_":"アビトラ動作設定",
    "demoMode"               : false,
    "iterationInterval"      : 15000,
    "depositInterval"        : 60000,

    "_":"裁定取引の設定",
    "tradeType"              : "oneway",
    "coinBrand"              : [
                                "_jpy"
                                ],
    "coinEexclude"           : [ 
                                "btm_btc" , "Binance で上場廃止",
                                ],
    "minTargetProfitPercent" : [
                                {"coin":"btc_jpy", "from":"zaif",   "to":"quoine",  "value":0.5},
                                {"coin":"all", "from":"all", "to":"all", "value":99.9}
                              ],
    "maxSize"                : 0.2,
    "minSize"                : 0.01,
    "skipSize"               : 0.01,

    "_":"取引所の設定",
    "brokers":
    {
        "BitBank" :
        {
            "_"       : "取引手数料: 0%",
            "_"       : "入金      : 0円",
            "_"       : "出金      : 500円",
            "name"    : "bitbank  ",
            "enabled" : false,
            "key"     : "xxxxx",
            "secret"  : "xxxxx"
        },
    }
}
```

## 勘所

- 取引所API は色々あるがおすすめは ccxt
  - 公式API ： 指定の取引所のみ
  - 有志API ： 指定の取引所のみ
  - [有志API ccxt](https://github.com/ccxt/ccxt) ： 様々な取引所APIを同一のI/Fで扱える
    （存在しない取引所は同一のI/Fで自分で実装する）

- シミュレーション（売買しない）モードを作る必要がる

- 所有している通貨量を知らないと裁定取引できないので定期的に取得しておく

- 取引所APIは不安定なのが多いので失敗時のリトライを考える必要がある（**zaif さん**）

- 取引APIが失敗しても取引が正常実行されている事があるのでフォローする必要がある（**zaif さん**）

- 円と仮想通貨は、同じ通貨として考えるとシンプルになる

- 現在の保有通貨量のサマリ表示があると便利

```
[2018-03-20 00:00:19.795] +-----------+---+--------+----+-------+---+---------+---+----+----+---+---+---+
[2018-03-20 00:00:19.796] |           |bch|btc     |doge|eth    |eur|jpy      |ltc|mona|qash|sgd|usd|xem|
[2018-03-20 00:00:19.796] +-----------+---+--------+----+-------+---+---------+---+----+----+---+---+---+
[2018-03-20 00:00:19.797] | btcbox    | - | 0.5000 |  - | 0.1   |   |  100000 | - |    |    |   |   |   |
[2018-03-20 00:00:19.798] | zaif      |   | 0.2000 |    | 0.1   |   |   40000 |   |  1 |    |   |   | 1 |
[2018-03-20 00:00:19.798] +-----------+---+--------+----+-------+---+---------+---+----+----+---+---+---+
[2018-03-20 00:00:19.798] |     TOTAL | - | 0.7000 |  - | 0.2   | - |  140000 | - |  1 |  - | - | - | 1 |
[2018-03-20 00:00:19.798] +-----------+---+--------+----+-------+---+---------+---+----+----+---+---+---+
```

- 過去の資産推移があると便利（保有通貨量のサマリが一定で、円だけの増減が見えないと損益がまったくわからない）

```
+-------------------------+-----------------+---------------+-----------------+----+---+---+
|DATE                     |btc              |eth            |jpy              |mona|xem|CMT|
+-------------------------+-----------------+---------------+-----------------+----+---+---+
| 2018-03-19 03:09:56.704 | 0.7000          | 0.200         | 200013(13)      | 1  | 1 |   |
| 2018-03-19 03:21:27.141 | 0.7000          | 0.199(-0.001) | 200137(124)     | 1  | 1 |   |
| 2018-03-19 03:23:42.740 | 0.7000          | 0.199         | 200259(125)     | 1  | 1 |   |
| 2018-03-19 03:25:45.495 | 0.7000          | 0.198(-0.001) | 200382(123)     | 1  | 1 |   |
```

# まとめ
本システムについてのモチベーションのある所が資産の増加より、自動売買システムの構築だったため今は適当に運用しています。
今後誰かのためになればと思い投稿しておりますが、ソースコードの公開はするつもりはないのでご了承ください。

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*