やっていくログ

にんげんをやっていきましょう

Twitter apiを使うためにDeveloper accountを申請する

2018/07からTwitter apiの使用が厳しくなり、ちょっと検索apiを叩こうにもDeveloper accountを作らなければならなくなった模様。

apiに関するツイートを検索してみると、厳格化に対する嘆きが散見される。

しかし、やりたいことがちょっと思いついてしまったので、やるしかない。

 

とりあえず申請。

"Twitter api"でサーチすると(たぶん)一番上に出てくるDeveloperページからapplyを選択し、順に次のような項目を入力。

 

・User profile

 どのアカウントと連携させるか?

・Account details

 組織or個人(非商用)の選択

・Use case details

 どのような目的でapiを利用するのか選択

 さらに300文字以上の英作文

  1.apiの使用目的

  2.コンテンツの分析の有無と分析手法

  3.自発的なツイート・リツイート・いいねの有無

  4.取得したデータを具体的に表示するか統計的に処理して表示するか

 

申請が通ったら更新する。

 

追記

1時間もしないうちに許可された わいわい!

f:id:calpeace:20181203043603j:plain

 

cryptactの未分類取引と格闘する

はじめに

cryptactは、仮想通貨取引における煩雑な税金計算をアシストしてくれる無料ツール。各取引所が提供する取引履歴をアップロードしていけば、自動で各年の収支をはじき出してくれる。

ただ、実際には未分類取引、すなわちエラーが発生する場合があり、正確に計算するためには、そうした未分類取引をなるべく解消しなければならない。

以下に、使っていて気付いた留意点を書きとめておく。新たな発見があれば時々更新したい。

 

全体として押さえておくべきこと

・時刻の情報を正確に

計算にあたって、すべてのデータを時系列に並べている。積立やチップで得たコインの取得日時をも正確に記述する必要がある。順番がずれると、コインが足りないとされて未分類取引になってしまう。

また、高頻度系botを回している場合、同じ秒に別種の約定が発生する場合がある。このとき、近くの別の約定もまとめられてしまう場合がある。順番に通貨ペアを渡り歩くような発注で、未分類取引にされてしまう場合は、1秒程度各約定時刻を離して記述しなおすとうまく通ることがある。

 

・データを分割して保管

データのデバッグにあたって、年をまたいでいるデータファイルがある場合、1年ごと、あるいは数か月単位で区切って保管しておくと、どこから未分類取引が生じたのかがわかりやすくなる。アップロードしていくときは、古いものから順に追記していくとよい。

 

Zaif

・コイン積立

2018/11/24現在、cryptactはZaifのコイン積立に対応していないので、カスタムファイルを作って補完しなければならない。カスタムファイルのフォーマットはcryptactのサポートページから手に入る。またコイン積立の履歴はZaifのユーザーページから見ることができるが、csvなどでダウンロードできるわけではないので、手でデータを採取してくるしかない。コイン積立の履歴ページから、excel等にコピペして整形するとよい。

  

・簡単売買

BitFlyerの販売所などの場合、販売所の売買履歴もcsvとして手に入る。しかし、zaifの簡単売買は、簡単売買のページに飛んでそこで履歴を手動で取得してこないといけない。取得した履歴をカスタムファイルに追記すると反映される。

 

Twitterチップ

チャットチップの送受信履歴はcsvでダウンロードできるが、Twitterチップの履歴はそうではないらしい。ソーシャル設定→プロフィールと進んで履歴を取得しないといけない。しかも最新の履歴数件しか表示されていない。Twitter受取チップ総額は表示されているので、一応総額は把握できるが、正確な受取時刻がわからない場合が出てくる。

 

・残額調整履歴

ハッキングを受けたMONAやBCHの返却が11月末ごろから始まった。場合によってはハッキング時の保有コイン数の数割を日本円で返金している模様で、その履歴は残額調整履歴のところに載っている。この分は、コインを売った形とみなして、カスタムデータに記述しておかないと未分類にされてしまう。

 

・信用売買

現物のBTCの板をそのまま利用した信用取引を行うことができる。そこでは、JPY以外にもBTCやXEMといった仮想通貨を証拠金として利用することができる。ポジションを決裁したときには証拠金として預けていた仮想通貨が返金される。もし損失が出たら、まずはJPYから充当されるが、それで足りない場合は証拠金の仮想通貨から補填する。このあたりの処理で、現物の残高がマイナスになると言われる場合がある。これは、複数のポジションを保有しているときに、エントリーの順番と決済の順番が入れ替わると発生する可能性がある。空売りを現物売りと同様に処理しているため現物が実態以上に減っていることになる。仕方がないので、カスタムファイルで、エラーが出る注文群の先頭で現物を補充し、全ポジション決済後にその現物を同値で売ったことにして対処する。

 

csvデータの更新

zaifでは毎日夜にcsvデータが更新される。更新時の1日前の取引までが記載される模様。

↑ 5日に1回くらいしか更新されてないみたい…?

1日1回更新申請が行えるので、前日までの取引は手に入れられる模様(2019/2/16 追記)

 

BitFlyer

・Lightning 取引履歴

Lightningの履歴を普通にダウンロードしてくると、最近の65535件しか記載されていない。仕方がないのでデータ取得の日付範囲を指定して取得する。高頻度系botをやっている人は特に大変だと思う。

データシートにはParent Order, Child Order, Executionsの3種記載されているが、実際に計算の際見ているのはExecutionsの模様。もしノーポジのはずなのにBTC-FXの所有枚数が0になっていない場合は、Executionsの記載の過不足を確認するとよさそう。

取引履歴(4種)を一括でダウンロードできるようになったので、上記問題は解消。

 

bitbank

・取引履歴

デフォルトの取引履歴は直近48時間分から最大500件まで取得可能。それ以前の履歴は "2日(48時間)以前のデータはこちらから検索できます" というところから同様のページに飛べるが、ここでも500件ごとにしか取得できない。API叩いても500件しか取得できない。高頻度系botをやっている人はめちゃくちゃ大変だと思う。

サポートに問い合わせてみたら、1週間くらいで送ってくれるとのことである。

→1週間後くらいに、全取引履歴csvへのリンクを送ってくれた。個別対応するほうがむこうとしてはコストがかからないんでしょうか…

2019年verの取引履歴を出力してもらうときは 30 分程度で送付してくれた。

 

Liquid

・ゼロ数量売買はSelf-matchをチェック

現物取引でゼロ数量売買の未分類エラーが出る場合がある。その場合は、データをチェックし、売買形態がSelf-matchになっている取引を見つける。Self-matchのうち、手数料が発生せず、かつJPYが絡んでいない取引の場合、エラーを返す模様。そうした取引を削除する。

 

・有効桁数の問題

Liquid は他の取引所に比べ各コインの表示桁数が多いので、端数が積もってズレが生じていそう…。

 

海外未対応取引所

・時刻のタイムゾーンに注意

デフォルトで対応している取引所であれば、タイムゾーンの処理は自動で行ってくれる。しかし、まだ対応していない取引所での取引を記録する際には、カスタムファイルを用いる必要がある。ここで、海外取引所では、UTCで時刻を表記している可能性があるので、おそらく日本標準時に合わせたほうがうまくいく。

 

カスタムファイル

・数式を利用した excel シートはたぶんアップできない

excel シートを csv に変換しましょう

 

csvexcel でいじるとエラー吐かれるもの 

 bitbank, Liquid

(excelcsv 出力のデフォルト文字コードは Shift-JIS だが、これらの取引所から出力される csv文字コードUTF-8 であるため。また、UTF-8csv 出力したとしても、最後尾の列に意図せぬ空列が入り込み、エラーが起きる場合がある。このときは VS Code をはじめとするテキストエディタで編集するとよい)

【Python】浮動小数点処理とdecimalモジュール

・はじめに

cryptocurrency bot制作でしばらく悩まされていた不具合の原因が小数計算にあることに気づき、Pythonにおける浮動小数点処理を調べる必要に迫られた。decimalモジュールを利用する際の備忘録として以下にまとめる。付け焼刃なので間違っているかも。

・とりあえず使うために

まずはインポート

from decimal import * 

Decimal()の引数に数値か文字列を与える。数値で与えるとfloatと同じ。文字列で与えると10進数同様の取り扱いができる。こうすれば四則演算は普通に行ってよい。

a=Decimal(0.1) #floatとおなじ
b=Decimal('0.1') #10進数扱い
c=0.1 #float
d=Decimal(str(c)) #10進数扱い

丸め処理は.quantize()を用いる。roundingを指定することでいくつかの丸め処理が可能。とりあえずゼロ丸めだけしたかったのでその例のみ記す。quantizeの第1パラメータには揃えたい桁数を有する値をDecimal形式で与える。1E-4などで与えてもよい。第2パラメータにはroundingを指定する。指定しなければDecimalのデフォルトの丸め形式が実行される。

Decimal('0.01283').quantize(Decimal('0.01'),rounding=ROUND_DOWN) #0.01
Decimal('0.314155').quantize(Decimal('1E-2'),rounding=ROUND_DOWN) #0.31

つの丸め処理しかしない場合はデフォルトの丸め形式を指定しておくと楽そう。またデフォルトの有効桁数を指定することもできるようである。

getcontext().prec=24 #24桁にする
print(Decimal('0.00000038471942')/Decimal('0.0000312413')) #0.0123144497828195369590894
getcontext().rounding=ROUND_DOWN #切り捨てに設定
getcontext().prec=10 #10桁にする
print(Decimal('0.00000038471942')/Decimal('0.0000312413')) #0.01231444978

なお、decimalで得た数値を他の関数に与えるなどの場合はintやfloatにキャストしてあげないといけない。

・速度を調べる

floatで計算したときより速度が遅いらしいので、雑に速度を比較した。以下のようにひたすら小数を足し上げるのにかかる時間を測定。

import time
from decimal import *

start=time.time()
sum1=Decimal('0')
for i in range(1000):
    sum1+=Decimal('0.1111')
end=time.time()
print(sum1,end-start)

start2=time.time()
sum2=0
for i in range(1000):
    sum2+=0.1111
end2=time.time()
print(sum2,end2-start2)

値と実行時間の結果は以下の通り。

float合計 decimal合計 float実行時間 decimal実行時間
100回 11.110000000000026 11.1100 0.0009992123 0.0009994507
1000回 111.0999999999974 111.1000 0.0010001659 0.0009992123
10000回 1110.9999999999386 1111.0000 0.0019972324 0.0049958229
100000回 11110.00000000701 11110.0000 0.0129878521 0.0489549637
1000000回 111099.99999810797 111100.0000 0.1228837967 0.4615705013
10000000回 1110999.9999210974 1111000.0000 1.1908910275 4.4668421745

単純な足し算だからか、実行時間はほぼ線形に増加した。floatで扱ったときとdecimalで扱った時では約4倍の開きがあった。計算がより複雑になると変わってくるかもしれないが、まあメチャクチャ遅いって感じはしない。

仮想通貨取引所用ライブラリ ccxt を導入する

仮想通貨取引botを細々といじるにあたり、今までは取引所ごとに異なるライブラリを用いていた(e.g. pybitflyer, zaifapi)が、海外取引所などもまとめて一つのライブラリccxtで扱えるらしいので、それぞれの環境に導入した。

 

・at AWS Cloud9

 ターミナルで $sudo pip-3.6 install ccxt とすればモリモリインストールされる。

 

・at jupyter notebook

 Anaconda prompt で $pip install ccxt とすればモリモリインストールされる。あるいは白紙のnotebookで !pip install ccxt としても可能。

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"

って怒られたので、visual studio build tools 2017 を拾ってきてから再度試したらモリモリインストールが完了した。

GitHub Educationに登録してみる

privateリポジトリを無料で手に入れるため、GitHub Educationに登録することにした。申請には大学が発行するメールアドレスが必要になる。(13歳以上と書いてあったので大学に限らず教育機関ならOKなのだと思う)

 

以下登録までの流れ。 

1.

GitHubにログインした状態で https://education.github.com/ にアクセスする。

2.

Studentの場合は https://education.github.com/students からJoin GitHub Education → Get your Pack → Yes, I'm a student. と進んでいくと申請フォームが出る。

3.

申請フォームを英語で埋めていく。

・Name

 名前を書く。

・Verify academic status

 学生である証明として、大学発行のアドレスを選択する。GitHub登録時に別のアドレスを使っていた場合は、please add and verify it 的なリンクから、大学発行のアドレスを紐づける。

・School name

 学校の名前を書く。英語で正式名称を。

・Graduation year

 卒業予定年を選ぶ。

・How do you plan to use GitHub?

 GitHubの使用目的を書く。プライベートリポジトリの必要性を絡めておくと良さそうな気がします。数行で大丈夫そう。

 

フォームを提出して数分でOKが出た。早すぎて笑った。ともあれありがたいことです。

2年間有効で、期間が終了した後も学生やそれに類する身分の場合は再申請可能。