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