こんにちは、ウチダです。
夫婦で貯金ゼロ・借金400万円から
仮想通貨と株式へ投資をスタートし、
いまでは1500万円を運用しています。
副業は仮想通貨のマイニング企業を立ち上げ、
月5万円の不労所得を得ています。
仮想通貨のマイニングマシンに興味はあるけど、
「収益の計算ってめんどくさそう」
「移動平均ってどうやって求めるの?」
と悩んでいませんか?
実は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")
できあがったグラフがこちらです↓

青がビットコイン価格、
緑がマイニングでの平均取得単価です。
緑のラインを青が上回ったときに
売買益が発生します。
ビットコイン価格よりもなだらかに
平均取得単価が下がっていることが分かります。
売りどきを見極める時は、
このようなグラフがあると役立ちますね。
プログラミングを身につければ
投資の売買判断にも役立ちます。
ここまで読んでくださり、ありがとうございました。^^