俺にも執筆活動させろボケ

boatのbacktestにoptunaを使う。

モチベーション

オッズの予想をLightGBMでかましてそれを確率とみなす(1/odds(行列))

確率*締切前オッズ=期待値

期待値の高めの買っても全然儲からないのでインジケーターを作って

フィルターを採用パラメーターを探るのにoptuna使ってみる。

 

backtestの関数を書いて

paramsの辞書を渡し、トータル金額を返す。

最後にマイナスにしておく(最小化するので)。

 

f:id:nemui3900:20190213132709j:plain

簡単

本当に汎用性が高くて素晴らしいフレームワークだなあ。

boat機械学習してるのにインジケーターシコシコ作ってる俺もどうかと思うが。

LightGBMでバイナリ分類(label encod)まで

大事な部分は

欠損値は勝手にやってくれる。

カテゴリを数値にする必要がある。

 

いらない変数は削除。ひたすらDFをdropしていく、

今回はオッズは使わないのでそれも殺す。

ある程度やったら次はカテゴリを数値に変える。

qiita.com

ここのLabelEncodrを使う。

と思ったが出現順をあとで覚えとかないといけないのでmapで意味のある順番にしていくことにする。

unique()で取得してmapで数字にを繰り返す。

f:id:nemui3900:20190124163327j:plain

ひたすら繰り返す。

f:id:nemui3900:20190124180439j:plain

ほんとうは特徴量を爆発的に増やして力で殴るのが正解っぽいが

いっかいこれでやってみよう。

 

問題設定は1号艇が1着かどうか

datasetにして保存して終わり。

次回いよいよLightGBMを触る。

 

ラベルが偏るので

 

https://alphaimpact.jp/downloads/pydata20181020.pdf

主に16ページ目、そうなんだよなあバイナリの目的変数だとインに偏りすぎる。

回帰の問題にするかランクの問題にしてうまく学習しろって感じか。

 

試す目的変数リスト

着順

タイム

オッズ

1号艇のみのタイム

他の艇の1号艇との差

 

1号艇のみバイナリで良くてほかは差分を目的変数にしたら面白いかもなあ。

みずはのめの公式botに賭けてみた結果

f:id:nemui3900:20190120200124p:plain

デーン、課金したのが5日ですw

頂点が5日です本当にありがとうございました。

まあ別に文句言うつもりもないし払ったことに後悔はない。

しかしスクレイピングできない人々はあれに払っても乗っかれないので

そこはどうにかしないと間口が狭くなっちゃうよねって思うよ。

 

まあひとの心配より自分だ、

あまりにも機械学習のことをわかっていなくていい加減kaggleやれって話ではある。

www.codexa.net

危機感からこれを買ったんだけどいろいろ考えた結果

LightGBMの方を使うことにした。

www.youtube.com

まあこれを見た影響ですよね。

だるくなってきたら楽しんでるやつを見るのは割といい解決策かもしれない。

あとGoogle colabが全然使い方わかんねーの、まさかファイルを開くだけでこれとは。

LightGBMの特徴量をどう作るかわからないので、しばらく座学で。

 

競艇にお金を賭けるスポーツと去年の振り返りと今年の目標

競艇のデータをいじっていて思う、これは計画と実行のタスク管理をするスポーツなんだ。

いかにGPUとCPUを止めずに動かし続けられるかが重要で見なければ(可視化)いけないデータは山ほどあるし、捨てていいのか悪いのかわからないデータもたくさんある。

イテレータを回すのが下手過ぎてそれさっきやっとけばこの行動の速度あがったなあってのがかなりある、今はまだ余計な重複をかなり含む(これがとてもストレスだ。

最近わかったが俺は余計なことがかなり嫌いだ。

初学者なのでまあそれはしょうがないのだが、あと一年以内にはなくしたい。

そのためにまずはクラウドをうまく使うようにすべきだ自由に使えるCPUを借りているのだからグリッドサーチみたいなものはそっちでやるべきだし。

 

Google Colabみたいなものは絶対に使うべきだ、明日絶対に触る。

www.codexa.net

 

ちょうどいいタイミングなので去年の振り返りと今年の目標。

去年の目標が1億w

今ほぼ無一文や、4枚あるモニターのいち枚が壊れて悩んでいるぐらいお金ないわ。

ボートで負けすぎたな、コインはそこまで負けてない。SFDをちゃんとしたら多分そこそこ勝てたけど仕事やめるぐらいの時間は必要だったな。jsonの操作がどうしても下手だった。フルタイムのトレーダーなら稼げたんだと思うが。live用のbotちゃんと書くのってそこそこ大変なんだぜ。あとあのapiと遅延はまじで糞だった。

スイング始めたタイミングも最悪だった、俺が稼ぐその前にコインのボラリティが死んだ。市場の魅力が死んだとも言える。

そうなってくるともう最悪だ、そこで今後も末永く同じことが起こるであろう方にシフトした競艇だ。

競艇に鞍替えしてこれは俺にあっていると感じたのでもっと早くそうしてればよかった、トレードなんてものは突き詰めるとどれだけ他人が嫌なタイミングでどれだけ買ってどれだけ売るかだ(かっこいい言葉をならべれなくもないがしない)。他人を一番不幸にしたやつに幸運が訪れる。

もちろんそういう善悪の話ではない。問題は他人の弱さに俺は興味がない。自分の弱さを補強するのは好きだが他人がどうなろうと知ったことではないのでまあ勝てなくても仕方がないのだ。自分という人間に興味を持つべきだった、そこで時間を無駄にした。

 

今年の目標

pandaspandaspandaspandasとにかくDataFrameの操作を不自由なくやる。

初速を失ってたるんでるのでいい加減ワープアの自覚を持って力づくで早く進むこと。

ロードマップを作って練ること、そしてそれにさっさと取り掛かること。

イテレータを回せ回せ。

ボートデータのDataFrameの結合から分割まで

ミズハノメから持ってきたデータは1ヶ月ごとなので、

しゃらくせえので全部合体する。

そのときに(左端)ゴミを消してset_index("dataid")としておく。

またjoinで出走、直前、オッズを結合します。

そうするとなぜかリザルトのrowとずれがあるので

indexのみのシリーズを作ってpd.concatしてoptionのjoin"inner"で共通している部分のみにします。

f:id:nemui3900:20190113191921j:plain

大体こんな感じ。

それから3万12万3万に分けて

テスト トレインセット(train,test) バックテスト

に使う。

左から2015年9月で終わりが2018年の12月。

オッズを特徴量にしたい場合はトレインセットの始まりが17年の4月ぐらいになるように調整してください。

 

次回

決定木のeli5を使って特徴量の選別作業から。

460カラムあって使いそうなやつから20個ずつ、

なんとも地味な作業だ。嫌になるぜ。

みずはのめのデータ提供サービスのapiを利用してラベルの作成まで。

みずはのめのデータ提供サービスが開始されたので使ってみる。これで月5万ぐらいって恐ろしくお買い得だと俺は思っているがお金は増えていないw

1,データの保存。

requestsで認証してのgetでapiを叩いてio.StringIOでオブジェクトに変換して

pandasのdataframeにしてpklで保存します。

わからないとこはドキュメントを参照してください、新しい機能とかサイレントで入っているので差分表示するか告知もうちょっと頑張って(応援。

docs.mizuhanome.net


 

2,リザルトに3連単の組番を追加する。

def c_kumi(df_chk):
    ans = ""
    #print(np.where(df_chk.values=='1')[0][0])
    dn = df_chk.values
    try:
        #文字列で生成
        iti = str(np.where(dn=='1')[0][0]+1)
        ni = str(np.where(dn=='2')[0][0]+1)
        san = str(np.where(dn=='3')[0][0]+1)
        print(iti,ni,san) 
        ans =iti+ni+san
        #三着まで入ってるか確認してなければ空にする
        if not san:
            ans = ""
    except:
        ans = ""
    return ans    

関数の作成、同着が怪しいがまああまり気にしないで次。

dr["bangumi"]=dr[["player1_chk","player2_chk","player3_chk","player4_chk","player5_chk","player6_chk"]].apply(c_kumi,axis=1)

おまけ
ついでに払い戻しを一つのカラムに入れておく。

#順列の生成とオッズのカラムリスト生成
import itertools
seq = ["1","2","3","4","5","6"]
jy3 = list(itertools.permutations(seq, 3))
li = []
for j in jy3:
    li.append("odds_3t"+j[0]+j[1]+j[2])

dr["SRT_H"] = dr[li].max(axis=1)

ps
jupyterの整理とかしないといけないなあ。
払い戻しはもっと簡単なのがあるかもしれないね。