G-Research Crypto Competition(timestampの抜け)

Targetを作成しているnotebookをみつけたので、それをコピー。

ってか、Targetは加重平均に対する超過平均ではなくて、アルファみたいだな。

timestampに抜けがある

その中で気になったのが、trainデータに各月初日の最初の1分のデータがないという話。

要するに、毎月の最初の1分間が欠落しているので、その1分前と16分前のTargetsはリターンを計算するためのClose priceがないのでNaNになるはずなのに、それらの値が計算されているのです。つまり、これらの場合のTargetsは、私たちが見ることのできないデータに基づいて計算されているのか、それとも間違ったタイムスタンプに基づいて計算されているのでしょうか?

ほう。ということで「各月初日の最初の1分」以外にも抜けがあるのか含めて確認。まずは、そもそも何日間のデータがあるはずなのか確認。下の通り、1359日。

full_timestamp = crypto_df["timestamp"]\
    .sort_values()\
    .apply(lambda x: datetime.datetime.fromtimestamp(x))\
    .unique()

tmp = pd.DataFrame(pd.to_datetime(full_timestamp)).rename(columns= {0: "org_timestamp"})
dt_min = tmp["org_timestamp"].min()
dt_max = tmp["org_timestamp"].max()
dt_max - dt_min
Timedelta('1358 days 23:59:00')

今度はHHMM(時間:分)ごとに要素数をカウントして、やたら少ないHHMMがないか確認。雑だけど、たしかに00:00のところだけ要素数が少ない。

tmp["hhmm_timestamp"] = tmp["org_timestamp"].apply(lambda x: x.replace(year= 2000, month= 1, day= 1))
hhmm = tmp.groupby("hhmm_timestamp").count()

sns.lineplot(data= hhmm)
hhmm.head()

f:id:iiiiikamirin:20220108210138p:plain

value_counts()するとこんな感じ。00:00以外は1つ抜けがあるかないか。

hhmm["org_timestamp"].value_counts()

f:id:iiiiikamirin:20220108210850p:plain

00:00以外についてもなんか抜けがあっても1つだけというのは気持ち悪いな。ランダムなら2つ抜けるとかあってもよさそう。同じ日に連続して何時間か抜けたりしているのか??とりあえず以下の2通りの可能性を考えたけど、出題者が抜いている気が何となくする。前者ならすべて1つずつなんてきれいにならないだろうし、Bitcoinが1分間トレードされなかったという時間があるとはあんまり思えない。。

  • 全通貨取引その1分間取引がなかった

  • 出題者が意図的にデータ削除orデータ成形のミス

とりあえず、その抜けってある一日に集中しているのかそれとも分散しているのか確認。なぜかわからんが2019/10/16と2019/10/23の2日に抜けは集中している。あと毎月初日は1つ抜けているみたい(これが00:00か)。2019/10/16が抜けているのはなぜだ。。ビットコインの価格推移みてもそんなに動いた日ではないのに。。

tmp["yyyymmdd_timestamp"] = tmp["org_timestamp"].apply(lambda x: x.replace(hour= 0, minute= 0))
yyyymmdd = tmp.groupby("yyyymmdd_timestamp")["org_timestamp"].count()
yyyymmdd.value_counts()

f:id:iiiiikamirin:20220108213955p:plain

sns.lineplot(data= yyyymmdd.iloc[:-1])
yyyymmdd.sort_values().head(10)

f:id:iiiiikamirin:20220108214033p:plain

ってか、この2019/10/16あたりってTargetはあるのか?