DEVGRU

プログラミングと競馬予想について書きます

競馬予想を始めた

まだ仮想通貨の取引の痛手が残っていて株取引はできていない(SBIに口座を開設しただけ…)。

それはさておき、最近興味があったが応用先のない機械学習の知識がついに役に立つ分野が見つかった。競馬だ。

無料で手に入る多数のパラメータがあり、結果がはっきりしていて、しかもリターンが金銭的に入ってくる。

以下の記事を参考に、 netkeiba.com のデータを用いてLigthGBMで学習をしている。

cocon-corporation.com cocon-corporation.com

また、以下の書籍を参考にして精度を向上している。

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

さらに、LightGBMによる予想をもとに馬券の買い方をさらに最適化することで、よりよい収益を得られるように工夫している。

現在、2019年の重賞を対象にした予想で、シミュレーションによる収支は179%となっており、まずまずの予想である。

計算環境は手元のMacBook Air 2014で行っていたが、さすがに時間がかかるのでAWSのt3.2xlargeインスタンスを都度立てて計算している。

予想結果は週次でnoteに公開していく予定なので、興味のある人はぜひ購入してみてほしい。

追記:

今週の結果を以下に投稿しました。

note.mu

追記2:

今晩にでも、2019年1月からの過去レースの結果をnoteに投稿します。 計算ミスとかしていないだろうな俺…

追記3:

過去レースの結果をnoteに投稿しました。 大きな計算ミスはなかった模様。noteはMarkdownで書けないの辛い。

note.mu

raven-js はもう使わないほうがいい

仕事で Sentry を使っているが、 そのライブラリ raven-js はもう死んでいるという話。

github.com

ここを見ると、以下のように書いてある。

raven-js: Our old stable Javascript SDK, we still support and release bug fixes for the SDK but all new features will be implemented in @sentry/browser which is the successor.

新機能が使いたければ @sentry/browser を使用してください、とのこと。

(死んでいる、は言いすぎか)

実際に置き換えたが、タグなどのインタフェースが少し変わるものの、それほど大きく変わることはないようだ。

Python と pypetteer で某所から株価を無料で取得する

結局、仮想通貨は逃げるタイミングが遅れてとんでもない負債を私に残していったので、 ボラリティは低いが安定している株取引を粛々とすることにした。

さて、株取引の自動化は厳しいが、せめて売買のタイミングぐらいは自動的に分かるようにしておきたい。

幸い、無料で株価履歴を公開しているサイトがあるので、そこから自動取得するようにしてテクニカル指標を求めるようにすることにした。

import os
import asyncio
import time

from pyppeteer import launch

import pandas as pd
import matplotlib.pyplot as plt

async def scrape(browser, url):
    page = await browser.newPage()
    await page.goto(url)
    await page.waitFor('tr')
    elements = await page.JJ('tr')
    
    result = []
    for element in elements[1:]:
        values = (await element.getProperty('textContent')).toString().split()[1:]
        date, o, h, l, c, volume, _ = values
        result.append([date, int(o), int(h), int(l), int(c), int(volume)])
    return result

async def main():
    browser = await launch()
    stock_id = 3341
    result2017 = await scrape(browser, f'https://kabuoji3.com/stock/{stock_id}/2017/')
    result2018 = await scrape(browser, f'https://kabuoji3.com/stock/{stock_id}/2018/')
    result = result2017 + result2018
    await browser.close()
    
    print(result)
    
asyncio.get_event_loop().run_until_complete(main())

stock_id を適当な銘柄番号にすると2017/1/1〜の日付、OHLC, Volumeが取得できます。