2022.01.10

GMOコインで始めるアルトコイン投資 ~ データ解析編 ~

暗号資産一覧

はじめに

次世代システム研究室のT.Y.です。この記事では暗号資産(仮想通貨)投資の入門的な解説を行います。

2021年は、ビットコイン先物ETFの上場やメタバースとの関連性の指摘など、暗号資産が注目される機会が多い一年でした。実際、様々なDeFi(分散型金融)プラットフォームの開設や、暗号資産の一種であるポルカドットのパラチェーンオークションが実施されるなど、注目すべきイベントが多数起き、この一年間で暗号資産の市場規模が拡大しています。

このような状況を踏まえて、国内での法規制も徐々に整備されてきたことから、暗号資産投資に一層注目されている方も多いのではないでしょうか。しかし、実際に暗号資産(仮想通貨)に投資しようとすると、取引できる銘柄が国内の取引所だけでも既に多数あり違いがよくわからない、という状況に陥りがちです。

そこで、今回はGMOコインで扱っている銘柄を中心に、投資対象としての暗号資産について解説します。定性的な項目で各暗号資産を比較し、Pythonで簡単なヒストリカルデータの分析を行うことで、アルトコイン(ビットコイン以外の暗号資産)の面白さが少しでも伝われば幸いです。

暗号資産(仮想通貨)について

改めて、暗号資産(仮想通貨)とは何でしょうか。日本銀行によると以下のように説明されています。

「暗号資産(仮想通貨)」とは、インターネット上でやりとりできる財産的価値であり、「資金決済に関する法律」において、次の性質をもつものと定義されています。

  1. (1)不特定の者に対して、代金の支払い等に使用でき、かつ、法定通貨(日本円や米国ドル等)と相互に交換できる
  2. (2)電子的に記録され、移転できる
  3. (3)法定通貨または法定通貨建ての資産(プリペイドカード等)ではない

出典:日本銀行

今回は入門的な解説となりますので、主に以下のポイントを押さえておくとよいでしょう。
  1. インターネット上でやりとりできる財産的価値
  2. 電子的に記録され、価値の保存や移転が可能
なお、上記2.の電子的な記録はブロックチェーン技術により実装されていると考えて問題ありません。ブロックチェーン技術の応用領域はいまや暗号資産(仮想通貨)だけに留まりませんが、2008年のビットコインの登場以来、ブロックチェーン技術を応用して様々な暗号資産(仮想通貨)が開発され、現在も多くのコインやトークンが新たに発行されています。今回はビットコイン以外にどのような暗号資産があるのかを解説し、GMOコインの取引所取引の実際のデータを分析します。

GMOコインで取引可能な仮想通貨銘柄


GMOコインで行う取引には取引所取引と販売所取引の2種類があり、取引できる暗号資産の種類や取引価格が異なります。
  • 取引所取引:注文板形式により参加者同士で行う板取引
  • 販売所取引:GMOコインとお客様による相対取引
取引所取引については銘柄数が限られているものの比較的小さいスプレッド(売値と買値の差分)で取引することができ、板の動きをうまく読むことで有利な価格で暗号資産を取引できる可能性があります。

販売所取引は取引所取引に比べてスプレッドが大きい一方で取引量が安定しており簡単に取引ができる上、国内取引所では珍しい有望な暗号資産を取引することが可能です。

GMOコインで2022年1月現在取り扱われている暗号資産の銘柄は以下の通りです。

暗号資産の比較

暗号資産投資を考える上で面白いことは同じ暗号資産でも開発状況や相場からの評価が全く異なるという点です。新機能の開発やコミュニティが活発な暗号資産はやはり資産価格にも好材料として評価される側面があります。他のブログ記事でも多数紹介しているように、2022年1月時点ではイーサリアムが技術的なベースラインになっていると考えられ、投資を考える上でもイーサリアムと他の暗号資産の関係は注目すると良いと思います。以下では実際の取引データを見て定量的に評価していきます。

なお、国外も含めた暗号資産全体の時価総額や価格推移などはCoinGeckoCoinMarketCapCOIN360などでリアルタイムで確かめることができます。

GMOコインの取引所取引データの分析

銘柄や取引量が取引所の内容に限定される形になりますが、GMOコインでは取引所取引の過去実績データを個人情報を落とした形で公開しており、オンラインでCSVファイルを取得して分析に使用することができます(GMOコインの取引所取引のヒストリカルデータ)。

まずはデータをスクレイピングして分析用のデータを作成します。直近3年分の過去データが存在する下記の暗号資産の取引データを取得します。

分析に使用する暗号資産銘柄:
  • ビットコイン(BTC)
  • イーサリアム(ETH)
  • リップル(XRP)
  • ビットコインキャッシュ(BCH)
  • ライトコイン(LTC)
import numpy as np
import pandas as pd
import requests
import itertools
import os
from bs4 import BeautifulSoup

def trade_csv_list(tick_code, year, month):
    # 取得したいWEBサイトをurlで指定
    url = f'https://api.coin.z.com/data/trades/{tick_code}/{year}/{month}'
    req = requests.get(url)
    soup = BeautifulSoup(req.text, 'html.parser')
    contents = soup.find(class_="data-list")
    get_a = contents.find_all("a")

    # 上の回数分hrefの中身を取得ループ
    csv_list = [url + '/' + alink.get("href") for alink in get_a]

    return csv_list

# 指定した月まで一括で取得
def lump_together_list(tick_code, year, month):
    csv_list = []
    for mm in [str(i + 1).zfill(2) for i in range(month)]:
        csv_list += trade_csv_list(tick_code, str(year), mm)

    return csv_list

# いくつかの銘柄をまとめてデータをとる
csv_list = []
for tick, year_month in itertools.product(['BTC', 'ETH', 'XRP', 'BCH', 'LTC'], [(2019, 12), (2020, 12), (2021, 12)]):
    y, m = year_month
    csv_list += lump_together_list(tick, y, m)

# read csv
df = pd.concat([pd.read_csv(file) for file in csv_list], axis=0)
df = df[df['year']>2018] # 2019年のデータに2018年末のデータが少し含まれるので除外

# 分析用項目
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['year'] = df['timestamp'].dt.year
df['month'] = df['timestamp'].dt.month
df['day'] = df['timestamp'].dt.day
df['hour'] = df['timestamp'].dt.hour
df['minute'] = df['timestamp'].dt.minute
df['amount'] = df['size'] * df['price']

# check
print('shape: {}'.format(df.shape))
df.head()

無事スクレイピングすることができました。作成したデータセットは約1,645万レコード(1.1GB)となりました。

まずは年間の各暗号資産の取引金額を確かめてみましょう。(数字の単位は億円です)
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

# 年間の取引所取引の合計額
total_amount = df.groupby(['symbol', 'side', 'year'])['amount'].sum().unstack(['symbol', 'side'])
total_amount /= 10**8
total_amount = total_amount[[('BTC'), ('XRP'), ('ETH'), ('BCH'), ('LTC')]]
plt.rcParams['figure.figsize'] = [15, 6]
sns.heatmap(total_amount, cmap='magma', annot=True, fmt=',.0f', annot_kws={'fontsize': 14})
plt.title('Yearly deal volume in GMO Coin exchange trading', fontsize=16)
plt.show()


上の集計から、2020年から2021年にかけて取引量が大幅に増えていることがわかります。また、2021年になってようやくイーサリアムの取引量がリップルの取引量を上回りました。

なお、少し興味深いことに、2021年の現物ビットコイン取引では買いの方が多い結果となり、他の銘柄とは様相が異なりました。ビットコインは認知度が高い銘柄であるため長期保有を前提に、まさに資産として購入されている方が一定数いらっしゃるのではないかと推測されます。

次に、月間の取引金額を見てみます。
# 月間取引量
total_amount = df.groupby(['symbol', 'year', 'month'])['amount'].sum().unstack(['year','month'])
total_amount /= 10**8
plt.rcParams['figure.figsize'] = [20, 9]
sns.heatmap(total_amount, cmap='magma', annot=True, fmt=',.0f', annot_kws={'fontsize': 11})
plt.title('Monthly deal volume in GMO Coin exchange trading', fontsize=16)
plt.show()


上記の結果から、2021年1月から5月にかけてビットコインの取引量が増えていたことがわかります。この期間は特に興味深い市場環境になっていることが予想されるため、後段のトレード指標を用いたチャート分析の中で扱いたいと思います。

その前に、せっかくなのでもう少し探索的なデータ解析をしてみましょう。まずは暗号資産価格の値動きを見てみます。
# データ変形用の準備
ticker_list = ['BTC', 'XRP', 'ETH', 'BCH','LTC']
ticker_tuple_list = [('BTC'), ('XRP'), ('ETH'), ('BCH'), ('LTC')]

# 月平均の資産価格
avg_price = df.groupby(['symbol', 'side', 'year', 'month'])['price'].mean().unstack(['symbol', 'side'])
avg_price = avg_price[ticker_tuple_list]
avg_ask = avg_price[avg_price.columns[avg_price.columns.get_level_values(1) == 'BUY']]
avg_bid = avg_price[avg_price.columns[avg_price.columns.get_level_values(1) == 'SELL']]
avg_ask.columns = ticker_list
avg_bid.columns = ticker_list

# サンプルで可視化
avg_price[('ETH')].plot(fontsize=16, marker='s')
plt.title('Historical transision of Ether', fontsize=20)
plt.show()


上記は2019年から2021年のイーサリアムの月間の平均取引価格の推移です。この期間にかなり資産価格が上がっていることが一目でわかります。

なお、この価格高騰は投資(投機)だけの関心事ではなく、別の記事でも解説されているように、送金やスマートコントラクトの実行時にかかる手数料(ガス)の高騰という問題を引き起こしています。この問題は、PolygonやArbitrumなどのレイヤー2技術の発展や、ポルカドット・コスモスなどのクロスチェーン技術の進展、Solanaなどの打倒イーサリアム系ブロックチェーンの台頭に影響しており、イーサリアムの価格がブロックチェーン全体の動向に関係していると言えます。このように、金融経済と技術発展が互いに影響を与え合っている状況を間近に見られることが暗号資産領域の面白さの一つだと思います。

さて、やはり気になるのはどのくらいリターンが見込めるのかということではないでしょうか。今回は実績データの分析を念頭に置いてデータを見てます。
# 2021.1月の平均価格で購入していた場合の収益性の推移
normalize_df = pd.concat([avg_ask[avg_ask.index == (2021, 1)] for i in range(avg_ask.shape[0])], axis=0)
normalize_df.index = avg_ask.index
return_df = avg_bid / normalize_df
return_df[return_df.index >= (2021, 1)].plot(fontsize =16, marker='*')
plt.show()


上記は、2021年1月の平均約定購入価格で各資産を購入し、その後の各月の平均約定売却価格で売却すると仮定し、その収益性を評価した結果です。この一年は特に各資産価格が向上しており、12月時点ではイーサリアムは1月から3.69倍の評価額になりました。
# 長期
normalize_df = pd.concat([avg_ask[avg_ask.index == (2019, 1)] for i in range(avg_ask.shape[0])], axis=0)
normalize_df.index = avg_ask.index
return_df = avg_bid / normalize_df
plt.rcParams['figure.figsize'] = [18, 7]
return_df.plot(fontsize =16, marker='s')
plt.show()


購入時点を2019年1月として長期の試算を行ったところ、イーサリアムでは38.5倍、ビットコインでは14倍の収益性となりました。今後の値上がりを約束するものではありませんが、長期投資は有効な投資スタイルと言えると思います。

次に、各資産価格間の相関関係を見ていきます。これまでの分析から全体的に資産価格が右肩上がりで推移しているので、ある暗号資産の価格が上がったときに、他の暗号資産が連動して上がる傾向が強いのではないかと考えられます。分析の手順として、各暗号資産のデータをデイリーで比較できるように一日毎の平均をとって集約します。Ask(買値)とBid(売値)が存在するので、ここではそれらの中間値(Mid)を計算して各暗号資産の一日の価格としました。このデイリーの資産価格の相関係数を見てみます。
# 日次の平均価格の推移
daily_avg_price = df.groupby(['symbol', 'side', 'year', 'month', 'day'])['price'].mean().unstack(['symbol', 'side'])
daily_avg_price = daily_avg_price[ticker_tuple_list]
daily_avg_ask = daily_avg_price[daily_avg_price.columns[daily_avg_price.columns.get_level_values(1) == 'BUY']]
daily_avg_ask.columns = ticker_list
daily_avg_bid = daily_avg_price[daily_avg_price.columns[daily_avg_price.columns.get_level_values(1) == 'SELL']]
daily_avg_bid.columns = ticker_list
daily_avg_mid = (daily_avg_ask + daily_avg_bid) / 2

corr_mat = daily_avg_mid.dropna().corr()
upp_mat = np.triu(corr_mat, k=1)
plt.rcParams['figure.dpi'] = 90
plt.rcParams['figure.figsize'] = [8, 7]
sns.heatmap(corr_mat, annot=True, fmt='.3f', cmap='magma', square=True, linewidths=0.6, mask=upp_mat)
plt.title('Correlation coefficients of cryptocurrency prices', fontsize=16)
plt.show()


上記から、やはり全体的に高い相関がある状況が伺えます。暗号資産価格の組み合わせの中でも、ビットコインキャッシュとイーサリアムの相関はやや弱く、ライトコインとビットコインキャッシュの相関が強いという結果になりました。値動きの実態を把握するため、散布図行列でデイリーの価格をpairplotで可視化してみます。
sns.pairplot(daily_avg_mid.reset_index().drop(labels=['month', 'day'], axis=1), hue='year', palette='tab10')
plt.show()


全体的な相関が確認できました(グラフ上の各点は一日分の2資産の円建て価格を表します)。この可視化からも2021年の値動きの激しさが見て取れます。

以下ではチャート分析の主要なトレード指標であるMACD、RSI、ボリンジャーバンドについてTA-Libで実際に計算を行いながら解説します。なお、これらの指標はGMOコインのトレードアプリで簡単にご利用いただけます。分析のための前処理として日次のファイナンスデータ(Open, High, Close, Low, Volume)の形にAskとBidのデータを整形します。

・前処理
# open, high, close, low, volumeのデータ作成準備
groupby_list = ['symbol', 'side', 'year', 'month', 'day']
df_group = df.groupby(groupby_list)

# open
open_flag = df.groupby(groupby_list)['timestamp'].transform(lambda g: g==g.min())
open_df = df[open_flag].groupby(groupby_list)['price'].mean().unstack(['symbol', 'side'])
# high
high_df = df_group['price'].max().unstack(['symbol', 'side'])
# close
close_flag = df_group['timestamp'].transform(lambda g: g==g.max())
close_df = df[close_flag].groupby(groupby_list)['price'].mean().unstack(['symbol', 'side'])
# low
low_df = df_group['price'].min().unstack(['symbol', 'side'])
# volume
volume_df = df_group['size'].sum().unstack(['symbol', 'side'])

def get_finance_data(ticker, open_df, high_df, close_df, low_df, volume_df):
    df_dict = {'Open': open_df, 'High': high_df, 'Close': close_df, 'Low': low_df, 'Volume': volume_df}
    df_list = [df_dict[name][(ticker)].rename(columns={'BUY': name+'_ask', 'SELL': name+'_bid'}) for name in df_dict.keys()]
    df = pd.concat(df_list, axis=1)

    df_mpf = df.reset_index(drop=True)
    df_mpf['time_index'] = pd.to_datetime(df.reset_index()[['year', 'month', 'day']])
    df_mpf = df_mpf.set_index('time_index')
    df_ask = df_mpf[df_mpf.columns[df_mpf.columns.str.endswith('ask')]]
    df_bid = df_mpf[df_mpf.columns[df_mpf.columns.str.endswith('bid')]]
    df_ask.columns = df_dict.keys()
    df_bid.columns = df_dict.keys()
    return df_ask, df_bid

# bitcoinデータ
df_ask, df_bid = get_finance_data('BTC', open_df, high_df, close_df, low_df, volume_df)
df_ask
・実行結果の例



このデータを用いて各暗号資産毎の日次変動率の分析をしてみます。
pct_list = []
for n, ticker in enumerate(ticker_list):
    df_ask, df_bid = get_finance_data(ticker, open_df, high_df, close_df, low_df, volume_df)
    open_close_pct = (df_ask.Close / df_ask.Open - 1)
    pct_list.append(open_close_pct)

# 分布の比較
sns.histplot(pd.concat(pct_list[:3], axis=1).clip(-0.33, 0.33))
plt.show()


ビットコインと比較するとリップルやイーサリアムの分布の裾が厚くボラティリティが高いことが確認できました。(可視化のため、±33%超の変動はクリップしています。)やはりリターンにはリスクが伴うということがわかります。

参考として統計量でも確認しておきます。
# 各銘柄の日次変動率(Close/Open-1)の比較
display(pd.concat(pct_list, axis=1).describe())

代表的なトレード指標

トレードアプリでMACDや, RSI, ボリンジャーバンドなどの見方がわからないという方も多いのではないでしょうか。これらのテクニカル指標がわかれば、定量的に投資判断を行うことができます。暗号資産やブロックチェーンの開発状況や利用状況をウォッチするファンダメンタルズ分析の観点も大切ですが、その時々の市場の景況感を過去の値動きから読むテクニカル分析の視点も同様に重要です。

まずは計算に用いるTA-Libと可視化用のmplfinanceの環境を構築します。(Mac Book)
brew install ta-lib
pip install TA-Lib
pip install mplfinance
インストールできたら先ほどのファイナンスデータを用いてチャート分析を行います。既にmplfinanceだけで簡単にチャートを描くことができます。
from datetime import datetime
import mplfinance as mpf

# etherのファイナンスデータ
df_ask, df_bid = get_finance_data('ETH', open_df, high_df, close_df, low_df, volume_df)
# 例
mdf = df_ask[(df_ask.index >= datetime(2021, 1, 1)) & (df_ask.index < datetime(2021, 6, 1))].dropna()
title='Basic chart analysis of Ethereum'
mpf.plot(mdf, type='candle', style='yahoo', figratio=(13, 5), volume=True, mav=(5, 25), title=title)


上段はローソクチャートといい、一日の値動きをダイジェストしたグラフです。ローソクの棒の実体がOpenとCloseの値を結んだもので、棒の枠から上下に出た線はHighとLowを表します。主要な値動きを一度に可視化できて便利ですね。下段の棒グラフは取引量を表しています。

テクニカル分析とは、チャートの動きから現在の資産価格の割安・割高を判断したり値動きのトレンドを考える際のヒントとなる指標を読み解く分析のことです。以下は代表的なテクニカル指標であり、GMOコインの公式アプリ上でも確認することができます。
  • MACD(Moving Average Convergence / Divergence):資産価格のトレンド把握
  • RSI(Relative Strength Index):売られすぎ・買われすぎの景況感把握
  • Bollinger band:底値・天井値の目安
詳細な計算方法の解説は参考資料の解説書や他の記事をご参照いただければと思いますが、ここでは実際の値動きと比較して各指標を考察します。
import talib as ta

# 終値からMACDを計算
close = df_ask['Close']

# MACD - Moving Average Convergence/Divergence
df_ask[['macd', 'macd_signal', 'macd_hist']] = pd.concat(ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9), axis=1)

# RSI - Relative Strength Index
df_ask['RSI'] = ta.RSI(close, timeperiod=14)

# TA-Libによるボリンジャーバンド計算
# period:移動平均線期間、nbdevup:上側バンド幅(デフォルト2σ)、nbdevdn:下側バンド幅(デフォルト2σ) matype:移動平均線の種類(0:単純移動平均線)
bb_2_upper, bb_2_mid, bb_2_lower = ta.BBANDS(close, timeperiod=21, nbdevup=2, nbdevdn=2, matype=0)
df_ask[['bb_2_upper', 'bb_2_mid', 'bb_2_lower']] = pd.concat([bb_2_upper, bb_2_mid, bb_2_lower],axis=1)

mdf = df_ask[(df_ask.index >= datetime(2021, 1, 1)) & (df_ask.index < datetime(2021, 6, 1))].dropna()
add = [
    # ボリンジャーバンド
    mpf.make_addplot(mdf['bb_2_mid'], linestyle='dashed', width=1.0, color='r'),
    mpf.make_addplot(mdf[['bb_2_upper', 'bb_2_lower']], linestyle='dashed', width=0.4, color='b'),
    # MACD
    mpf.make_addplot(mdf['macd'], panel=2, color='red'), # パネルの2番地に赤で描画
    mpf.make_addplot(mdf['macd_signal'], panel=2, color='blue'), 
    mpf.make_addplot(mdf['macd_hist'], panel=2, type='bar', width=0.7), 
    # RSI
    mpf.make_addplot(mdf['RSI'], panel=3, color='blue', width=0.7),
]
title = 'Bollinger Band, MACD and RSI\nChart analysis of Ethereum'
mpf.plot(mdf, type='candle', style='yahoo', volume=True, addplot=add, figratio=(19, 8), title=title)


上記のグラフの1段目がローソクチャートにボリンジャーバンドを追加したものです。各時点で直近の資産価格の標準偏差×定数(ここでは2)の幅を計算したものですが、全体的に概ねこの範囲内に収まっていることが確認できます。

3段目はMACDです。赤色の折れ線グラフ(MACD)がメイン指標で、価格変動のトレンドを表したものになります。0以上で推移している場合に上昇中、0以下の場合に下降中のトレンドと読むことができます。青色の折れ線(シグナル)はMACDの移動平均線で、MACDとの交差するタイミングで市場のトレンドの変わり目を探る際に参照します。MACDとシグナルの差分(背後のヒストグラム)を見るとトレンドが強くなっているのか弱くなっているのかを推察できます。

一番下の青色の折れ線グラフがRSIです。各時点で直近の価格推移のうち下落が続くほど0に、上昇が続くほど100に近づきます(変動幅も考慮します)。一般的にはRSIが70を超えた状態が買われすぎの目安、30を下回ったときが売られすぎの目安と言われているようです。

TA-Libの計算結果はPandasのDataFrameに格納されているので、自分で予測モデルを作る際の特徴量としても使用することができます。

最後に

今回はGMOコインで取引できるアルトコインやデータ分析について解説しました。次回は暗号資産ポートフォリオの最適化問題を考えてみたいと思います。

次世代システム研究室では、ビッグデータ解析プラットフォームの設計・開発を行うアーキテクトとデータサイエンティストを募集しています。興味を持って頂ける方にはぜひ 募集職種一覧からご応募をお願いします。

免責事項

暗号資産(仮想通貨)投資には価格変動などのリスクが伴います。また本記事は暗号資産(仮想通貨)の投資の収益を保証するものではありません。

参考資料

CoinGecko

CoinMarketCap

COIN360

https://qiita.com/matsxxx/items/9ff33e61a0ef9ed47651

https://optrip.xyz/?p=2506

https://note.nkmk.me/python-pandas-matplotlib-candlestick-chart/

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事