見出し画像

【競馬自動購入】pythonでリアルタイムオッズ取得part1

こんばんは!今回は、中央競馬のオッズ取得方法について自分が行った方法を簡単に説明していきたいと思います。

私は、中央競馬のオッズを取得するために「KeiBa DataBase Server(KBDBS)」という競馬データベースサーバーソフトウェアを利用しています。KBDBSを利用することで、簡単にレース情報を取得することができます。

本記事では、KBDBSを利用したオッズ取得をpythonで実装する方法を紹介しようと思います。

準備

まずは、以下を行いましょう。

1.KBDBSのダウンロード

2.JRA-VANデータラボへの登録

これで、KBDBSが利用できるようになります。

KBDBSのセットアップ

初回起動時に、データセットアップされると思いますが、されなかった場合、メニューバーの設定>データセットアップにてデータをダウンロードできます。
今回はpythonでデータを取得したいので設定>ODBC設定から、ODBC設定を行います。

(1)KBDBSを起動して、[設定]メニューから[ODBC設定]を選択します。もしこの時点で、ODBCドライバがインストールされていなければ、インストールするかどうかの確認メッセージが表示されます。ここでODBCドライバをインストールしてください。
(2)ODBC設定画面が表示されます。デフォルトのままで「実行」ボタンをクリックすると、ユーザーDSN として、FB_KBDBSが追加されます。
(3)「テスト接続」をクリックし、正常に接続できるか確認してください。

正常接続が確認できれば、KBDBSのセットアップは完了です。

pythonで実装(オッズ取得)

ここからは、pythonでオッズを取得するためコードを書いていきます。

私は、fdbというパッケージを用いてKBDBSに接続しました。KBDBSとの接続部分のコードは下のような感じです。

import fdb
# コネクション作成 #ipaddressは各自変更
conn = fdb.connect(dsn=r'192.168.11.1:C:\Program Files (x86)\team-nave\KBDBS\DB\KBDB.FDB',user="SYSDBA", password="*******")

dsnの欄には各PCで設定されているIPv4アドレスを入れてください。コマンドプロンプトにてipconfig /allと入力したらIPv4アドレスが分かります。

実際にSQL文を実行してオッズを取得していきます。KBDBSのテーブル構造はヘルプに書いてあるので参考にしてください。
今回は、"2021年の3/6の中山1Rの単勝オッズ"を取得してみようと思います。c.executeの引数に取得したいオッズをSQL文で書きます。単勝オッズは"ODDSTFWK"テーブルで取得できるので今回はSQL文の変数部分には下記を入力します。
テーブル名:table='ODDSTFWK'
開催日:date='20210306'
レース番号:race="01"
競馬場コード:place_code='06'

実行するとrowの中に、取得したデータが格納されます。
単勝オッズのデータが入っている識別名は"TANODDS"なので
row["TANODDS"]で単勝オッズデータのみ取得できます。

#取得したいレース情報を変数に代入
#テーブル名
teble = 'ODDSTFWK'
date='20210306'
race="01"
place_code='06'

#カーソル取得
c=conn.cursor()
#SQL文実行
c.execute(f"SELECT * FROM {table} WHERE OPDT={date} AND RNO={race} AND RCOURSECD={place_code}")
row = c.fetchonemap()
TANODDS=row['TANODDS']
print(TANODDS)


実行結果↓
このように、2021年の3/6の中山1Rの単勝オッズの数列が取得できます。

1622077300871366140803320022097404220044007606791451007402000367

あとは、この数列を単勝オッズに分解するために下のような関数を作成し分解しました。

def str_to_list_by_slice(base_str,slice_point: int):
   list=[base_str[i: i + slice_point] for i in range(0, len(base_str), slice_point)]
   return list

引数base_strにrow["TANODDS"]を、引数slice_pointに数列の区切る桁数を入力。今回は4桁で1頭の単勝オッズを表しているので、4を引数にします。すると、戻り値に馬番の昇順で単勝オッズが要素になったリストが返ってきます。

str_to_list_by_slice(row['TANODDS'],4)

実行すると、[1622,0773,0087,‥‥‥]と4桁毎に区切られた文字列のリストが返ってきます。あとは、3文字目と4文字目の間に小数点を挿入する関数を実行。

def add_point(base_string,insert_point: int):
   insert_string = '.'
   num='{0}{1}{2}'.format(base_string[:insert_point], insert_string, base_string[insert_point:])
   return num

Todds=[]
for i in str_to_list_by_slice(row['TANODDS'],4):   
    Todds.append(add_point(i, 3))

これで、Toddsという変数に[162.2,077.3,008.7,‥‥‥]という文字列のリストが格納されます。あとは、参照するときにfloat型に変換すればOKです。発売前取消、発売後取消のデータは"----","****"のように入ってるので私は0として変換しました。

データ確認

ちゃんと取得できているか、2021年の3/6の中山1Rの単勝オッズをwebで確認してみます。最終データはこれ→[162.2,077.3,008.7,‥‥‥]。ここでは、3頭目までしか書いていないですがあってそうです。

画像1

ということで、単勝オッズをpythonで取得することができました。

長くなりましたので、リアルタイムでの実装については次回書こうと思います。


この記事が気に入ったらサポートをしてみませんか?