仮想通貨botの月次報告用データの作成方法紹介
こんにちは。バジル(@kkngo_crypto)です。
今回は、自分の月次報告の方法について紹介したいと思います。
簡単に言うと、
定期的に各取引所APIやブロックチェーンから取引履歴を取得し、データレイアウトをそろえてスプレッドシートにPOST(ローカルDBにも保存)
スプレッドシート上でグラフ表示や分析を実施
というものです。
グラフ表示については、GrafanaやKibanaなどのデータ可視化のツールを使うのも方法の一つですが、bot本体以外に運用するものを増やしたくないのでやめました。本業でKibana+Elasticsearch+Fluentd環境の運用経験はあるので最低限のナレッジはありますが、個人開発でここまでの環境は要らないかなという印象もあります。
とはいえ都度ローカルのmetaplotでのグラフ表示だと味気ないし、いちいちソースを書くのも面倒です。
といったところで、スプレッドシートという落としどころにたどり着きました。高頻度botなどで取引件数が多くなる場合はスプレッドシートに取引データを載せると重くなってしまうかもしれませんが、私の場合は多くても月10000件程度なので現状は特に問題は発生していません。
以下に具体的な手順を紹介します!
a) 取引履歴の取得
下記のようなツールを作成しています
各取引所のAPIで取引一覧データを取得する
基本は ccxt の fetch_my_trades メソッドや fetch_order メソッドで取得
取引所毎の違いについて、ある程度はccxtが吸収してくれているが、取引所によってページネーションの方法や件数が違ったり、デフォルトで部分約定が取れなかったりなど細かい差異は無数にあるので、APIリファレンスを見ながら対応する
うまくいかないときはAPIリファレンスを見て適切な取引所APIを直接呼ぶ
dYdXは、Python用dYdXクライアントの get_fills メソッドで取得
オンチェーンのトランザクションを取得する
損益を総平均法で計算する
古いトレード・トランザクションから順にポジションと損益を計算していく
※取引所によってはトレードごとの損益がAPIで綺麗に取得できないことがあるため、一律自分で計算するようにしています
円換算で月次報告するために、取引ごとのドル損益にドル円レートをかけて簡易的に円の損益も保持しておく(確定申告に使えるような方法ではないが、twitterやnoteへの月次報告用の概算値として)
出来上がった取引データをスプレッドシートにPOSTする(下記参照)
b) スプレッドシートにPOST
function doPost(e) {
params = JSON.parse(e.postData.getDataAsString())
var exchange = params["exchange"];
var data = params["data"];
var ss = SpreadsheetApp.openById("xxxxxxxxxx");
// シートの値をクリア
var sheet = ss.getSheetByName(exchange);
sheet.clearContents();
// 書き込み
var colCount = data[0].length;
var rowCount = data.length;
sheet.getRange(1,1,rowCount,colCount).setValues(data);
}
こんな感じのAppsScriptをウェブアプリとしてデプロイしています。取引データがJSON形式でPOSTされると取引所ごとのシートに展開されるようになっています。
認証については、ウェブアプリは全体公開にしてPOSTデータに適当に決めたパスワードを含める形にしています(上記コードからは削っています)。
AppsScriptをウェブアプリとしてデプロイする具体的な手順は「スプレッドシート post」とかで検索するといろいろヒットするので気になる方はご確認下さい!
c) グラフ表示や分析
取引データがスプレッドシートに書き込まれたので、あとはそのシートを参照してグラフやピボットテーブルなどを作成するだけです。
シート構成は下記のようになっています。
取引履歴シート(取引所A)※取引データが展開されるシート
日次損益シート(取引所A)
取引履歴シート(取引所B)※取引データが展開されるシート
日次損益シート(取引所B)
取引履歴シート(オンチェーン)※取引データが展開されるシート
日次損益シート(オンチェーン)
……
月次報告シート
各シートの内容を見ていきましょう。
取引履歴シート(取引所ごと)
JSONでPOSTされた取引データが反映されるシートです。これと言って説明することはないです。
日次損益シート(取引所ごと)
取引履歴シート(取引所ごと)を日単位で集計して、日次の損益、日次のペアごとのピボットテーブルや積み上げグラフを表示してるシートです。
取引履歴シート(取引所ごと)が更新されると勝手に再計算されます。
月次報告シート
月次報告に使っているダッシュボード的なシートです。日次損益シート(取引所ごと)のデータを集約してグラフ表示しています。
日々の確認
「a) 取引履歴の取得」のツールを実行すると数分でスプレッドシートへの反映まで完了するので、損益を確認したいな~と思ったらツールを実行しています。
あとは必要に応じて、シート上でデータを集計したりフィルタリングしたり計算したりしています。その場の思い付きでブラウザ上で分析できるのもスプレッドシート管理のいいところです!
月次報告のすすめ
去年の春ごろ、bot活動が行き詰まってきていたので気分転換にSNSの発信もしていこうかと思い、その一環で月次報告を始めました。クリプト系のアカウントと言えば月次報告は外せないでしょというくらいの気持ちでした。
人の月次報告を読んでいるときに思っていたのが、証拠金や収益率を公開している人が全然いないので、収益の金額だけじゃどのくらい強いのかわからないということでした。
どうせなら自分が納得できる月次報告をしたいなと思い、今のような収益+証拠金+収益率+グラフの報告にたどり着きました。
そんな月次報告ですが、しばらく続けていると良い効果があって、
具体的な金額を毎月報告してると気が引き締まる
もっとつよつよの報告をできるようになりたい。認められたい。
毎月負けている報告をするなんてみじめすぎて絶対イヤだ。。。
がんばるぞ~~~~!🔥🔥🔥
とbotで勝つモチベーションにつながっています。
一昨年はだらだら負け続けて200万円くらい負けていたのですが、お金だけの損失であれば、生活に影響さえ出なければ許せてしまいます。高い買い物をしたとかギャンブルでスッたとかと一緒で、お金が無くなること自体は半分趣味だからと納得できてしまいます。向上心無し。
でも、月次報告をしていると人の目があるのでお金だけの問題じゃなくなります。心の問題です。
やったことがある方はわかると思うのですが、マイナスの報告をすると結構みじめな気持ちになるんですよね。このままではお金より先に心が退場してしまう!と尻を叩かれる思いになります。
そんなわけで、月次報告をはじめとしたSNSの発信が、自分がbotをがんばるモチベーションにもつながっています。おかげさまで最近は徐々に勝てるようにもなってきています。多少なりとも人に楽しんでもらえて、自分のモチベーションにもなるなら、SNSの発信はし得だな~と思います。
では、今回はこんなところです!
twitterやnoteを読んでくれている対戦相手のみなさん、これからも引き続きよろしくお願い致します🙇♀️
この記事が気に入ったらサポートをしてみませんか?