Juliaで株価の取得 (2)直近の株価取得とアラート通知

前回は長期間の株価を取得しましたが,今回は直近の株価を取得し,しきい値に達していたらアラートで通知するようにしてみます.

直近の株価取得

株価取得には前回同様Yahoo! FinanceのAPIを用います.前回のURL作成およびjsonをDataFrameに変換するプログラムは関数化しておきます.

using JSON, DataFrames, Dates
function getstockprice(stock, range="1d", interval="1m")
    # URLの作成
    url = yahoofinurl(stock, range, interval)
    # データ取得・JSON->DataFrameへ変換
    str = read(download(url), String) # urlからjson文字列の取得
    json = JSON.parse(str) # json文字列をパースしてDict型に変換
    df = stockjson2df(json) # JSONからDataFrameに変換
end
stock = "4689.T"
price = getstockprice(stock)

これで株価がDataFrameとしてprice変数に取得できます.


アラートの送信

アラートはメールで送信することとします.前回ご紹介しましたが,Juliaでメールを送るにはSMTPClient.jlを使います.上下限値を指定しておき,それを超過あるいは下回ったら,フラグを立ててメール送信します.
# 上下限値超過を検知して,フラグとメッセージを作成
function checkboundspair(prices, upperlimit, lowerlimit)
    alflag = false
    dtfmt = "YYYY/mm/dd HH:MM:SS"
    # 株価の上下限を検出
    if ( sum(prices."close" .> upperlimit) > 0 )
        alflag = true
        maxprice = string( round(maximum(prices."close"), digits=1) )
        title = "上限超過(" * maxprice * ")"
        dt = prices[argmax(prices."close"), "timestamp"]
        message = "株価が上限を超過しました.\r\n" * 
            "上限値: " * string(upperlimit) * "\r\n" *
            "時刻: " * Dates.format(dt, dtfmt) * "\r\n" * 
            "株価: " * maxprice * "\r\n"
    elseif ( sum(prices."close" .< lowerlimit) > 0 )
        alflag = true
        minprice = string( round(minimum(prices."close"), digits=1) )
        title = "下限未満(" * minprice * ")"
        dt = prices[argmin(prices."close"), "timestamp"]
        message = "株価が下限を下回りました.\r\n" * 
            "下限値: " * string(lowerlimit) * "\r\n" *
            "時刻: " * Dates.format(dt, dtfmt) * "\r\n" * 
            "株価: " * minprice * "\r\n"
    end
    return (alflag, title, message)
end
# 上下限値チェックして,フラグが立っていたらメールを送信する
(alflag, title, message) = checkboundspair(price, 650, 630)
if (alflag)
    sendmail("【株価アラート】" * stock * " : " * title, stock * "の" * message)
end

定期実行

上記のプログラムを定期的に実行するように設定します.平日9:00に起動して,一定間隔で株価をチェックし,15:00に終了するようにしましょう.
あまり頻繁に取得をかけるとIPアドレスでブロックされるようなので,取得間隔は10分くらいとしておきます.
一定間隔で実行する方法として,JuliaではBase.Timerを使う方法などがありますが,今回はシンプルにsleep()を使います.9:00の起動には,Windowsのタスクスケジューラを使います.起動コマンドをスクリプト化して登録します.

stock = "4689.T"
while(true)
    price = getstockprice(stock)
    (alflag, title, message) = checkboundspair(price, 650, 630)
    if (alflag)
        sendmail("【株価アラート】" * stock * " : " * title, stock * "の" * message)
        break
    end
    # 現在時刻が15:00を過ぎたらstop
    dt = Dates.now()
    if (hour(dt) >= 15)
        break
    end
    sleep(600)  # 10分待機
end
rem GetStockPrices.cmd
> cd C:\Julia\株価
> julia GetStockPrices.jl
これでアラートをかけられるようになりました.
checkboundspair()を変更すれば様々なアラートパターンに対応できます.