ビットコインの裁定取引の自動化を考える

[Ateam Hikkoshi Samurai Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hikkoshi)　22日目です。
本日は[エイチームコネクト](http://connect.a-tm.co.jp/)のキンキンに冷えたビールと焼鳥が好物の中途2年目、なんちゃってwebエンジニアの@mori_moriが担当します。

#はじめに
最近、ビットコインをはじめ、仮想通貨の盛り上がりがすごいですね。
自分は今年の始めにビットコインに手を付けてから9月のビットコイン暴落に巻き込まれ、仮想通貨相場を引退するはめに・・・
暴落後はいつの間にか1BTC=100万円を超え、気がついたら1BTC=200万円を超えていました。

チッキショー！！もっと上手いことやっていれば引退せずにビットコインでワイは**億り人**(いわゆる億万長者)になって人生逆転してたかもしれないんやーー！！

#今更ながら仮想通貨相場引退の原因分析

取引中の自分はこうだった

・利益が出たらもっと利益が欲しい！と欲張る 
→ 気がついたら価格が下がって利益がゼロ

・損失が出たら損切りをせずに「その内戻るだろ・・・」と我慢する
→ 気がついたら損失拡大

分析するまでもなかった。
**下手・・・圧倒的下手っ・・・！！**

#下手なら自動化してしまえっ・・・！！
っというわけでコジツケ感バリバリですが、自分が下手に取引するから損失が出るわけで、取引を自動化してしまえば儲かるんじゃね？
という安易な発想から、比較的**儲けのフロー**が単純でシステム化しやすそうな**裁定取引**なら簡単に自動化できるかもっという事でやってみる。

#裁定取引（アービトラージ）とは？
ビットコインは取引所によって価格が異なります。（詳しくはググってね）
なので、ビットコインが安い取引所で買い、高い取引所で売れば差額が利益になるよね！っていう取引方法です。

例えば、

|        |    買値    |    売値    |
|-----------------|:------------------:|:------------------:|
| A取引所             |              19万4,000円 |        19万5,000円        |
| B取引所           |            20万2,500円 |       20万3,000円       |
| C取引所             |              21万5,000円 |        21万8,000円        |


A取引所でビットコインを19万5,000円で買い、
C取引所の口座にビットコインを送金をして21万5,000円で売れば差額の2万円が利益になります。 
これが裁定取引です。

裁定取引はアービトラージとも呼ばれています。

#取引所の選定
まずは取引所を選定
今回は有名所でAPIも分かりやすい

 - [coincheck](https://coincheck.com/ja/)
 - [bitFlyer](https://bitflyer.jp/)

この2取引所で形だけでも作ってみることに

#前提＆設計
####前提
1. 引退済みなので作り込みはしません（笑）
2. 引退済みなのでテストはしません（笑）
3. 今回はビットコインの価格がcoincheckが安く、bitFlyerが高いという想定で作ってみる

####設計
1. 各取引所の買値・売値を取得
2. 取引所の「売値」を比較して安い取引所に買いを入れる
3. 安い取引所 → 高い取引所に送金
4. 売り

#板情報を取得して価格を比較
それぞれAPIを叩いて、板情報の買いと売りの最新1件を取得して売値を比較

```php:bord.php
$ch = curl_init();
// coincheckの板情報を取得
$coinCheckUrl = 'https://coincheck.com/api/order_books';
curl_setopt($ch, CURLOPT_URL, $coinCheckUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$coinCheckRes =  curl_exec($ch);
$coinCheck = json_decode($coinCheckRes);
// 売値
$coinCheckBid = $coinCheck->bids[0][0];

// bitFlyerの板情報を取得
$bitFlyerUrl = 'https://api.bitflyer.jp/v1/getboard';
curl_setopt($ch, CURLOPT_URL, $bitFlyerUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$bitFlyerRes =  curl_exec($ch);
$bitFlyer = json_decode($bitFlyerRes);
// 売値
$bitFlyerBid = $bitFlyer->bids[0]->price;

// 売値を比較
if ($coinCheckBid > $bitFlyerBid) {
// bitFlyerに買いの処理を入れる（引退済みなのでここから先は作らない笑）
} else {
// coincheckに買いの処理を入れる（引退済みなのでここから先は作らない笑）
}

```

#安い取引所(coincheck想定)に買い注文

**※ここから先の処理は認証が必要なので準備しておいてね！**
####認証について
coincheckは[こちら](https://coincheck.com/ja/documents/exchange/api#auth)
bitFlyerは[こちら](https://lightning.bitflyer.jp/docs?lang=ja&_ga=2.231361375.15298044.1513667477-591930870.1510109317#%E8%AA%8D%E8%A8%BC)

安い取引所(coincheck想定)で買い注文を出す（[こちら](https://coincheck.com/ja/documents/exchange/api#order)を参考）
■ API
https://coincheck.com/api/exchange/orders

■ 1万円分を成行注文で買うクエリ
pair：btc_jpy
order_type：market_buy
market_buy_amount：10000

#送金処理
まずは先程、成行で買ったビットコインの量を取得する
■ API
https://coincheck.com/api/exchange/orders/transactions

上記APIからtransactions->sideがbuyのデータ最新1件を取得する。
取得したデータからfunds->btcを取得する。

次に、成行で買ったビットコインを高い取引所(bitFlyer想定)の自分の口座に送金する（[こちら](https://coincheck.com/ja/documents/exchange/api#account-sendmoney)を参考）

■ API
https://coincheck.com/api/send_money

■ 送金用クエリ
取得したfunds->btcをamountに設定してAPIを叩いて送金！
address：XXXXXXXXXXXXXXXXXXX（bitFlyerの自分の口座のアドレス）
amount：funds->btc

#高い取引所(bitFlyer想定)に売り注文
まずは受け取ったビットコインを確認（[こちら](https://lightning.bitflyer.jp/docs?lang=ja&_ga=2.231361375.15298044.1513667477-591930870.1510109317#%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E9%A0%90%E5%85%A5%E5%B1%A5%E6%AD%B4)を参考）
statusがCOMPLETEDのamountを取得

次に受け取ったビットコインを売りに出す（[こちら](https://lightning.bitflyer.jp/docs?lang=ja&_ga=2.231361375.15298044.1513667477-591930870.1510109317#%E6%96%B0%E8%A6%8F%E6%B3%A8%E6%96%87%E3%82%92%E5%87%BA%E3%81%99)を参考）
■ API
https://api.bitflyer.jp/v1/me/sendchildorder

■ 成行売り注文クエリ
product_code：BTC_JPY
child_order_type：MARKET
side：SELL
size：amount

これで理論上は無事に自動売買が出来るはず！！
何もしなくても儲けてくれるんや！（引退済みなのでやらないけど・・・）

#懸念事項
- ビットコインを買うために各取引所にお金を入れておく必要がある
- 送金受取までにラグがある（買いと売りは別々でシステムを動かさないといけないかも）
- 送金中にビットコインの価格が暴落しちゃうかも！
- etc....

暴落はどうしようもないですが、他の懸念点は作り込めば解消されると思う。

今回はざっくり買いと売りを作りましたが、実際に運用しようとするなら買いの検知や送金の受取検知など色々とチェックが必要になってくると思います。

#投資は自己責任で
この記事を参考にして何かあっても我々は一切の責任を負いません！！！
ただ、利益が出た場合はキンキンに冷えたビールをおごってください\:kissing_closed_eyes:

#最後に
[Ateam Hikkoshi Samurai Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hikkoshi) 22日目いかがでしたでしょうか。
明日は[エイチーム引越し侍](http://hikkoshi.a-tm.co.jp/)のデザイナー、@nezurikaさんがAdobe PhoneGapに関する記事を書いてくれます。
お楽しみに。

# 追伸
エイチームグループでは、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=moriqiita_bitcoin)