こんにちは、ぱそきいろです。
以前、マイニングしたETHをなるべく出金手数料を少なくする方法を調べました。
www.takacpu55.xyz
この中でETH→BTCを経由して楽天キャッシュにチャージするという方法でしたが、売り時をどうするかという問題があります。
つまり、ETHが上がって日本円(楽天キャッシュ)にしようとしてもBTCが下がっていたら結果的に損をするのでは無いかという気がします。
グラフを見たらおそらく(擬似)相関があるのだろうという気がしますが、勉強をかねて相関を出す方法を考えてみました。
データのDL
ここからデータをDLします。
BTC
BTC JPY bitFlyer 過去データ - Investing.com
ETH
ETH JPY Bitfinex 過去データ - Investing.com
範囲を絞れるみたいなのでひとまずはデータが取れそうな2019年1月23日〜2022年9月19日までにしておきます。
データ前処理
まずはDLしたcsvデータをmatplotlibで書き出してみます。
BTCとETHの価格差が大きいのでこれだと相関関係がぱっと見で分からないですね。。
そこでBTC、ETHそれぞれを最大値1、最小値0で正規化してみます。
正規化はここら辺のpreprocessing.minmax_scaleを使います。
Pythonで正規化・標準化(リスト、NumPy配列、pandas.DataFrame) | note.nkmk.me
こうしてみるとほぼ相関があることが分かります。
このままでも計算できそうですが、後続の作業のために平滑化しておきます。
今回は5日の移動平均を使いました。
ここまでくると直感的にBTCが上がっているときにETHも上がると言えそうですが、数字的に表したいと思います。
比較のためにBTCの値動きと関係なさそうな以下の2つのデータも使います。
・乱数で生成した時系列データ(ランダムウォーク)
・東京都の気温データ
気象庁|過去の気象データ・ダウンロード
同様に正規化・平滑化してプロットしたグラフは以下です。
見にくいですが、乱数(RAND)は移動平均をとったので0.5周辺の値が多いです。
また、気温データ(TEMP)は季節によって周期性があるみたいです。
相関係数
ここから相関係数を求めていきます。
実際の出し方はここら辺を参考にします。
numpy.corrcoef — NumPy v1.23 Manual
print("相関係数") print("BTC ETH",np.corrcoef(BTC,ETH)[0][1]) print("BTC RAND",np.corrcoef(BTC,RAND)[0][1]) print("BTC TEMP",np.corrcoef(BTC,TEMP)[0][1])
相関係数
BTC ETH 0.9334525523252127
BTC RAND 0.04396910985469478
BTC TEMP 0.06504730277895024
BTCとETHの相関係数が0.93と強い相関関係があることが分かります。
逆に比較対象の乱数や気温はほぼ0と無相関でした。
コサイン類似度
次にコサイン類似度から相関関係を見ていきたいと思います。
実際の出し方はここら辺を参考にします。
【Python NumPy】コサイン類似度の求め方 - Qiita
print("コサイン類似度") print("BTC ETH",cos_sim(BTC,ETH)) print("BTC,RAND",cos_sim(BTC,RAND)) print("BTC,TEMP",cos_sim(BTC,TEMP))
コサイン類似度
BTC ETH 0.9618821264600941
BTC,RAND 0.7514277882004005
BTC,TEMP 0.706385136095789
こちらはBTCとETHで強い相関が出たものの、乱数、気温ともそれなりに強い相関が出てしまいました。
考察すると、コサイン類似度はベクトル間の角度で類似度を求めます。
時系列データが全て正の値なので第一象限しか値を取らなかった。
なので-1~1をとるコサイン類似度にも関わらず、1/4の範囲でしか値が現れなかったと考えられます。
0.5~1の間で値をとる(0.5が負の相関、0.75が無相関、1が正の相関)と考えると、キレイに無相関と相関が現れているように見えます。
まとめ
(グラフを見た時点で分かっていたけど)BTCとETHの値動きは相関関係があることを数字で確認できました。
次にETHが上がった時点で楽天キャッシュにチャージする方針にしたいと思います。(いつになるやら)