ぜひ皆様のEDAの方法やモデルの立て方を教えてください!
はじめに
はじめまして、らんそうるい(Twitter Id→@rnsr0371)と申します。
私は時系列解析の勉強中で、勉強&練習の一環として、このコンペに参加させていただいています。
このトピックを立てた目的は、ぜひ参加者の皆様のテクニックを教えていただきたかったからです。現状、私が提出した予測は(おそらく)単純な方法によるもので、改善できる点がたくさんあると思います。アドバイスがいただけるととても嬉しいです。
なお、使った言語はRです。Pythonでなくて申し訳ありません。
予測の方法とその背景
すべての銘柄について効果的にEDAを行う方法が思いつかなかったので、全銘柄からランダムに10銘柄を選んで、株価の定常性と単位根の有無を調べました。その結果、株価の階差を取ったほうが、時系列モデルで扱いやすそうだと考えました(*ただ、株価の階差を取ると、調べた10個の銘柄については自己相関がなくなる銘柄が多かったです)。
Rにはforecastというパッケージがあって、その中にauto.arima()という関数があります。この関数はARIMAモデルの良さげな次数を情報量基準を使って探してくれる関数です。そこで階差とauto.arima()を使って、銘柄一つ一つに対して、モデルを立てて、階差を予測しました。つまり、ARIMAモデルを3278個立てました。
結果
public リーダーボードで0.04314というスコアを得ました。
気になっていること
おそらく記事に対するコメントでは扱いにくい内容なので、新しくトピックを作っていただけると嬉しいです。
- EDAの方法。予測しないといけない銘柄が多すぎて、どうアプローチすればいいのか分かりません。
- 銘柄一つ一つに対してモデルを立てる方法を採用しましたが、銘柄全体に対してモデルを立てる方法も見てみたいです。
よろしくお願いいたします。
予測に使ったコード
#必要なライブラリのインポート
library(tidyverse)
library(forecast)
#データのインポート
train_data=read_csv("train_data.csv")
company_list=read_csv("company_list.csv")
#train_dataは巨大すぎるので2019年のデータだけ抽出
train_mini=train_data[374:419,]
train_mini$Date=as.Date(train_mini$Date)
companies=colnames(train_mini)
companies=companies[-1]
#データの整形
company=character()
data=data_frame(date=c(),price=c(),name=c())
for(company in companies){
date=train_mini$Date
price=train_mini[company]
names(price)="price"
name=rep(company,46)
temp=data_frame(date,price,name)
data=rbind(data,temp)
temp=data_frame()
}
#全データで階差を取ってみる
company=character()
data_dif=data_frame(name=c(),dif=c())
for(company in companies){
dif=data %>% filter(name==company) %>% select(price) %>% .$price %>% diff()
dif=c(NA,dif)
temp=data_frame(name=rep(company,46),dif=dif)
data_dif=rbind(data_dif,temp)
}
data=data %>% cbind(data_dif[,-1])
#全データに対して銘柄ごとに自己回帰モデルを立て、予測値を作る
company=character()
data_pred=data_frame(name=c(),pred=c())
count=0
for(company in companies){
model=auto.arima(x=subset(data,name==company)$dif,
max.p = 10)
pred=predict(model,1)$pred[1]
temp=data_frame(name=company,pred=pred)
data_pred=rbind(data_pred,temp)
count=count+1
print(count)
}
#提出用のファイルを作る
data2=data %>% dplyr::filter(date=="2019-11-17")
data2=data2 %>% left_join(data_pred,by="name")
data2=data2 %>% mutate(ans=price+pred)
data2=data2 %>% mutate(submit=ifelse(ans<0,price,ans))
data3=data2 %>% select(name,submit)
colnames(data3)=c("id","y")
submit=read_csv("submission_template.csv")
submit=submit %>% left_join(data3,by="id")
submit=submit %>% select(id,y.y)
colnames(submit)=c("id","y")
write_csv(submit,"submit7.csv")