G-Research Crypto Competition(timestamp,Targetの抜け(コインごと))

timestampが全通貨で抜けているtimestampがあることを確認したけど、そういえばコインごとにみたときはtimestampってどれだけ抜けているの?と思って確認。

全コインで抜けているtimestampの要因は出題者がデータまとめた際のエラーや取引所自体が落ちたとか?かなと。一方、あるコインのみ抜けているtimestampはそのコインが対象の1分間取引されなかったのではないかと思う。後者は動いてないだけだから前の時点の値で補完してもよい気がする。

コインごとにどれだけ抜けているか確認

コインによってデータ取得開始期間が違うため、取得開始以降で全体の何%がNaNであったかをCloseとTargetそれぞれについて確認。

id2name = details.set_index("Asset_ID")["Asset_Name"].to_dict()

adds = []
for k,v in id2name.items():
    
    tmp = data[data.Asset_ID == k].copy()

    full_time = pd.DataFrame(pd.to_datetime(full_timestamp)).rename(columns= {0: "org_timestamp"})
    tmp = pd.merge(full_time, tmp, left_on= "org_timestamp", right_on= "Time", how= "left")
    tmp.sort_values("org_timestamp", inplace= True)
    tmp["timestamp"] = tmp["timestamp"].fillna(method= "ffill")
    tmp.dropna(subset= ["timestamp"], inplace= True)
    first_time = tmp["org_timestamp"].iloc[0]

    agg_dict = {
        "org_timestamp": "count",
#         "Time": "first",
        "Close": "count",
        "Target": "count",
    }
    agg = tmp.agg(agg_dict)
    agg["Close%"] = 100. - (agg.Close / agg.org_timestamp) * 100.
    agg["Target%"] = 100. - (agg.Target / agg.org_timestamp) * 100.
    agg["first_time"] = first_time
    agg = pd.DataFrame(agg)
    agg["asset_name"] = v
    adds.append(agg)


tmp = pd.concat(adds, axis= 0, sort= True)\
    .reset_index()\
    .rename(columns= {0: "value"})
pivot = tmp.pivot(index= "asset_name", columns= "index", values= "value")

pivot = pd.merge(pivot, details.set_index("Asset_Name")["Weight"], left_index= True, right_index= True, how= "inner")
pivot[["Weight", "first_time", "Close%", "Target%"]].sort_values("Weight", ascending= False)

f:id:iiiiikamirin:20220115230617p:plain

当たり前だけど、CloseのNaN比率が低いとTargetのNaN比率も低い。CloseのNaN比率の低さはVolumeの変動の低さと相関してそう。ある程度のVolumeで安定していれば取引がつかないこともなくCloseがNaNとなることもなくなる的な。試しにコインごとのVolumeの標準偏差を出してみるとドージ・ステラは確かに大きい。Moneroは標準偏差は大きくないがそもそも平均がとても小さい。Volumeが関係している気が。。

agg_dict = {
    "Volume": ["mean","median","min", "max", "std"]
}
pivot = df_v.groupby("Asset_ID").agg(agg_dict)
pivot.columns= ["_".join(i) for i in pivot.columns]
pivot = pivot.rename(index= details.set_index("Asset_ID")["Asset_Name"].to_dict())
pivot = pd.merge(pivot, details.set_index("Asset_Name")["Weight"], left_index= True, right_index= True, how= "inner")
pivot[["Weight", "Volume_mean", "Volume_max", "Volume_std"]].sort_values("Weight", ascending= False)

f:id:iiiiikamirin:20220115235919p:plain