見出し画像

Twitter感情分析を用いて、仮想通貨ビットコインの価格予測モデルをpythonで作成してみた

【著者プロフィール】

編集者/宅地建物取引士/ファイナンシャルプランナー(CFP)/JDLA Deep Learning for GENERAL 2021#1
データ分析に興味があり、アイデミー(AIプログラミングスクール)を受講

【目的】

仮想通貨は、日経平均株価などの景気動向に連動し日経平均が上昇すればビットコインも上昇、逆に下降すれば下落する相関性があったり、ある特定のTwitterアカウントのツイート内容(ジョー・バイデン大統領のような要人の発言)も株式マーケットに影響するとも言われていますが、そのことがビットコイン価格に影響するのではと思い、今回アイデミーでデータ分析を勉強して良い機会なため、ビットコインの相場を予想するモデルを構築をしてみることにしました。
また、今回のテーマである“感情分析”とはAIをはじめとするディープラーニングの技術を利用して人間の感情を解析することです。ツイート内容を言葉として形態素分析することで人間の相場観(感情)を読み取り、ビットコイン価格を予測することを目指します。

【実行環境】

・Google Colaboratory
・ローカル環境
・Mac OS(M1)
・Python(Python 3.7.12)

【予測モデルの結果】

最初に結論を述べますと、Twitter感情分析を用いて、仮想通貨ビットコインの価格予測モデルをpythonで作成した結果は以下の通りになりました。

--Method: LogisticRegression --
Cross validatin scores:0.4838709677419355

--Method: RandomForestClassifier --
Cross validatin scores:0.4967741935483871

--Method: SVC --
Cross validatin scores:0.45161290322580644

--Method: SGDClassifier --
Cross validatin scores:0.4645161290322581

--Method: GaussianNB --
Cross validatin scores:0.6129032258064516

--Method: KNeighborsClassifier --
Cross validatin scores:0.44516129032258067

--Method: Perceptron --
Cross validatin scores:0.44516129032258067

簡潔に説明すると、ビットコインの価格が前日よりもプラスになるかマイナスになるかを予測したのですが、GaussianNBの精度が一番高い結果となりました。

詳細については↓のブログでも解説しているのでぜひご覧ください。
https://web3walk.jp/archives/13

それでは、どのように分析を行ったのか説明していきます。

【分析フロー】

① 事前準備
 -1 データセットの準備
 -2 アクセストークンの取得
② ツイートを感情分析
 -1 アクセストークンの設定
 -2 ツイート情報の取得
③感情分析のための準備
 -1 感情分析するための辞書を用意
 -2 ツイート内容を形態素解析し辞書のリストを返す関数を定義
 -3 形態素解析結果の単語ごとのdictデータにPN値を追加する関数を定義
 -4 ツイートのPN平均値を求める関数を定義
④感情分析の実施
 -1 取得したツイートの読み込む
 -2 ツイートごとのPN平均値を求める
 -3 PN値の標準化を行う
⑤時系列データの予測
 -1 日足のbitcoin/USDデータを取得
 -2 それぞれのデータを合体
 -3 訓練データと検証データの準備
⑥特徴量の作成とラベリング
 -1 3日間ごとのPN値とビットコイン価格の変化データ(訓練データ)の作成
 -2 3日間ごとのPN値とビットコイン価格の変化データ(テストデータ)の作成
⑦予測モデルを構築し、予測精度を計測
 ロジスティック回帰、ランダムフォレスト、SVN、SGDクラス分類、KNN、ベイズ分類、パーセプトロンのモデルで予測

① 事前準備

-1 データセットの準備
データセットとは機械学習において使用するデータの集合体を指します。機会学習や予測テストに使われます。今回の場合ですと、日経平均の価格、ビットコインの価格データ、ツイート文などが該当することになります。

今回は日経平均の価格データをCSVファイルとして以下のサイトから入手いたしました。(実装の仕方などは割愛します)
https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_daily_jp.csv

import pandas as pd
from io import StringIO
import urllib
url = "https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_daily_jp.csv"def read_csv(url): 
    res = urllib.request.urlopen(url) 
    res = res.read().decode('shift_jis') 
    df = pd.read_csv(StringIO(res)) 
    df = df.drop(df.shape[0]-1) return df 
df = read_csv(url) 
df.head()
df['データ日付'] = pd.to_datetime(df['データ日付'], format='%Y/%m/%d')
df = df.set_index('データ日付')
df = df.drop(['始値', '高値', '安値'], axis=1) 
df = df.sort_index(ascending=True) 
df.head()


日経平均株価データを取得し、データ日付と終値だけのDataframeを作成。保存したCSVファイルを実行環境であるGoogle Colaboratoryにアップロードします

-2 アクセストークンの取得

Twitterのアクセストークンを取得します。アクセストークンを簡単に説明すると、Twitter公式APIの機能を使うための認証キーです。このAPIはツイート内容を取得する際に必要になるためアクセストークンを取得する必要があります。
Twitter社の開発者サイトに登録し、アクセストークンの発行をしてもらいます。ここではアクセストークンの取得方法の説明は割愛するため、詳しく知りたい方は以下の参考サイトをご覧ください。
(アクセストークン取得する手順が記載されています)
https://wporz.com/twitterapi-apikey-accesstoken/

② ツイートを感情分析

 -1 アクセストークンの設定
分析対象となるツイート情報を取得していきます。先程説明したTwitterの公式APIを利用してツイート文を取得していきます。またその際、アクセストークンが必要となります。"XXXX"の部分は各自取得したアクセストークンを設定するようにしてください。

import tweepy
import csv

# Twitter APIを使用するためのConsumerキー、アクセストークン設定
Consumer_key = "XXXXXXXXXXXXXXXXXXXX"# Consumer Key
Consumer_secret = "XXXXXXXXXXXXXXXXXXXX"# Consumer Secret
Access_token = "XXXXXXXXXXXXXXXXXXXX"# Access Token
Access_secret = "XXXXXXXXXXXXXXXXXXXX"# Accesss Token Secert

# 認証
auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
auth.set_access_token(Access_token, Access_secret)
api = tweepy.API(auth)

# つぶやきを格納するリスト
tweet_data = []

for tweet in tweepy.Cursor(api.user_timeline,screen_name = "@POTUS",exclude_replies = True).items():
   tweet_data.append([tweet.id,tweet.created_at,tweet.text.replace('\n','')])

print(tweet_data[0]) 
print(tweet_data[-1]) 
print(len(tweet_data)) 

# tweets_Biden.csvという名前で保存
with open('tweets_Biden.csv', 'w',newline='',encoding='utf-8') as f:
   writer = csv.writer(f, lineterminator='\n')
   writer.writerow(["id","text","created_at"])
   writer.writerows(tweet_data)

 -2 ツイート情報の取得
Twitter公式APIを利用するためにアクセストークンを設定し認証を受けます。その後、公式APIの一つであるtweepy.Cursorを利用してツイート情報を取得しています。ここで今回の対象となる"@POTUS"をアカウント名として引数に渡しています。最後にCSV形式でツイート情報を保存しています。

③感情分析のための準備

ツイート内容がポジティブな意味合い、またはネガティブな意味合いを持つかを判断して分析を行います。ポジティブかネガティブかというのはPN値で表現されます。これは単語に含まれる構成要素のポジティ ブ、ネガティブの度合いを示す数値です。また各単語ごとにあらかじめ形態素にポジティブかネガティブが定義された辞書を極性辞書と言います。ツイートの各単語をこの極性辞書に参照することで、それぞれのPN値を算出し、ツイートがポジティブかネガティブかということを数値で算出し、感情分析を行います。

感情分析のための準備に必要な要素

-1 極性辞書
-2 形態素分析を行う関数
-3 ツイートの形態素解析結果の単語ごとのPN値を取得する関数
-4ツイート毎の平均PN値取得する関数

前述の通り、感情分析には極性辞書を用意する必要があります。また、ツイート内容を極性辞書に参照させるためには、ツイート内容を形態素解析(文を言語上で意味を持つ最小単位<=形態素>に分け、それぞれの品詞や変化などを判別)しなくてはいけません。ちなみにこの形態素分析を実施する上で必要になるのがTextBlobになります。
そのため形態素分析を行う関数ツイートの形態素解析結果の単語ごとのPN値を取得する関数ツイート毎の平均PN値取得する関数を定義する必要があります。

# 感情分析のコード
import re
import pandas as pd
import numpy  as np
import matplotlib.pyplot as plt
from textblob import TextBlob

# コード描き終わるまでは暫定のcsvを読み込む(終了後に最新へ書き換える)
df_tweets = pd.read_csv('/content/tweets_Biden.csv', names=['id', 'date', 'text'], index_col='date')
df_tweets = df_tweets[['text']].sort_index(ascending=True)
print(df_tweets.tail(10))

# 最初の"RT @..."と"https..."を削除
tweet_list = []
for tweet in df_tweets['text']:
   word = tweet.split(':')
   if ' https' in word:
       tweet_list.append(None) 
   else:
       s = str(word[1:]).strip("[]")
       tweet_list.append(s) 
tweet_list = np.copy(tweet_list) 
df_tweets['text'] = tweet_list

# NANを排除、最後の行を削除
print() 
print(df_tweets.isnull().sum()) 
df_tweets = df_tweets.dropna()
df_tweets = df_tweets.drop(df_tweets.index[[-1]]) 
print(df_tweets.tail()) 

# ツイートのpolarityを入力
# 空のリストを作り、ツイートごとの平均値を求める
polarity_list = []
for tweet in df_tweets['text']:
   testimonial = TextBlob(tweet)
   polarity_list.append(testimonial.sentiment.polarity)
# polarity_listをnumpy配列に変換
polarity_list = np.copy(polarity_list)
# polarity_listを用いて標準化を行う
x_std = (polarity_list - polarity_list.mean()) / polarity_list.std()
# 標準化した値をdf_corpus['pn']に代入
df_tweets['pn'] = x_std

④感情分析の実施

分析を行う関数を定義できたので、実際に処理を実施していきます。
 -1 取得したツイートの読み込む
 -2 ツイートごとのPN平均値を求める
 -3 PN値の標準化を行う
処理を行い、各ツイートごとの平均PN値が算出できたのでその結果をグラフ形式で出力してみます。

# プロット
df_tweets = df_tweets.drop('text', axis=1)
df_tweets.index = pd.to_datetime(df_tweets.index)
df_tweets =  df_tweets.resample('D').mean()
df_tweets = df_tweets.dropna() 
x = df_tweets.index
y = df_tweets.pn
plt.plot(x,y)
plt.grid(True)
plt.show() 
print(df_tweets.head())
print()
print(df_tweets.isnull().sum()) 

# CSVファイルとして出力
df_tweets.to_csv('df_tweets_Biden.csv') 

「RT @... 」と「https://... 」と最後の行は感情分析に必要ないので削除します。そして、TextBlobを使用してツイートのpn valueを取得し、dateと標準化されたpn値だけのDataframeを作ります。分析対象となるデータに偏りが多い場合、標準化を行う必要があります。今回の場合はマイナスの値が多いことが偏りとなります。

【標準化】

与えられたデータを平均が0で分散が1のデータに変換することを指します。データに偏りがあった場合に標準化することにより、各値が平均からどのくらい離れているかを0(平均)から1の値で表現してくれます。
詳しくは以下のサイトがわかりやすく解説してくれています。

⑤時系列データの予測

 -1 日足のbitcoin/USDデータを取得
ビットコインのデータを取得。 FredはAPIキーの申請をしなくてもデータ取得が利用できます。 今回は試しにCoinbase Bitcoinのデータを取得します。https://dev.classmethod.jp/articles/pandas_datareader-python/

import pandas as pd
import datetime as dt
import numpy as np
import pandas_datareader.data as web
start = dt.date(2019,1,4)
end = dt.date(2022,4,28)
code = 'CBBTCUSD'
df_usd_bitcoin = web.DataReader(code,'fred',start,end)
df_usd_bitcoin.columns = ['終値bitcoin']
df_usd_bitcoin.head(5)

ツイート毎のPN値が算出できたので、ビットコインの価格データを使用し、予測モデルを構築していきます。まずはCSVで取り込んだビットコインデータの前処理をしていきます。CSVファイルの内容には’日時', '始値', '高値','安値', '終値','出来高'等の情報が記載されていますが、今回は日時と終値だけにフォーカスしたいので、それ以外の値は取り除きます。また、データの欠損値のある行も削除していきます。その後、終値とPN値を日時情報をキーにして結合し、一つの新たなテーブル(table.csv)として作成し、CSV出力します。 

-2 それぞれのデータを合体
日経平均価格とビットコイン価格のデータ型に合わせるために、ツイートのデータの型をdatatimeへ変更してデータを合体します。

# データの合体
import pandas as pd

# ツイートの型をdatatimeへ変更
df_tweets = pd.read_csv('df_tweets_Biden.csv', index_col='date')
df_tweets.index = pd.to_datetime(df_tweets.index, format='%Y-%m-%d')

# dfとdf_tweetsの二つのテーブルを結合
table = df_tweets.join(df, how='right')
table = table.join(df_usd_bitcoin, how='left') #.dropna() 

# table_bitcoin.csvとして出力
table.to_csv("table_bitcoin.csv")
table.dropna().head()

 -3 訓練データと検証データの準備

次に先ほど作成したtable.csvから訓練データ検証データを作成します。
訓練データとは学習に利用するデータのことを指し、検証データはそのモデルの精度評価に使用するデータのことになります。
※詳しく知りたい方は下記の解説サイトをご覧ください

今回の場合、table.csvにある8割のデータをモデルの学習データに使用し、残りの2割のデータを検証データとして利用します。そのためtable.csvのデータを2つに分割する必要があります。それが以下の処理となります。

# 学習データとテストデータに分割
from sklearn.model_selection import train_test_split

X = table.values[:, 0:2] # pn value and close price 
y = table.values[:, 2] # close_bitcoin price

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, shuffle=False)

# df_trainというテーブルを作りそこにindexを日付、カラム名をpn値、終値、終値bitcoinにしてdf_train_bitcoin.csvという名前でdataフォルダ内に出力
df_train = pd.DataFrame({'pn':X_train[:,0], '終値':X_train[:,1], '終値bitcoin': y_train}, columns=['pn', '終値', '終値bitcoin'], 
                       index=table.index[:len(X_train)]) 
df_train = df_train.dropna()
df_train.to_csv('df_train_bitcoin.csv')
print(df_train.head())

# テストデータについても同様にdf_testというテーブルを作り、df_test_bitcoin.csvという名前でdataフォルダ内に出力
df_test = pd.DataFrame({'pn':X_test[:,0], '終値':X_test[:,1], '終値bitcoin': y_test}, columns=['pn', '終値', '終値bitcoin'],
                      index=table.index[len(X_train):])
df_test = df_test.dropna()
df_test.to_csv('df_test_bitcoin.csv')
print(df_test.head()) 

scikit-learnのtrain_test_split()関数を利用して訓練データと検証データに分けています。また分けたデータに対してそれぞれ標準化を行っております。

⑥特徴量の作成とラベリング

 -1 3日間ごとのPN値とビットコイン価格の変化データ(訓練データ)の作成
 -2 3日間ごとのPN値とビットコイン価格の変化データ(テストデータ)の作成
次に作成した訓練データに対して直近3日間の変化量(pn値、株価)を特徴量とし、i日目のドル円の値がプラスなら1、マイナスなら0とラベリングします。

# 特徴量の作成とラベリング
# 前日との変化量をリストとして格納

rates_fd = open('/content/df_train_bitcoin.csv', 'r')
rates_fd.readline()  
next(rates_fd)  

exchange_dates = []

pn_rates = []
pn_rates_diff = []

close_rates = []
close_rates_diff = []

close_bitcoin_rates = []
close_bitcoin_rates_diff = [] 

prev_pn = df_train['pn'][0]
prev_close = df_train['終値'][0]
prev_close_bitcoin = df_train['終値bitcoin'][0] 

for line in rates_fd:
   splited = line.split(",")
   time = splited[0]   # table.csvの1列目日付
   pn_val = float(splited[1])   # table.csvの2列目PN値
   close_val = float(splited[2])  # table.csvの3列目株価の終値
   close_bitcoin_val = float(splited[3]) # Bitcoin close price 
   exchange_dates.append(time)  # 日付

   pn_rates.append(pn_val)
   pn_rates_diff.append(pn_val - prev_pn)   # PN値の変化

   close_rates.append(close_val)
   close_rates_diff.append(close_val - prev_close)   # 株価の変化
   
   close_bitcoin_rates.append(close_bitcoin_val)
   close_bitcoin_rates_diff.append(close_bitcoin_val - prev_close_bitcoin) # bitcoinの変化

   prev_pn = pn_val
   prev_close = close_val
   prev_close_bitcoin = close_bitcoin_val
   
rates_fd.close()
print(pn_rates_diff)
print(close_rates_diff)
print(close_bitcoin_rates_diff) 

i日目の直近3日間の変化量(PN値と株価)とi日目のビットコイン価格の上下ラベル(プラスなら1,マイナスなら0)を算出しています。
つまり特徴量を直近3日間の変化量とし正解ラベルをビットコイン価格の上下ラベルとしています。以下の手順になります。
① 1日ごとのPN値とビットコイン価格の差分を取得
② 3日間ごとのPN値とビットコイン価格の変化データの取得
③ビットコイン価格の上下ラベル作成
これで訓練データの処理は終了です。次に検証データにも同じことをしていきます。

# 同様にテストデータから特徴量を作成し、ラベリングを行います。
import numpy as np

rates_fd = open('/content/df_test_bitcoin.csv', 'r')
rates_fd.readline()  
next(rates_fd)  

exchange_dates = []

pn_rates = []
pn_rates_diff = []

close_rates = []
close_rates_diff = []

close_bitcoin_rates = []
close_bitcoin_rates_diff = [] 

prev_pn = df_train['pn'][0]
prev_close = df_train['終値'][0]
prev_close_bitcoin = df_train['終値bitcoin'][0] 

for line in rates_fd:
   splited = line.split(",")
   time = splited[0]   # table.csvの1列目日付
   pn_val = float(splited[1])   # table.csvの2列目PN値
   close_val = float(splited[2])  # table.csvの3列目株価の終値
   close_bitcoin_val = float(splited[3]) # bitcoin close price 
   exchange_dates.append(time)  # 日付

   pn_rates.append(pn_val)
   pn_rates_diff.append(pn_val - prev_pn)   # PN値の変化

   close_rates.append(close_val)
   close_rates_diff.append(close_val - prev_close)   # 株価の変化
   
   close_bitcoin_rates.append(close_bitcoin_val)
   close_bitcoin_rates_diff.append(close_bitcoin_val - prev_close_bitcoin) # bitcoinの変化

   prev_pn = pn_val
   prev_close = close_val
   prev_close_bitcoin = close_bitcoin_val
   
rates_fd.close()

INPUT_LEN = 3
data_len = len(pn_rates_diff)
test_input_mat = []
test_angle_mat = []

for i in range(INPUT_LEN, data_len):
   test_arr = []
   for j in range(INPUT_LEN):
       test_arr.append(close_rates_diff[i-INPUT_LEN+j])
       test_arr.append(close_bitcoin_rates_diff[i-INPUT_LEN+j])
       test_arr.append(pn_rates_diff[i-INPUT_LEN+j])   
   test_input_mat.append(test_arr)  # i日目の直近3日間の株価とネガポジの変化

   if close_bitcoin_rates_diff[i] >= 0:  # i日目のBitcoinの上下、プラスなら1、マイナスなら0
       test_angle_mat.append(1)
   else:
       test_angle_mat.append(0)    
test_feature_arr = np.array(test_input_mat)
test_label_arr = np.array(test_angle_mat)

内容は全く同じなので説明は割愛させていただきます。
つまるところ検証データにも同じ処理をしてあげています。

⑦予測モデルを構築し、予測精度を計測
最終的な訓練データおよび検証データが用意できたので、訓練データで学習を行い、検証データでモデルの予想精度を確認します。
ロジスティック回帰、ランダムフォレスト、SVN、SGDクラス分類、KNN、ベイズ分類、パーセプトロンのモデルで予測

# 予測モデルを構築し、予測精度を計測
# train_feature_arr, train_label_arr,test_feature_arr, test_label_arrを特徴量にして、予測モデルを構築し予測精度を計測
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.linear_model import SGDClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron

for model in [LogisticRegression(), RandomForestClassifier(n_estimators=500, max_depth=10, random_state=0), SVC(),
             SGDClassifier(),GaussianNB(),KNeighborsClassifier(n_neighbors = 3),Perceptron()]:
   model.fit(train_feature_arr, train_label_arr)
   print("--Method:", model.__class__.__name__, "--")
   print("Cross validatin scores:{}".format(model.score(test_feature_arr, test_label_arr)))
   print() 

結果は冒頭でも述べました通り、GaussianNBの精度が一番高い結果となりました。ある程度のビットコインの価格予測がTwitterや株価からできるということがわかりました。他のモデルの精度が低いため、Twitterとビットコインの相関性は低い結果と言えそうです。
また、今回検証した期間が短かったため、もっと長期間のデータを用いて検証すると違った結果が出せる可能性はあると思います。

【結果についての検証】

作成したモデルの精度があまり高くならなかった要因として、検証した結果以下の可能性が検証されます。

  • Twitterのアカウントがビットコインに特化したアカウントではなかった
     ⇒ 今回はアメリカの大統領のアカウントを使用したため、経済政策などを含めた意味でのビットコインの情報以外の内容をツイートすることが多かったと思われます。また、ウクライナ情勢もあり経済よりも政治関連のツイートが多かったようです。そのため、ビットコインに特化したニュースサイト等を選べば、PN値がビットコイン市場にフィットした値に近づけるかもしれません。

上記を踏まえTwitterアカウントを変えて検証をしてみました。
ツイッターなど2社の最高経営責任者(CEO)を歴任したジャック・ドーシー氏(@jack)は、2021年、米フロリダ州で開かれた暗号資産(仮想通貨)ビットコインの会議に参加していており、ビットコインについて影響力の人物の可能性が高いためです。

【ジャック・ドーシー氏のアカウントでの予測モデルの結果】

最初に結論を述べますと、Twitter感情分析を用いて、仮想通貨ビットコインの価格予測モデルをpythonで作成した結果は以下の通りになりました。

--Method: LogisticRegression --
Cross validatin scores:0.4827586206896552

--Method: RandomForestClassifier --
Cross validatin scores:0.4827586206896552

--Method: SVC --
Cross validatin scores:0.4942528735632184

--Method: SGDClassifier --
Cross validatin scores:0.5517241379310345

--Method: GaussianNB --
Cross validatin scores:0.5517241379310345

--Method: KNeighborsClassifier --
Cross validatin scores:0.6206896551724138

--Method: Perceptron --
Cross validatin scores:0.47126436781609193

アカウントをジャック・ドーシー氏(@jack)に変更してそれまでの作業フローは同じため省略しますが、KNeighborsClassifierの精度が一番高い結果となりました。2番目にGaussianNB、SGDClassifierの予測精度が高いため、GaussianNBはビットコイン予測に適したモデルの可能性がありそうです。

  • モデルの精度を上げるアプローチとして、時系列解析を併用して解析すると改善が期待できる
     ⇒ ビットコインの価格を時系列ごとに数値解析をし、価格の上昇・下降したタイミングの数値解析をして、価格予測を併用するとモデルの精度を上げることができるかもしれません。試しにビットコインの価格の推移を視覚化し、差分と変化率をプロットして検証してみました。ただ、ビットコインの価格の変動に明確な理由があるか不明ではありますが、株式相場と比較して非常にボラリティが高いことが明確にわかり、価格を予測しにくい原因になっていることが証明されました。

ビットコインの価格データをMatplotlibで視覚化する

まずデータ分析の基本は取得した価格データの大まかな特徴を把握するために視覚化します。PythonのMatplotlibでデータを視覚化(プロット)する方法は「df.plot()」と「plt.plot()」の2パターンがありますが、ただ視覚化するだけならどちらでも問題ありません。

ax=pd.Series(df_usd_bitcoin['終値bitcoin']).plot()
ax.set_title('Price Changes Of Bitcoin') 
plt.show()

差分と変化率を計算する

時系列データ分析において大事なのは当日と前日の価格差です。つまりn日の価格はn-1日と比較してどれだけ変化したかという差分と変化率を考えることが重要になってきます。Pythonにおける差分の計算は.diff()、変化率の計算はpandasに用意されているpct_change()で簡単に計算できます。

df_usd_bitcoin['終値bitcoin'].diff()
df_usd_bitcoin.diff().plot()

ビットコイン価格の変化率を可視化して検証する

ビットコイン価格の変化率でみても、日次で最大40%近くもの変動が起きており、株式市場と比べると非常に高いボラティリティがあることがグラフで視覚化すると一目瞭然で分かります。そして、通常のデータ分析と時系列分析の少し違う点はまずこの差分と変化率の計算して検証する点にあると思います。

# 価格データの変化率を計算する
df_usd_bitcoin['終値bitcoin'].pct_change()

# 変化率を計算して結果をプロットする
df_usd_bitcoin['終値bitcoin'].pct_change().plot()
  • 参考にできたツイート情報が少なかった
     ⇒ 今回取得したツイート情報は2021年からのデータしか取得できませんでした。これはTwitterの公式APIの制限によるもので、より長い期間のデータを取得する場合は、APIに課金する必要があります。過去分すべてのツイートが取得できれば、より高い精度にできる可能性があります。

この記事が気に入ったらサポートをしてみませんか?