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

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

DBへCSVをインポートするツールを作っている その4 - Rubyスクリプト作ってる

how-to-make-stock-trading-system.dogwood008.com

これの続き。先に入力とその実行結果から紹介する。こんな感じでお手軽にパースできる。実際にCSVを覗いてはじめてわかったが、HyperSBIからエクスポートした歩み値CSVには、秒データが入っていないんだね……

サンプル

入力

require './sbi'
sbi = Sbi.new('7974_2021-09-09.csv')
sbi.each_line { |r| p r}

実行結果

(前略)
["2021-09-09T09:00:00+0900", 100, 54450]
["2021-09-09T09:00:00+0900", 100, 54460]
["2021-09-09T09:00:00+0900", 100, 54530]
["2021-09-09T09:00:00+0900", 47800, 54470]
=> [516, nil]

ソースファイル

# csv_base.rb

require 'csv'

class CsvBase
  def initialize(file_path)
    @file_path = file_path
  end

  def each_line
    open(@file_path, 'r') do |f|
      CSV.foreach(@file_path,
          headers: header?, encoding: encoding) do |row|
        yield(parse(row))
      end
    end
  end

  def parse(row)
    raise NotImplementedError
  end

  # @params [CSV::Row] row
  def datetime(row)
    raise NotImplementedError
  end

  # @params [CSV::Row] row
  def volume(row)
    raise NotImplementedError
  end

  # @params [CSV::Row] row
  def price(row)
    raise NotImplementedError
  end

  private

  def header?
    raise NotImplementedError
  end

  def encoding
    'utf-8'
  end
end
# sbi.rb

require './csv_base'
require 'time'

class Sbi < CsvBase
  def header?
    true
  end
  
  def encoding
    'sjis:utf-8'
  end

  def parse(row)
    [datetime(row), volume(row), price(row)]
  end

  # @params [CSV::Row] row
  def datetime(row)
    "#{date(row)}T#{time(row)}"
  end

  private

  # @params [CSV::Row] row
  def date(row)
    Time.strptime(row['日付'], '%Y%m%d').strftime('%Y-%m-%d')
  end

  # @params [CSV::Row] row
  def time(row)
    Time.strptime(row['時間'], '%H%M').strftime('%H:%M:00+0900')
  end

  def volume(row)
    row['出来高'].to_i
  end

  def price(row)
    row['約定値'].to_i
  end
end

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