暗号資産の取引計算は面倒
管理人は2021年に暗号資産の取引を始めました。2022年を迎えたので確定申告用に損益計算をする必要がありますが,暗号資産の取引計算はとても面倒です。特にDeFiなどは取引履歴のデータが非常に見にくいので,データを収集するところから結構大変です。
私は一定のスパンで取引履歴を集約/管理していたので,9割近く計算は終わってしまいましたが,年末は時間があったので「Python」を使って「Debank」という取引履歴を確認するサイトから自動で情報を収集するコードを書いてみることにしました。
大晦日に思い立ったかのように「Python」をインストールしました。学生時代に実験データの処理にたまにコードは書いていましたが,「Python」は全く触ったことがなく初心者です。
Python
Pythonってなに?
そもそも「Python」とはなに?と思う人も多いかもしれません。「Python」は1931年に登場したプログラミング言語で「読みやすい」「書きやすい」ことを思想に作られています。
身近なプログラムを例に挙げると,Excelのマクロ機能もプログラムの一種です。
何ができるの?
「データ処理/分析」、「Web上の情報収集」「ゲーム制作」などなど多岐にわたります。
身近な具体的な例を挙げてみると,クレジットカードや携帯の明細データを毎月会員サイトからダウンロードしていませんか?「Python」でコードを書けば自動で終わります。
参考サイト
今回,Pythonを勉強するにあたり,こちらのサイトが非常に参考になりました。Youtubeに動画もあるのでわかりやすいです。
作りたいモノがないと勉強する気にならないのがプログラムですが,作り始めると理解がかなり進みます。
Debank
暗号資産のウォレットアドレスから取引履歴を表示してくれるサイトです。履歴の一覧が非常に見やすいので管理に最適です。このサイトが取引履歴のCSVファイルを提供してくれれば最高ですが,現状その機能はありませんので,今回「Python」を使って情報収集することにしました。
サンプルコード
色々なサイトを参考にしながら,とりあえず動くコードが完成しました。確実にもっとスマートな表記があるはずですが後々勉強したいと思います。完全に初心者コードです。
「Debank」から「取引情報」「取引種別」「取引量」「手数料」をCSVファイルとして保存します。
from selenium import webdriver
import time
import pprint
import numpy as np
import pandas as pd
#chromeヘッドレスモードで取引履歴にアクセス
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path = 'C:\\Users\\..............\\chromedriver.exe', chrome_options=chrome_options)
driver.get('https://debank.com/profile/............................/history')
time.sleep(10)
#タイムアウトするまでロードボタンを繰り返しクリック
while True:
try:
frm = driver.find_element_by_xpath('............................')
time.sleep(5)
frm.click()
except:
break
time.sleep(10)
#取引履歴情報を取得
his=driver.find_elements_by_class_name('.........................')
#関数定義
#Debank取文字列から以下の情報を行列で返す
#1:Txn日時
#2:Txn種別
#3:取引量
#4:取引シンボル
#5:ガス量
#6:ガスシンボル
def Debank_to_Matrix(data):
Matrix=[]
#取引履歴にガス代以外の暗号資産が含まれる場合
if '+' in data or '-' in data:
num_symbol=data.count('+')+data.count('-')
num_gas_fee=data.count('Gas Fee')
if data.count('+')!=0 and data.count('-')!=0:
if data.index('+')>data.index('-'):
num_index=data.index('-')
else:
num_index=data.index('+')
elif data.count('+')==0:
num_index=data.index('-')
elif data.count('-')==0:
num_index=data.index('+')
amount=[]
symbol=[]
str_same_txn='same_txn'
for i in range(num_symbol):
if i==0:
time=data[0]
sts=data[2]
if num_gas_fee>0:
gas_fee=data[-1].split()[0]
gas_fee_symbol=data[-1].split()[1]
else:
gas_fee='NaN'
gas_fee_symbol='NaN'
else:
time=str_same_txn
sts=str_same_txn
if num_gas_fee>0:
gas_fee=str_same_txn
gas_fee_symbol=str_same_txn
else:
gas_fee='NaN'
gas_fee_symbol='NaN'
amount.append(data[num_index+(2*i)]+data[num_index+(2*i)+1].split()[0])
symbol.append(data[num_index+1+(2*i)].split()[1])
Matrix.append([time,sts,amount[i],symbol[i],gas_fee,gas_fee_symbol])
#取引履歴にガス代以外の暗号資産が含まれない場合
elif '+' not in data and '-' not in data:
time=data[0]
sts=data[2]
amount='NaN'
symbol='NaN'
gas_fee=data[-1].split()[0]
gas_fee_symbol=data[-1].split()[1]
Matrix.append([time,sts,amount,symbol,gas_fee,gas_fee_symbol])
return Matrix
for i in range(len(his)):
if i==0:
#引数定義
str=his[i].text
Debank_data=str.splitlines()
#結果の出力
#-----------------
#元データ
#出力データ
print('---------------------------------------------------------------------------------------------------')
print(Debank_data)
pprint.pprint(Debank_to_Matrix(Debank_data))
#初期マトリクスの定義
Matrix_initial=np.array(Debank_to_Matrix(Debank_data))
else:
#引数定義
str=his[i].text
Debank_data=str.splitlines()
#結果の出力
#-----------------
#元データ
#出力データ
print('---------------------------------------------------------------------------------------------------')
print(Debank_data)
pprint.pprint(Debank_to_Matrix(Debank_data))
#マトリクスを結合
Matrix_result=np.array(Debank_to_Matrix(Debank_data))
Matrix_combine=np.append(Matrix_initial,Matrix_result,axis=0)
Matrix_initial=Matrix_combine
#結合マトリクスの表示
pprint.pprint(Matrix_combine)
#データフレーム変換
df=pd.DataFrame(Matrix_combine)
#データフレーム表示
print(df)
#データフレームとしてCSV書き込み
df.to_csv('test.csv')
まとめ
「Python」で「Debank」の情報を収集してみました。Python初心者でしたが,わかりやすい解説サイトなどが多く参考になりました。プログラムの基礎的な知識があったのも大きかったです。今回は「Debank」というマニアックなサイトを対象にしたので,コードの中身については触れませんでしたが,一般的に使えそうなモノを作る時は,細かく解説したいと思います。
わざわざ情報収集のコードを書いていますが,肝心の暗号資産の利益は大したことありません。今年は頑張ります。
コードをみて,「ここはこう書ける」などなどスマートな表記方法があればコメントください。
コメント