[知見求む!] 確定申告用に仮想通貨取引の帳簿アプリを作ってみた

# この記事について

## 何を作ったか
仮想通貨の取引帳簿をつけるWebアプリを作りました。

- アプリの場所: https://take-iwiw.github.io/CryptoCoinAccountBook
- マニュアル: https://github.com/take-iwiw/CryptoCoinAccountBook

正直、このアプリよりも、このエクセルシートを使った方が実用的です (https://github.com/take-iwiw/CryptoCoinAccountBook/blob/gh-pages/sample/仮想コイン取引帳簿.xlsm )

2018/1/20 追記: 上記エクセルシートの機能追加をしました。(トランザクションとコインの追加フォーム、年間損益計算機能の実装)。かなり使いやすくなったと思います。

## なぜ作ったか、なぜ公開したのか
- 国税庁のタックスアンサーによると、ビットコイン(おそらく仮想コイン全部)の取引によって生じた利益は雑所得に区分されるようです
- 同じ取引所(例えばbitFlyere)内で、日本円→ビットコイン、その後ビットコイン→日本円に戻して利益が生じた場合などは計算がしやすいです
- しかし、以下の場合を考えると、計算が大変です
	- 購入したビットコインの一部分だけを売却した。その後、また少し買い足したりした
		- ⇒ 購入価格はいくらになる?
	- 日本円で買った仮想コイン(BTCやLTC)を基に、海外の取引所で別の仮想コインを買った。いわゆる仮想コイン間の売買。購入だけで、日本円には戻していないので手元には何の利益もない
		- ⇒ この場合も、損益が発生したとみなされるらしい。しかし、どう計算する?
- このような状況で、今年ももうすぐ終わり、確定申告がすぐに必要になるのですが、これだ！という情報もなく、家計簿的なソフトもまだありません
    - (2018/1/20 追記) 最近、いくつかアプリがリリースされてきましたが、どのアプリも対応する取引所が限定されています。草コインの売買に使うようなマイナーな取引所はまだサポートされていない状況です。
- ということで、自分で作ってみました。ただし、僕は、税制どころか簿記すら素人。しかも業務アプリ作成経験なし (本業は組み込みエンジニア)
- そのため、より多くの方に突っ込んでいただきたくシェアすることにします。特に帳簿計算のロジックに不安が残ります。。。

__何か間違っている点、ご意見がありましたら、ぜひとも教えてください。Qiita上でもGitHub上でもどういうルートでも構いません__

# 作成したもの
[https://take-iwiw.github.io/CryptoCoinAccountBook/](https://take-iwiw.github.io/CryptoCoinAccountBook/) こちら、からアクセスできます。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/66a9b176-0515-7e55-0d16-f66678d30a7f.jpeg)

上のイメージがスクリーンショットになります。

## 機能仕様
- 仮想コイン取引の登録ができる
	- 日本円 - 仮想通貨 取引
	- 仮想通貨 - 仮想通貨 取引
- 登録した取引履歴を表示できる
- 取引履歴に応じた損益計算ができる
	- 取引ごとの損益
	- 特定期間の損益 (例えば確定申告用には1月1日から12月31日まで)
- 取引履歴の保存/読出しができる
	- JSON形式でローカルに保存 (スクリプトを組めば、各取引所の取引履歴(csv)から変換できるはず)

具体的な操作方法は、[https://github.com/take-iwiw/CryptoCoinAccountBook](https://github.com/take-iwiw/CryptoCoinAccountBook) こちらの、Readmeをご確認ください。ここはQiitaなので、技術的な内容に絞って記載したいと思います。

# 計算仕様
この計算仕様が肝になるところです。ぜひ有識者の方にレビューをお願いしたいです。

## 平均取得価格の計算方法
平均取得価格は、移動平均法によって求めています。まず、対象となるコインの簿価を求め、その後保持しているコイン残高で割ることで求めています。取引時点での対象コインの日本円相当の総価値[円]を`簿価`とします。n回目の取引の数値を`XXX[n]`とします。初期値`XXX[0]`は0になります。

- 購入の場合: `簿価[n] = 簿価[n-1] + 対象コインの取得総価格[n]   (円)`
	- 例えば、1BTC=2,000,000円のときに2BTC購入したら、`対象コインの取得総価格`は4,000,000円
- 売却の場合: `簿価[n] = 平均取得価格[n-1] x コイン残高[n]   (円)`
- `平均取得価格[n] = 簿価[n] / コイン残高[n]`

### 具体例
具体的な例で考えてみようと思います。簡単のために、JPY-BTCのみの取引で考えます。

| 売買 | レート [円/BTC] | 数量 [コイン数] | 総価格 [円] | 残高 [コイン数] | 簿価 [円] | 平均取得価格 [円] | 利益 [円] |
|:---:|----------------:|---------------:|-----------:| --------------:| ---------:|----------------:|----------:|
|買    | 2,000,000      | 2              | 4,000,000  | 2               | 4,000,000 | 2,000,000      | 0         |
|買    | 2,500,000      | 1              | 2,500,000  | 3               | 6,500,000 | 2,166,667      | 0         |
|売    | 2,400,000      | 1              | 2,400,000  | 2               | 4,333,334 | 2,166,667      | 233,333    |

まず最初に、2,000,000円/BTCの時に、2BTC購入したとします。その時に必要な総価格は4,000,000円になります。簿価も同じく4,000,000円になります。平均取得価格は単純に、4,000,000円/2で2,000,000円です。

次に、レートが少し上がって2,500,000円/BTCの時に、1BTC購入したとします。その時に必要な総価格は2,500,000円になります。この時点での簿価は4,000,000円+2,500,000円で6,500,000円になります。平均取得価格は6,500,000/3で2,166,667円です。

最後に、レートが2,400,000円/BTCの時に、1BTC売却して円にしたとします。売却総額は2,400,000円になります。この取引の直前までの簿価は6,500,000円で、平均2,166,667円で3BTC購入したことになっています。それが1BTCなくなるので、この取引直後の簿価は4,333,334円になります。平均取得価格は変わらず、2,166,667円です。また、2,166,667円で購入したものを2,400,000円で売却したことになるので、233,333円の利益とみなされます。(直前の取引からみたらマイナスなのに。。。)

## 仮想コイン間取引の損益の計算方法
仮想コインを使った取引では、円が絡まない場合でも損益が発生したとみなされるようです(厳密なルールはまだ分かっていないです)。例えば、1BTC ＝2,000,000円の時に1BTC購入したとします。その後、1BTC = 2,500,000円に値上がりした時に0.1BTCを使って250,000円分の「何か」を買ったとします。この場合は、0.1BTC x (2,500,000 - 2,000,000) = 50,000円の利益とみなされる用です(繰り返しですが、厳密なルールはまだ分かっていないです)。

この、「何か」にはビックカメラなどの店頭でモノを購入する場合も当てはまりますが、別の仮想通貨を購入する場合も当てはまると考えられます。

### 具体例
| 取引内容 | レート             | 購入数量    | 総価格          | BTC 残高 | BTC 簿価 | BTC 平均取得価格 | 利益 [円] | 備考 |
|:-------:|-------------------:|-----------:|----------------:| -------:| --------:|----------------:|----------:|----------:|
|JPY→BTC  | 2,000,000 [円/BTC] | 1 [BTC]    | 2,000,000 [円]  | 1        | 2,000,000 | 2,000,000      | 0         | |
|BTC→ZENY | 0.00001 [BTC/ZNY] | 10,000 [Zny] | 0.1 [BTC]      | 0.9       | 1,800,000 | 2,000,000      | 50,000    | この時、1BTC = 2,500,000円 |

具体的な例で考えてみようと思います。 
まず最初に、2,000,000円/BTCの時に、1BTC購入したとします。BTCの平均取得価格は単純に、2,000,000円です。
その後、0.00001 [BTC/ZNY]というレートで、0.1BTCで10,000 [Zny]を購入したとします。このとき、実はビットコインが値上がりしていて、1BTC = 2,500,000円になっていたとします。その結果、0.1[BTC] x (2,500,000 - 2,000,000) = 50,000円の利益が出たとみなされます。

ここでは、BTC-ZENYの例でしたが、オルトコイン-オルトコインの取引でも同じだと思われます。全ての仮想コイン間の取引では、売り側コインの売却時点の日本円相当の総額に置き換えて計算できると思います。

__何度も繰り返しになりますが、僕は全くの素人です。特にここは自信がありません。何か間違っている点、ご意見がありましたら、ぜひとも教えてください。Qiita上でもGitHub上でもどういうルートでも構いません__

### 日本円相当?
見てきたように、仮想通貨同士の取引時には、一度日本円相当に戻して損益を計算する必要があります(あると思っています)。上記の例では、1BTC = 2,500,000円として例を挙げました。BTCなら、まだ円にも直しやすいですが、他のコインだとどうでしょうか? 例えば、JPY→LTC→DOGE→XPという取引を考えます。最後にDOGEでXPを購入するときの日本円相当のお値段はどうなるのでしょうか? 

正解は不明です。どなたかわかる方いましたら、教えてください。ひとまず僕は、ここ(https://www.coingecko.com/en/price_charts/bitzeny/btc )のサイトで確認した日本円相当の単価 x 取引数量で計算することにしました。個人的な見解ですが、これに関しては合理性があり、一貫性があれば問題ないと思います(個人の感想です)。というのも、例えば、先の例で、DOGE→XPにするときに、サイトで確認したDOGEの価値が実際に取引した瞬間の価値よりも高かったとします。この取引ではDOGEを売却しているので、その分帳簿上の利益も増えます。結果として支払う税金も増えます。しかし同時に、XPの購入価格(平均取得価格)も増えています。つまり、最終的にXPを売却するときには帳簿上の利益は少なくなります。結果として、つじつまはとれています。が、この考えで本当にいいかどうかは確証はとれません。

なお、本アプリケーションでは、この「日本円相当のお値段」は手動で入力する仕様としています。そのため、今後国税庁から新しいアナウンスが出たり、別の解釈が主流になったとしてもユーザ側の操作で対応できるようになっています。

# ToDo
- 入力済み取引の削除、編集
- ポートフォリオで時価総額の表示
- 仮想コイン間取引時に、日本円相当の値段を自動取得
- 各取引所の取引履歴(csv)からのインポート
- 本アプリケーションで管理する取引履歴をJSONローカルファイルから、オンラインデータベースにする
- デザイン改良。スマホでも見やすく
- 他にもいっぱい

__プルリク、Fork歓迎します。僕の方でのメンテはあまりできないと思いますが。__

# 免責事項
本記事の内容、及び本アプリケーションは、日本の税制にのっとった計算を保証するものではありません。本アプリケーションを利用することによって生ずるいかなる損害に対しても、作成者は一切責任を負いません。確定申告は自己責任で行うようにしてください。 

# おわりに
頑張って作ったのだけれど、昨日(12/22)の大暴落で確定申告不要になってしまった。。。
色々と未完成な部分があり、ToDoもあるのだけれど、やる気がなくなってしまった。。。