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

ボートデータの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の整理とかしないといけないなあ。
払い戻しはもっと簡単なのがあるかもしれないね。

1番人気のバックテスト

www.youtube.com

つーことで俺もやってみる。

f:id:nemui3900:20181227131156j:plain

結論
良くも悪くもほぼ控除率に収まったので高くもなく低くもない。

 

一応オッズによるフィルタをかましてみる。

10倍以上を買う。

 

f:id:nemui3900:20181227133736j:plain

的中率と回収率が下がった、オッズにつられて一番人気を買うのは基本悪手!!

 

ということで逆にk倍以内を買う

f:id:nemui3900:20181227133813j:plain

一番良いのは6倍以内を買う。

なんと回収率81%集合知の凄さを見た。

儲からないけど控除は超えたよ。

 

おしまい。

ボートレースでいかに機械学習するか。

一応一通り触ったので雑感を垂れ流す。

はじめに教師あり学習でDNNがいいと思う。

問題を何にするかというのは非常に興味深い問題で

3連複の予想ならone hotで20通りのラベルにするか

上位(3位まで)or下位の0or1の2通りにする。

競馬のようにタイムを予想するのは競艇には向かない(断言)。

一着のみの予想ならやってみればわかるがかなり精度が出せるので

3連単は2着3着を予想できれば解けると思うのだが3連単を単に当てるのと同じぐらい難しい。それに1着を予想した分逆に正解率は下がってしまう、難しいね。

特徴量には使わないがオッズは同時にとってこないと買い目を作るときにめんどくさいので最初からセットと考えたほうが良い。

ボートの勝ち方考察。

いま完璧に予想できるAIがある、

これで100%当たるか?と言われたらそんなことはない、

その完璧な予想は一番強い人の勝率でしか正解率がない、未来は誰にもわからないので。

誰が一番強くてどのくらい勝ちそうなのかはわかる。

そうしたらあとは単純な控除を考慮した足し算割り算だ、

そして重要なのは全部が全部期待値があるとは限らない。

みんなが完璧に予想できるAIでベットしたらそれは選手おのおのの勝率で分散させてみんなが75%払い戻しを受けることになる。

 

ここから現実的に予想が下手な自分はどう勝つか、

じゃあどうやって歪むか人気になりすぎるor人気がなさすぎる、

どこにどうやってバイアスがかかるのかを考えるべきなんだろうなあ、

優位に相関していない直近の成績とかを捨てるのはひょっとするともったいないのか?

独立したレースだからと考えがちだが前のレースに意味をもたせるべきなのか。

間違った人間がオッズを歪ませるではどうやって考えて間違えにたどり着き歪むかは常に考えていたい。

もちろんこんな考えをしなくても圧倒的に正しい予測ができれば勝てるはずだ。

だからもっと頑張ってモデルと学習と特徴量をどうにかしろという話なんだ。

直前オッズがいかにあてにならないか

2倍以上に賭け続ければ勝てる。

それが意味することは

直前のオッズが2倍以上に賭ける→☓

 

確定オッズが2倍以上になるであろう直前オッズに賭ける

もしくは

時系列データで確定オッズを予測

他の特徴量で確定オッズを予測

 

どれにしても結局予測するしかない、誰にも未来がわからないように

だれにも確定オッズはわからないからだ。

つまり2倍以上に賭けるという出来もしないことをやろうとしてたわけだ、

今まで投資に身をおいておきながらこんな馬鹿なことはない。

何が簡単に儲かるだ、アホか俺は。

単勝には単勝の難しさがある。さてどうするか。

ボートの自動売買のライブテスト

seleniumがあったのでどうにかなった。

かなりちゃっちく作ったけどまあいいや。

今の所単勝のみしかできないので

2連単のbotを追加してひとまず終わりかな。

f:id:nemui3900:20181025130803j:plain

一番最初のレースで5号艇がすごいまくり決めてマジ興奮したわ。

 

変数の名前をつけるのが下手過ぎてひたすらb連打してるのマジやべえな。

どうやったら変数名をうまくつけれるんじゃ、センスだろこれ。