株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

サービス・技術調査 - WebDAV

概要

KABU+で提供されるCSVは、WebDAVを使用することによりAPIの呼び出し制限回数にかかわらず呼べるようになる。

ここでは、WebDAVを使って、RubyでCSVを取得するサンプルを紹介する。

Rubyを選んだ理由

Rubyを選んだのは、著者が好きな言語であるからだが、もし Lambda (AWS) or Cloud Functions (GCP) に載せるなら、必ずしも最善の選択ではないかもしれない。

今回は著者自身が、「最も早く動作を検証できる」言語として採用したが、最初から Lambda or Cloud Functions が必須ならば、素直に Python or Node.js で書いた方が良いと思う。

ソースコード

ここでは、動作試験の為に用意されているエンドポイントへ接続する。 ID、パスワード、URLは、KABU+の接続ツールで提供されるファイル中の mount_CSVEX-WebDAV.vbs に記載のものを使った。ここでは具体的な値の明記を避ける。

main.rb

# main.rb
# frozen_string_literal: true

require 'net/dav'


ID = '(テスト用ID)'
PW = '(テスト用パスワード)'
URL = '(テスト用エンドポイント)'

dav = Net::DAV.new(URL)
dav.credentials(ID, PW)

dav.find('./japan-all-stock-prices.csv', :recursive => false) do |item|
  puts item.uri
  puts item.content.encode!(Encoding::UTF_8, 'Windows-31J')
end

Dockerfile

# Dockerfile
FROM ruby:2.7.2-alpine
LABEL maintainer="dogwood008"

ARG tmpdir=/tmp
ARG appdir=/app

COPY Gemfile $tmpdir
COPY Gemfile.lock $tmpdir
ENV TZ=Asia/Tokyo

WORKDIR $tmpdir

RUN apk update && \
    apk add --no-cache tzdata libxml2-dev curl-dev make gcc libc-dev g++ libxslt-dev && \
    bundle config build.nokogiri --use-system-libraries && \
    bundle install && \
    rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* && \
    apk del curl-dev make gcc libc-dev g++

WORKDIR $appdir

CMD ["/bin/sh"]

実行結果

/app # ruby sample.rb
https://(テスト用ホストとパス)/japan-all-stock-prices.csv
"SC","名称","市場","業種","日時","株価","前日比","前日比(%)","前日終値","始値","高値","安値","出来高","売買代金(千円)","時価総額(百万円)","値幅下限","値幅上限"
(以下略)

今後の筆者の課題

  • 必要に応じて Lambda (AWS) or Cloud Functions (GCP) で動かすことを検討する
    • Ruby では重いので、 Python or Node.js での書き直しが必要か
  • パスの一覧はサンプルからではわからないので、一覧の作成が必要

余談

今回、 alpine のイメージを使ったが 77.4MB とかなり小さいイメージを作れた。

libxml2-devlibxslt-dev も削除できるとさらに小さくできたが、 net_dav が依存する nokogiri がビルド時だけではなく実行時にも依存していたので、消すことはできなかった。

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.