続・競馬であそぶ 1

 日本国中、小鼠の糞だらけ


  1. TARGET の外部指数(2005.09.13)
  2. TARGET のチェック馬(2005.09.22)
  3. 前走の人気と着順(2005.09.26)
  4. 条件クラスでの成績(2005.09.28)
  5. 先行脚質(2005.09.29)
  6. 新馬戦の騎手(2005.09.29)
  7. JVData のファイル名(2005.09.30)
  8. スピードINDEX の限界(2005.10.03)
  9. テキストデータの集計・検索(2005.10.06)
  10. 競馬データ処理のすすめ
------------------------------------

トップページへ




0.続きの最初

ここは、もともと JVデータをテキストファイルとして保存し、それを処理 することで
自分のアイディアを自由に試してみようという考えで始めたものです。

自分の競馬環境は、インターネットにほとんど依存しています。
JRA-VAN Data Lab. を中心にデータの入手先は自分なりに確保していますが、
馬券購入に関しても現場に行くことは殆ど(全く?)ありません。

現在ほかに、競馬プログラムとして使っているのは、TARGET だけです。
これ以外は今のところ必要ありません。

自分専用データの入手〜処理に関しては、 Perl を使っています。
スクリプトの方は、しばらく TARGET 関連でいくかもしれません。
このあたりはケッコウ特殊なので訪れる人も少ないのですが、参考になる部分も
いくらかはあると思います。

ここでの記事は、自分の環境以外での情報もいろいろ関わっては来るのですが、
すべて確認できるものではないので、深く関与するつもりはありません。
適当に読み替えるなりして、自分で判断することをお勧めします。

とは言っても、Mail などでの問い合わせは、無視する理由がなければ時間がある
限り返事はするつもりです。ヘルプも調べずというのはモチ、論外です。
まぁ、「分かりません。検索して調べてください」という返事が多いかもしれませんが、、

人間として平和を願う人」だけには、競馬で勝ってほしい。
そう思います。
アハハ、





1. TARGET の外部指数

TARGET では外部指数を取り込んで検索や集計・分析が出来るようになりました。
2005.09.12現在 ⇒ Ver. 5.31(rev 003)
これは、画期的なことだと思います。
各人の使っている指数の有効性などが計れるので、何種類かの指数を比較したり、
その指数の使い方を考えたりすれば、馬券の方の回収率も間違いなく上がります。
上がらないようなら、、、

ここでは、TARGET取り込み用のデータとして、JVデータに含まれている
データマイニング(以下、DM)予想をサンプルとして使います。
TARGET の最新の Ver 5.41( 2006.04 )では、このDMの値を機能として表示できるよう
になっています。ということで、この項は参考程度に、

実際には、DM予想は予想走破タイムとして100分の1秒の値まで出しているのですが、
精度は10分の1秒までで充分だし、プラスマイナスの誤差は全く意味が無い?ので
無視ということにします。

指数としての扱いやすさを考えると、一番速いタイムを100として、それより遅いタイムを
(10分の1秒単位で)、1づつ減らすという方法をとります。
また、予想が提供されるタイミングが何回かありますが、検索・集計などで使うには成績
からの分、つまり馬体重発表後のデータでいいでしょう。

前提としては当然、JVデータをテキストファイルで保存していること、です。

下のスクリプトをコピペして使ってください。
コピペっていうのは、いやらしい略しかたですね。コピー&ペーストのことです。
名前を自分の場合、 dm2g.pl としていますが、ご自由に、、
パスその他は、それぞれの環境に応じて★の部分を書き換える必要があります。
ファイル名が同じなので、$pass と $outpass とは必ず異なる場所に!

TARGET での設定は、スクリプトの4〜5行目を参考にしてください。

#!/usr/bin/perl
# 成績確定データから、DM予想値をTarget用外部指数として
# 使えるようにする。全ファイル一括処理。指数のみ
# レースID; 新仕様(16桁)    レース単位・CSV形式
# パス例;   H:\GAIBU\DM\SESW%Y3%M1%D1.dat
# usage:    perl dm2g.pl
use strict ;
my $pass = 'h:/TDAT/' ;             # JVのSEテキストファイル所在地 ★
my $outpass = 'h:/GAIBU/DM/' ;      # 外部指数ファイル出力先を指定 ★
# 成績確定ファイル( SESW ) から
my @mfile = grep { -e } glob "${pass}SESW*.DAT" ;

my @dm ;                #
my $max = 99999 ;       #

for my $file ( @mfile ) {
    my $fn = ( split '/', $file )[-1] ;
    my $outF = $outpass . $fn ;
    open DAT, $file or die "?? $file ??:$!\n" ;
    open OUT, ">$outF" ;
    my $karicd = '0' ;
    until ( eof( DAT ) ) {
        my $record ;
        my $dm = read ( DAT, $record, 554 ) ;
        my ( $racecode, $ub, $tm ) = unpack '@11 A16 @28 A2 @537 A4', $record ;
        unless ( $racecode eq $karicd ) {
            &outp() if @dm > 0 ;
            print OUT $racecode ;
            $karicd = $racecode ;
        }
        $tm = &t2s( $tm ) ;     # 100分の1秒( A5 )⇒ 10分の1秒( A4 )で充分
        $max = $tm if $max > $tm ;
        $dm[$ub] = $tm ;
    }
    &outp() ;
    print "\t\t処理完了$fn\n" ;
    close DAT ;
    close OUT ;
    sub outp {
        for my $i ( 1..$#dm ) {
            my $num = $dm[$i] ;
            # 最速タイムを 100 として計算
            my $dm = 100 + $max - $num ;
            $dm = sprintf '%2d', $dm ;
            print OUT ",$dm" ;
        }
        @dm = () ;
        $max = 99999 ;
        print OUT "\n" ;
    }
}

sub t2s {           # 時計表示を 1/10 秒に換算(手抜き)
    my $ll = shift ;        my $ans ;
    my ( $w1, $w2, $w3 ) = unpack( "A1A2A1", $ll ) ;
    $ans = $w1 * 600 + $w2 * 10 + $w3 ;
    return $ans ;
}

同じ要領で、外部指数をいくつか登録して比較してみるのも面白いと思います。
ここまで読むくらいの人なら既に、外部指数を使い分けているかもしれませんが、
自分の使っている指数が、この指数より劣るようであれば考え直したほうがいい
ですよね。


リアルタイム系で取得した、DM予想値をTARGET用外部指数として使えるようにする
場合は以下の通りです。こちらは、予想値が 1日分まとめて提供されています。

#!/usr/bin/perl
# リアルタイム系で取得した、DM予想値をTarget用外部指数として
# 使えるようにする。全ファイル一括処理。レース順は不定or逆順。
# 
# usage:    perl dm2gb.pl
use strict ;
my $pass = 'h:/Others/' ;           # JVのDM値ファイル所在地  ★
my $outpass = 'h:/GAIBU/DM2/' ;     # 外部指数ファイル出力位置 ★

my @mfile = grep { -e } glob "${pass}0B13*.DAT" ;

for my $file ( @mfile ) {
    my $fn = ( split '/', $file )[-1] ;
    my $outF = $outpass . $fn ;
    open DAT, $file or die "?? $file ??:$!\n" ;
    open OUT, ">$outF" ;
    until ( eof( DAT ) ) {
        my @dm ;                #
        my $max = 99999 ;       #
        my $record ;
        my $dm = read ( DAT, $record, 302 ) ;
        my ( $racecode, $data ) = unpack '@11 A16 @31 A270', $record ;
        print OUT $racecode ;
        my @dmtm =  unpack 'A15' x 18, $data ;
        for my $ln ( @dmtm ) {
            chomp ;
            next unless $ln ;
            # 100分の1秒 A5 ⇒ 10分の1秒 A4 で充分
            my ( $ub, $tm ) = unpack '@0 A2 @2 A4', $ln ;
            next unless ( $ub and $tm ) ;
            $tm = &t2s( $tm ) ;
            $max = $tm if $max > $tm ;
            $dm[$ub] = $tm ;
        }
        for my $i ( 1..$#dm ) {
            my $num = $dm[$i] ;
            # 最速タイムを 100 として計算
            my $dm = 100 + $max - $num ;
            $dm = sprintf '%2d', $dm ;
            print OUT ",$dm" ;
        }
        print OUT "\n" ;
    }
    print "\t\t処理完了$fn\n" ;
    close DAT ;
    close OUT ;
}

sub t2s {                   # 時計表示を 1/10 秒に換算(汎用)
    my $ll = shift ;        my $ans ;
    my ( $w1, $w2, $w3 ) = unpack( "A1A2A1", $ll ) ;
    $ans = $w1 * 600 + $w2 * 10 + $w3 ;
    return $ans ;
}




2. TARGET のチェック馬

一頭づつ登録して普通に使うのでも役に立つ、TARGET のチェック馬だけど、検索
からマトメテ登録することで更に役に立つリストになる。
この検索機能を使いこなしてる人は少ないかもしれないけど、とにかくスゴイし面白
い。
自分もまだ未熟な修行中の身だが、これを使うだけでも、競馬に勝てるような気が
する、、ときがあるとかないとか。

集計〜検索のときはいいのだが、レース当日は sSeia の場合、殆ど kbsTk を中心
に考えを進めるので、こうしたチェック馬を検討要素として見逃すことがたまにある。

そこで対策。
kbsTk にチェック馬を表示させればいい。
馬コードを key にして、ハッシュに入れて使えばOK。
ハッシュ名は何でもいいけど、ここでは %checkuma
以下の例だと、(コメントは無視して)チェック馬の「分類」だけをハッシュに取ってき
ている。
「分類が」35コあるので自分の場合はこれで充分。


sub get_ckuma {
    # ↓ CHECKUMA.LST...所在場所
    my $checkF = 'H:/TargetJV/CHECKUMA.LST' ;
    open DAT, $checkF if -e $checkF ;
    while ( <DAT> ) {
        chomp ;
        my ( $ua, $dt, $cc ) = unpack 'A8A6A1', $_ ;
        # ↓ 馬コードを10桁に変換(手抜き!)
        my $uc = $ua =~ /^9/ ? '19' : '20' ;
        $uc .= $ua ;
        $checkuma{$uc} = $cc ;
    }
    close DAT ;
}

このサブルーチンをドコカで実行させる。
kbsTk の場合は サブルーチン rd_base の最後の方にでも下のように追記しておけば
面倒もなくていいと思う。

    &get_ckuma() ;

使うときは、例えば馬コード( $ucode など )を参照できる場所で

my $check = $checkuma{$ucode} || '|' ;

とすれば、$check は、「分類」or 「|」になる。と言うだけの話。
'|' ではなく、' ' でも '-' でもなんでもいいけど、ココでは '|' 。
で、これ($check)を馬行データのドコカに埋め込めば、ソコにソレが表示されるというワケ。

上の例のように馬コードについては、TARGET では、旧仕様の8桁で管理している。
スクリプト側でそれに、あわせていれば桁数変換は必要なし。


実際には、チェック馬リストは複数作っておいて使い分けるのが正しいと思う。
また、$dt に登録日が入っているので、それを活用してレース日と比較したりして表示時期
をコントロールすることも可能。
簡単だけど、、それには少しだけスキルと理解度が必要、かな。


トップページへ 次へ