電電高専生日記

高専生活・電子工作・プログラミングの活動記録。とっくに高専生ではない
2019-10-22 (Tue)

Node.jsでBitcoin取引価格のデータロガーを作成

久々の投稿です。
仕事も少しずつ忙しくなってきていますが、趣味プログラミングも続けています。

最近新たに考え始めているのが、Bitcoinの自動取引botの製作です。
データ処理や機械学習に関して全く知識が無いので、かなり初歩的なところから実践になると思いますが。
まず、Bitcoinの価格変動の特性を知るため、取引価格のデータロガーを作ってみました。

開発環境

言語はNode.jsです。
いつか多人数接続型ゲームを作りたいので、その勉強がてらということで採用。

Node.jsサーバーとしては、お古のスマホを使いました。普段使うPCをずっとつけっぱなしにするのは嫌なので、Servers Ultimate Proというアプリを使い、スマホ上にNode.jsサーバーを立ち上げました。

取引所はbitFlyerのBTC/JPYです。bitfFlyer Lightning APIを用いて価格取得を行います。

要件

  • 5秒ごとにリクエストを送り、データを取得・記録する
  • 対象データは最終取引価格とする
  • 記録はcsv形式として、単一のファイルに追記していく

ソース

'use strict';

/* Require */
var request = require("request");
var crypto = require("crypto");
var cron = require("node-cron");
var fs = require("fs");

/* constant for API */
const key = "秘密";
const secret = "秘密";
const apiUrl = "https://api.bitflyer.com/v1/getticker";

/* constant for Logging */
var pathPrefix = "/storage/emulated/0/__ultimate_server/__logFile/";
var logFilePath = pathPrefix + "log.csv";

/* parameters for API-getTicker */
var options = {
    url: apiUrl,
    method: "GET",
    form: {"product_code": "BTC_JPY"},
    json: true,
}

/* cron working every 5sec */
cron.schedule("*/5 * * * * *", () => {
    /* GET Req to API-getTicker */
    request(options, (err, res, body) => {
        if (err){
            console.log("Error: " + err.message);
            return;
        }
        /* creating output line */
        var outputLine = [
            body.timestamp,
            body.best_bid,
            body.best_ask,
            body.total_bid_depth,
            body.total_ask_depth,
            body.ltp, //Last Trade Price
            body.volume
        ].join(",");
        console.log(outputLine);
        /* write the output to local */
        fs.appendFile(logFilePath, outputLine+"\n", (err) => {
            if(err) {
                console.log(err);
            }
        });
    });
});

最終取引価格以外にも、取れるなら取っておこう精神で、とりあえず最高買値やら最低売値やら記録してます。

結果

こんな感じにデータ取れました。
2019-10-21T17:05:40.553,887691,888158,2099.38694713,2013.00988734,888084,96415.62493796
2019-10-21T17:05:43.29,887691,888156,2099.591124,2013.36406421,888084,96415.77283595
2019-10-21T17:05:50.033,887696,888084,2098.56487012,2013.13071033,888084,96413.55523049
2019-10-21T17:05:54.733,887690,888167,2099.49258136,2012.16042158,888084,96413.79270283
2019-10-21T17:06:00.307,887690,888166,2099.60658122,2009.92589631,888084,96417.47290789
2019-10-21T17:06:05.023,887775,888166,2099.49658136,2011.09942158,888084,96418.89188389
2019-10-21T17:06:09.76,887693,888367,2099.92128043,2012.97508641,888084,96414.38448725
2019-10-21T17:06:13.603,887710,888366,2099.92128057,2011.17508655,888084,96413.73498725
2019-10-21T17:06:19.58,887716,888366,2099.93128043,2013.16508641,888084,96401.22671839
2019-10-21T17:06:25.017,887761,888442,2099.93128057,2011.17478655,888084,96395.31327489
…略

グラフにしてやるとこんな感じです。

まとめ

とりあえずデータを取るとこまでは完成です。
過去のデータが欲しくなった場合は、Bitcoincharts.comに溜め込まれているcsvを処理すればいいかなと。 (元々はここのcsvをデータ処理して終わりのつもりでしたが、半年前くらいからデータログ止まっている、ファイルサイズが膨大過ぎる、一定周期毎ではなく逐次取引毎のログである、等々の理由があって変更しました)

次は、ログを取ったデータの解析にトライしてみようと思います。おわり。

[Tag] * JavaScript
Last Modified : 2019-10-24

Comment






非公開コメント