ファイナンス機械学習:クラスタリング 暗号通貨 デトーニング処理
暗号通貨100種の市場プライスを取り込み、デトーニングした後に、ONCでクラスタリングをしてみる。
暗号資産の市場プライスは、yahooo financeよりダウンロードする。
import numpy as np
import pandas as pd
from datetime import datetime
from pandas_datareader import data as pdr
import yfinance as yfin
yfin.pdr_override()
cryptocurrencies = ['BTC-USD','BNB-USD','ETH-USD','USDT-USD','XRP-USD','USDC-USD',
'STETH-USD','DOGE-USD','ADA-USD','SOL-USD','WTRX-USD',
'WKAVA-USD','TRX-USD','MATIC-USD','SHIB-USD','LTC-USD',
'DOT-USD','DAI-USD','TON11419-USD','WBTC-USD','BCH-USD',
'AVAX-USD','LINKS-USD','LEO-USD','XLM-USD','UNI7083-USD',
'BUSD-USD','XMR-USD','ATOM-USD','OKB-USD','TUSD-USD',
'ETC-USD','WHBAR-USD','HBAR-USD','ICP-USD','FIL-USD',
'BTCB-USD','LDO-USD','MNT27075-USD','APT21794-USD',
'ARB11841-USD','CRO-USD','VET-USD','QNT-USD','MKR-USD',
'NEAR-USD','OP-USD','WEOS-USD','GRT6719-USD','AAVE-USD',
'XDC-USD','ALGO-USD','KAS-USD','HEX-USD','FRAX-USD',
'AXS-USD','STX4847-USD','SAND-USD','EGLD-USD','EOS-USD',
'IMX10603-USD','USDD-USD','THETA-USD','XTZ-USD',
'APE18876-USD','FLEX-USD','BSV-USD','MANA-USD',
'TNC5524-USD','FTM-USD','SNX-USD','BGB-USD','RNDR-USD',
'INJ-USD','XPRO-USD','NEO-USD','WBNB-USD','CFX-USD',
'XEC-USD','KAVA-USD','RUNE-USD','FLOW-USD','KCS-USD',
'RLB-USD','RPL-USD','CHZ-USD','USDP-USD','PEPE24478-USD',
'GALA-USD','KLAY-USD','FXS-USD','CRV-USD','PAXG-USD','XAUT-USD',
'ZEC-USD','MIOTA-USD','BTTOLD-USD','MINA-USD','BTT-USD','LUNC-USD']
startdate= datetime(2021,8,1)
enddate = datetime(2023,8,2)
c_data= pdr.get_data_yahoo(cryptocurrencies, start='2023-01-15', end='2023-08-16',
interval='1h')['Adj Close']
設定期間中の価格のないものを落とし(残要素数68)、リターン率を計算し、この相関行列を計算する。
cdata=c_data.dropna(axis=1)
return_h = cdata.pct_change()
return_mat=return_h.dropna()
return_corr=return_mat.corr()
このリターン相関行列をヒートマップで表す。
plt.matshow(return_corr)
plt.gca().xaxis.tick_bottom()
plt.gca().invert_yaxis()
plt.colorbar()
plt.show()
クラスタリングを困難にする全特徴量に共通な市場成分を取り除くために、デトーニングを行い、結果をヒートマップで可視化する。
import MarPat as MP
eVal1,eVec1=MP.getPCA(return_corr)
dt_corr=MP.detonedCorr(return_corr,eVal1, eVec1)
plt.matshow(dt_corr)
plt.gca().xaxis.tick_bottom()
plt.gca().invert_yaxis()
plt.colorbar()
plt.show()
クラスタリングのコードをONC.pyにまとめて、インポートし、デトーニング前とデトーニング後のクラスタリングを比較する。
import ONC as onc
corr0New, clstrs0New, silh0New = onc.clusterKMeansTop(return_corr)
corr1New, clstrs1New, silh1New = onc.clusterKMeansTop(pd.DataFrame(dt_corr))
デトーニング処理無し
for i in range(len(clstrs0New)):
print(i,len(clstrs0New[i]),clstrs0New[i])
plt.matshow(corr0New)
plt.gca().xaxis.tick_bottom()
plt.gca().invert_yaxis()
plt.colorbar()
plt.show()
デトーニング後
クラスタ数は同じく2でも、クラスタ1の中に入っている要素数は小さくなり、繊細にクラスタリングしていると言える。
なお、デトーニングで取り除いた固有値数は1(デフォルト)とした。