【アービトラージ】仮想通貨5社間で価格差を計算するプログラム【PHP】
BitFlyer、BitBank、Quoine、BTCBox、CoinCheckの5社間で、
BTC/JPYの価格差を計算するプログラムをPHPで作ってみました。
ただのノリで作っただけなので、細かい事は気にしないでくださいw
なんとなくcoincheckのみ、composerからライブラリをインストールしているので、事前に、composer initした上で、composer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述し、composer installしておく必要があります。
実行結果は、下記のような感じ。
Time Differenceは、各社のAPIを読み込んで、最初から最後までかかった時間を秒単位で計算しています。
この値が高い場合はFalseとします。
(あまりにもAPI取得に時間がかかりすぎると、価格自体が信用できないため)
Benefitは、最小の購入価格と最大の売却価格の差、つまり、利益です。
利益が1000円以上の場合は、Trueとしています。
この続きのプログラムが書きたい方は、自己責任でお願いします。
BTC/JPYの価格差を計算するプログラムをPHPで作ってみました。
ただのノリで作っただけなので、細かい事は気にしないでくださいw
なんとなくcoincheckのみ、composerからライブラリをインストールしているので、事前に、composer initした上で、composer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述し、composer installしておく必要があります。
<?php
// coincheck用ライブラリのインクルード。
// あらかじめcomposer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述のうえ、
// composer installしておく。
require "vendor/autoload.php";
use Coincheck\Coincheck;
$coincheck= new Coincheck('ACCESS_KEY', 'API_SECRET');
// 変数の初期化
$min_ask = -1;
$max_bid = -1;
$ask_name = $bid_name = "";
$vars = array(
"BitFlyer" => get_bitflyer_ticker(),
"BitBank" => get_bitbank_ticker(),
"Quoine" => get_quoine_ticker(),
"BTCBox" => get_btcbox_ticker(),
"CoinCheck" => get_coincheck_ticker(),
);
$cnt = 0;
foreach($vars as $name => $data){
calc_min_max($name, $data);
if($cnt == 0){
$first_time = $data["time"];
}
echo "[{$name}] ask:{$data["ask"]} bid:{$data["bid"]} spread:{$data["spread"]} time:{$data["time"]}\n";
$cnt++;
}
$last_time = $data["time"];
$spread = $max_bid - $min_ask;
echo "Best Ask : {$min_ask}($ask_name), Best Bid : {$max_bid}($bid_name), Spread: ($spread)\n";
echo "Benefit: ".(int)$spread."\n";
echo "Time Difference: ".((int)$last_time - (int)$first_time)." Sec \n";
if($spread > 1000 && (int)$last_time - (int)$first_time <= 1){
echo "Status: True\n";
}else{
echo "Status: False\n";
}
////////////////////////
// BitFlyerのTickerを読み込む関数
////////////////////////
function get_bitflyer_ticker(){
$data = json_decode(file_get_contents("https://api.bitflyer.com/v1/getticker"));
if(!empty($data) && !empty($data->best_bid) && !empty($data->best_ask)){
$bid = $data->best_bid;
$ask = $data->best_ask;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return null;
}
}
////////////////////////
// BitBankのTickerを読み込む関数
////////////////////////
function get_bitbank_ticker(){
$data = json_decode(file_get_contents("https://public.bitbank.cc/btc_jpy/ticker"));
if(@$data->success){
$ask = $data->data->sell;
$bid = $data->data->buy;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// QuoineのTickerを読み込む関数
////////////////////////
function get_quoine_ticker(){
$data = json_decode(file_get_contents("https://api.liquid.com/products/5"));
if(!empty($data) && $data->currency_pair_code == "BTCJPY"){
$ask = $data->market_ask;
$bid = $data->market_bid;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// BTCBoxのTickerを読み込む関数
////////////////////////
function get_btcbox_ticker(){
$data = json_decode(file_get_contents("https://www.btcbox.co.jp/api/v1/ticker/"));
if(!empty($data) && !empty($data->sell) && !empty($data->buy)){
$ask = $data->sell;
$bid = $data->buy;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// CoincheckのTickerを読み込む関数
////////////////////////
function get_coincheck_ticker(){
global $coincheck;
$data = $coincheck->ticker->all();
if(!empty($data) && !empty($data["ask"]) && !empty($data["bid"])){
$data["spread"] = $data["bid"] - $data["ask"];
$data["time"] = date("Gis");
return $data;
}else{
return null;
}
}
////////////////////////
// AskとBidの最小値・最大値を算出する関数
////////////////////////
function calc_min_max($label, $data){
global $min_ask, $max_bid, $ask_name, $bid_name;
if($data){
if($min_ask == -1 || $data["ask"] < $min_ask){
$min_ask = $data["ask"];
$ask_name = $label;
}
if($max_bid == -1 || $data["bid"] > $max_bid){
$max_bid = $data["bid"];
$bid_name = $label;
}
}
}
?>
// coincheck用ライブラリのインクルード。
// あらかじめcomposer.jsonのrequire欄に"coincheck/coincheck": "1.0.0"を記述のうえ、
// composer installしておく。
require "vendor/autoload.php";
use Coincheck\Coincheck;
$coincheck= new Coincheck('ACCESS_KEY', 'API_SECRET');
// 変数の初期化
$min_ask = -1;
$max_bid = -1;
$ask_name = $bid_name = "";
$vars = array(
"BitFlyer" => get_bitflyer_ticker(),
"BitBank" => get_bitbank_ticker(),
"Quoine" => get_quoine_ticker(),
"BTCBox" => get_btcbox_ticker(),
"CoinCheck" => get_coincheck_ticker(),
);
$cnt = 0;
foreach($vars as $name => $data){
calc_min_max($name, $data);
if($cnt == 0){
$first_time = $data["time"];
}
echo "[{$name}] ask:{$data["ask"]} bid:{$data["bid"]} spread:{$data["spread"]} time:{$data["time"]}\n";
$cnt++;
}
$last_time = $data["time"];
$spread = $max_bid - $min_ask;
echo "Best Ask : {$min_ask}($ask_name), Best Bid : {$max_bid}($bid_name), Spread: ($spread)\n";
echo "Benefit: ".(int)$spread."\n";
echo "Time Difference: ".((int)$last_time - (int)$first_time)." Sec \n";
if($spread > 1000 && (int)$last_time - (int)$first_time <= 1){
echo "Status: True\n";
}else{
echo "Status: False\n";
}
////////////////////////
// BitFlyerのTickerを読み込む関数
////////////////////////
function get_bitflyer_ticker(){
$data = json_decode(file_get_contents("https://api.bitflyer.com/v1/getticker"));
if(!empty($data) && !empty($data->best_bid) && !empty($data->best_ask)){
$bid = $data->best_bid;
$ask = $data->best_ask;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return null;
}
}
////////////////////////
// BitBankのTickerを読み込む関数
////////////////////////
function get_bitbank_ticker(){
$data = json_decode(file_get_contents("https://public.bitbank.cc/btc_jpy/ticker"));
if(@$data->success){
$ask = $data->data->sell;
$bid = $data->data->buy;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// QuoineのTickerを読み込む関数
////////////////////////
function get_quoine_ticker(){
$data = json_decode(file_get_contents("https://api.liquid.com/products/5"));
if(!empty($data) && $data->currency_pair_code == "BTCJPY"){
$ask = $data->market_ask;
$bid = $data->market_bid;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// BTCBoxのTickerを読み込む関数
////////////////////////
function get_btcbox_ticker(){
$data = json_decode(file_get_contents("https://www.btcbox.co.jp/api/v1/ticker/"));
if(!empty($data) && !empty($data->sell) && !empty($data->buy)){
$ask = $data->sell;
$bid = $data->buy;
$spread = $bid - $ask;
return array("bid" => $bid, "ask" => $ask, "spread" => $spread, "time" => date("Gis"));
}else{
return false;
}
}
////////////////////////
// CoincheckのTickerを読み込む関数
////////////////////////
function get_coincheck_ticker(){
global $coincheck;
$data = $coincheck->ticker->all();
if(!empty($data) && !empty($data["ask"]) && !empty($data["bid"])){
$data["spread"] = $data["bid"] - $data["ask"];
$data["time"] = date("Gis");
return $data;
}else{
return null;
}
}
////////////////////////
// AskとBidの最小値・最大値を算出する関数
////////////////////////
function calc_min_max($label, $data){
global $min_ask, $max_bid, $ask_name, $bid_name;
if($data){
if($min_ask == -1 || $data["ask"] < $min_ask){
$min_ask = $data["ask"];
$ask_name = $label;
}
if($max_bid == -1 || $data["bid"] > $max_bid){
$max_bid = $data["bid"];
$bid_name = $label;
}
}
}
?>
実行結果は、下記のような感じ。
[BitFlyer] ask:723734 bid:723689 spread:-45 time:74004
[BitBank] ask:724401 bid:724388 spread:-13 time:74004
[Quoine] ask:723239.81 bid:722994.81 spread:-245 time:74004
[BTCBox] ask:725147 bid:725047 spread:-100 time:74005
[CoinCheck] ask:724317 bid:724251 spread:-66 time:74005
Best Ask : 723239.81(Quoine), Best Bid : 725047(BTCBox), Spread: (1807.1899999999)
Benefit: 1807
Time Difference: 1 Sec
Status: True
[BitBank] ask:724401 bid:724388 spread:-13 time:74004
[Quoine] ask:723239.81 bid:722994.81 spread:-245 time:74004
[BTCBox] ask:725147 bid:725047 spread:-100 time:74005
[CoinCheck] ask:724317 bid:724251 spread:-66 time:74005
Best Ask : 723239.81(Quoine), Best Bid : 725047(BTCBox), Spread: (1807.1899999999)
Benefit: 1807
Time Difference: 1 Sec
Status: True
Time Differenceは、各社のAPIを読み込んで、最初から最後までかかった時間を秒単位で計算しています。
この値が高い場合はFalseとします。
(あまりにもAPI取得に時間がかかりすぎると、価格自体が信用できないため)
Benefitは、最小の購入価格と最大の売却価格の差、つまり、利益です。
利益が1000円以上の場合は、Trueとしています。
この続きのプログラムが書きたい方は、自己責任でお願いします。
この記事の最終更新日:2018/10/16
最初に記事を書いた日:2018/10/16