続・競馬であそぶ 3

売国奴連中の政治が続く限り、我が国は悪臭漂う暗黒の渦のなか




7. 高レベルレースの抽出

出走した殆んどの馬が何走かするうちに勝ち上がっていく。
それが特に目立つ場合は、「レベルの高いレース」として認められる。

レベルの高いレースを前もって予測できるようならいいのだが、なかなかそうもいかない。
指数の高い馬が集まれば、そうなるのかどうかは別にして、まるで登竜門のような 出世レースがある
のも確かだ。

ところが、どのレースがレベルが高いレースだったのかを知ることも意外と難しい。
TARGET などで検索するのも一つの方法だが、これを自在にできる人は少ないようだ。
自分の場合は、出走表の過去走でマークするようにしているが、 TARGET用のレースID を出力する
スクリプトに応用してみた。以下。

#!/usr/bin/perl -w
# ★ の部分は、環境に応じて修正

use strict ;

my $pass = 'H:/DATA/SE_DATA' ;      # ★ TARGET のSE_DATA パス
my $outF = 'TEST301.txt' ;          # ★ 出力ファイル名

my $bgn = 2001 ;            # ★ 成績データ取得の最初の年を決める( 適当に )
my $end = 2006 ;            # ★ 成績データ取得の最後の年
my $kako = 20050000 ;       # ★ 出力データはいつまで( yyyymmdd で指定 )
my $tosu = 3 ;              # ★ 勝ち馬の頭数を指定
my $ksuu = 3 ;              # ★ 対象レース数を指定
# ------------------------------------------------------------------------
my %alls ;
my %rid ;

for my $year ( $bgn .. $end ) {
    my @files = grep { -e } glob "$pass/$year/SU*.IDX" ;
    for my $file ( @files ) {
        my $kai = substr ( $file, -6, 1 ) ;
        my $jo = substr ( $file, -5, 1 ) ;
print "$year $kai $jo \n" ;         # for DBG
        open DAT, $file or die "Can't Open $file \n" ;
        while ( <DAT> ) {
            chomp ;
            next unless /^\d/ ;
            my ( $mmdd, $nch, $rn, $ucd, $chak ) =
                unpack '@0 A4 @4 A1 @5 A2 @10 A8 @64 A2', $_ ;
            my $line = join '', $year, $mmdd, $jo, $kai, $nch, $rn, $chak ;
            push @{$alls{$ucd}}, $line ;
        }
        close DAT ;
    }
}

# --------------------- ここまでが取得 -- これから処理 -------------------
foreach my $cd ( sort keys %alls ) {
    my @allse = @{$alls{$cd}} ;
    my $num = $#allse ;
    next unless $num > 0 ;               # 戦歴が1回しかなければパス
    my @sorted = sort { substr( $b, 0, 8 ) <=> substr( $a, 0, 8 ) } @allse ;
    foreach my $i ( 0 .. $num-1 ) {
        my ( $yymmdd, $etc, $chak ) = unpack 'A8A5A2', $sorted[$i] ;
        last if $yymmdd < $kako ;
        next unless $chak == 1 ;        # 一着以外はパス
        my $ad = $i + $ksuu ;
        my $nun = $num > $ad ? $ad : $num ;
        foreach my $j ( $i+1 .. $nun ) {
            my ( $ymd, $jo, $knr, $chkk ) = unpack 'A8A1A4A2', $sorted[$j] ;
            my $yy = substr( $ymd, 2, 2) ;
            $jo = $jo eq 'A' ? 10 : sprintf "%02d", $jo ;
            my $raceID = join '', $jo, $yy, $knr ;
            $rid{ $raceID }++ ;
            last if $chkk == 1 ;
        }
    }
}
# --------------------- ここまでが処理 -- これから出力 -------------------
open OUT, ">$outF" ;
while ( my ( $k, $v ) = each %rid ) {
    print OUT "$k\n" if $v >= $tosu ;
}
close OUT ;

__END__

# 2006.03.01	test301.pl
# レベルが高かったと推測される過去のレースを抽出する。raceID で出力。
# raceID 場(jo:2)年(yy:2)回(kai:1)日(nch:1)RNo.(rn:2)... 旧
# 
# そのレース後3戦以内に勝った馬が何頭いるかで判断。
# 障害含む全レース。地方・海外のデータは除外。
# ( 3頭も勝てば上等だと思うが )頭数を指定。クラスは考慮していない。
# 使う場合は当然、クラスで分岐させなければ意味がない。
# 但し、一頭で何回か勝っても一回に計算している。変更は簡単。
# 一着になったレースから、あれば( 指定して )3戦遡って調べている。

出力したレースIDをTARGET で検索する時に読み込めば、候補レースが出力対象になる。
これで、大体の様子を知れば後はアタマを使って工夫。

レースIDなども、自分の出力表用に書き換えれば応用範囲がいくらでも広がる。


このレースID を使って、TARGET でレース印を表示させるようにするのは簡単だけど、クラス別
に表示しないと意味が無い。
クラスを未勝利、500万、1000万、とかに分けて表示させれば少なくとも過去のレースを検討
する場合には役に立つ。
上のスクリプトの設定条件を厳しくすれば更に高レベルのレースも表示させることが出来るので、
レベルも2段階くらいにしたほうがいいかもしれない。

レース印をつけるときは、コースを芝、ダートだけにしておいて着順範囲は1着 だけでいいので、
そのまま検索実行させて、レースIDリストファイルにチェック入れて実行。

処理が終了して、表示されたら「クラス」から指定したい条件クラスをスペースキーで選択すると
別画面になる。 ⇒ 「編集(E)」メニューの「レース印の一括設定」から印を指定すればOK。



8. コマンドプロンプト画面のトラブルを回避

どこかで説明したような気がするけれど、質問があったので、、

pycron で、オッズを自動処理するときにコマンドプロンプト画面が突然出現するのはイイとしても
ソコにカーソルがあって、たまたまクリックしてしまうとスクリプトが止まってしまう。
煩わしいので、ナントカできないか?ということでした。

正しい方法は多分あるのだろうが、自分の場合は以下の方法でトラブルを回避しています。
まず、SGET.pl に以下の行 ( sleep 15 ; ) を追加。

END {
	sleep 15 ;
	&jv_close ;
	print "\tJVClose 完了。\n" ;
}

すると、消える前に15秒間だけ画面が眠ってくれる。
そこで、コマンドプロンプト画面の上枠にカーソルを持っていき右クリックし、
[プロパティ]を選択する。
現われた画面の中のオプションの[編集オプション]の[簡易編集モード]と[挿入モード]
のチェックを外して[OK]
プロパティの適用画面で、[同じタイトルのウィンドウに適用する]に
チェックを入れて[OK]
画面の寝ている15秒の間に作業をするわけです。

最後に、SGET.pl に追加した行を削除 or コメントアウト(#)してください。
これで以後、画面内でクリックしても何も起こらなくなります。

それと、ダウンロードのときに5〜20秒間動作が止まることがあります。
なんとなく5秒単位という気がしますが、どうなんでしょう。
サーバー側からエラーコードを返してきている場合もありますが、この辺の処理やデータの
保存フォルダを変更した SGET.pl (と JVOPT.pl )を出しておきました。
以前のものと比較して参考にしてください。

VB.NET には、しばらく触る気がしないのでコレでお茶を濁そうかというのが本音。


INDEXへ トップページへ 次へ