Python お金の健康

Pythonでマイニング収益の平均取得単価を計算する方法【移動平均法】

こんにちは、ウチダです。

夫婦で貯金ゼロ・借金400万円から
仮想通貨と株式へ投資をスタートし、
いまでは1500万円を運用しています。
 
副業は仮想通貨のマイニング企業を立ち上げ、
月5万円の不労所得を得ています。

仮想通貨のマイニングマシンに興味はあるけど、

「収益の計算ってめんどくさそう」

「移動平均ってどうやって求めるの?」

と悩んでいませんか?

実はPythonを使えば平均取得単価を簡単に

計算できるんです。

なぜこんなことが分かるかといえば

私が実際にPythonで計算しているからです。

この記事ではプログラミング言語Pythonを使って

マイニング収益や手数料から平均取得単価を

計算する方法を紹介します。

この記事を読み終えると、

プログラミングの具体的な活用事例を学べます。

Pythonでマイニング収益の平均取得単価を計算する方法【移動平均法】

Pythonでマイニング収益の平均取得単価を計算する方法【移動平均法】

私は法人で仮想通貨のマイニングを行っています。

平均取得単価を計算する際、

法人は移動平均法を使うことになっています。

(参考:暗号資産に関する税務上の取扱い及び計算書について(令和3年12月)

上記サイトには計算シートも付いています。

ただ、NiceHashでは4時間毎にマイニング収益が振り込まれるため、

上記の計算シートでは厳密な平均取得単価が計算できません。

(計算シートは日時データの入力のみ可能)

そこで、Pythonで移動平均法で取得単価を

計算できるプログラムを作りました。

コードはこちらです↓

#ライブラリをインポート
import pandas as pd
import numpy as np
import datetime
from pathlib import Path
import glob

#マイニングレポートの読み込み
files = glob.glob('report*.csv') 
for file in files:
    data = pd.read_csv(file)

#必要なデータだけ抽出して保存
df = data[22:-5] 
df.to_excel('mining_data.xlsx')

#リストに変換
list_df = df.to_numpy().tolist()

#マイニング報酬だけ抽出
re_df1 = df[(df['Purpose'] == 'Hashpower mining')]

#手数料の列を作成
re_df1['fee amount(BTC)'] = 0
re_df1['fee amount(JPY)'] = 0

#報酬のデータに手数料を入れていく
for i in list_df:
    if i[2] == 'Hashpower mining fee':
        re_df1.loc[(re_df1['Local date time'] == i[1]), 'fee amount(BTC)'] = float(i[3])
        re_df1.loc[(re_df1['Local date time'] == i[1]), 'fee amount(JPY)'] = float(i[5])

#報酬から手数料を差し引いた列
re_df1['change amount(BTC)'] = re_df1['Amount (BTC)'] + re_df1['fee amount(BTC)']
re_df1['change amount(JPY)'] = re_df1['Amount (JPY)'] + re_df1['fee amount(JPY)']

#累計利益
re_df1['total amount(BTC)'] = re_df1['change amount(BTC)'].cumsum()

#平均取得単価の列を作成
re_df1['average price(JPY)'] =  0

#リストに変換
re_df1_list = re_df1.to_numpy().tolist()

#平均取得単価の計算
for j, v in enumerate(re_df1_list):
    if j == 0:
        value = v[9] / v[10]
        re_df1.loc[(re_df1['Local date time'] == v[1]), 'average price(JPY)'] = value
        pre_totalamount = v[10]
        pre_value = value
    else:
        value = (pre_totalamount * pre_value + v[5] + v[7]) / v[10]
        re_df1.loc[(re_df1['Local date time'] == v[1]), 'average price(JPY)'] = value
        pre_totalamount = v[10]
        pre_value = value

#保存
re_df1.to_excel('test.xlsx')

できあがったエクセルファイルはこちら↓

右端が移動平均法で計算した平均取得単価です。

国税庁のエクセル計算シートと突き合わせましたが

ちゃんと同じ値になっていました。

マイニング収益のデータはNiceHashから

ダウンロードしました。

やり方はこちら↓

移動平均法は仮想通貨を取得するたびに

平均取得単価を計算する方法です。

1ヶ月を超えてくると計算が大変になりますね。

このプログラムであれば1,000行のデータが

あっても5秒で処理できます。

プログラミングを身につけると

作業効率が劇的に向上する例でした。


余談ですが、

この平均取得単価とビットコインの価格を

比較したグラフを作成します。

#ライブラリのインポート
from pylab import mpl, plt
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline

#グラフのデータ
count = re_df1.index
rate = re_df1['* Exchange rate']
average_get = re_df1['average price(JPY)'] 

#グラフの作成と保存
plt.figure(figsize=(20, 10))
plt.plot(count, rate, lw=2, label = 'BTC_JPY', color='b')
plt.plot(count, average_get, lw=2, label = 'Mining average get', color='g')
plt.legend(loc=1, fontsize=18)
plt.xlabel('count', fontsize=18)
plt.ylabel('price(JPY)', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("mining_rate.png")

できあがったグラフがこちらです↓

ビットコインの交換レートとマイニングの平均取得単価

青がビットコイン価格、

緑がマイニングでの平均取得単価です。

緑のラインを青が上回ったときに

売買益が発生します。

ビットコイン価格よりもなだらかに

平均取得単価が下がっていることが分かります。

売りどきを見極める時は、

このようなグラフがあると役立ちますね。

プログラミングを身につければ

投資の売買判断にも役立ちます。

ここまで読んでくださり、ありがとうございました。^^

-Python, お金の健康
-,