『Rubyではじめるシステムトレード』第4章~第6章 学習記録

Rubyではじめるシステムトレード (現代の錬金術師シリーズ)

Rubyではじめるシステムトレード (現代の錬金術師シリーズ)

序文

Rubyではじめるシステムトレード』2日目。

参考書を勉強していく感覚懐かしいですね。
やっぱり知らないこと、知りたいことを勉強していくのは楽しいです。

もうちょっといろいろインプットの時間をとれればいいんですが…。

進捗

  • 第2部 データ編
    • 第4章 株クラス
    • 第5章 銘柄リストを作る
    • 第6章 銘柄リストを読み込む

(学習時間:6時間)

GitHub

github.com

コード実装部分(一部)

RubySystemTrade\trade_simulator\lib\stock_list_loader.rb

# coding: Windows-31J

class StockListLoader
    def initialize(stock_list_file)
        unless stock_list_file
            raise "銘柄リストを指定してください"
        end
        @stock_list = File.readlines(stock_list_file, encoding: "utf-8:sjis").map do |line|
            line.split(",")
        end
    end

    def stock_info
        @stock_info ||= @stock_list.map do |data|
            {:code => data[0].to_i, :market_section => data[1], :unit => data[2].to_i}
        end
    end

    def codes
        @codes ||= stock_info.map{|info| info[:code]}
    end

    def market_sections
        @market_sections ||= stock_info.map{|info| info[:market_section]}
    end

    def units
        @units ||= stock_info.map{|info| info[:unit]}
    end

    def filter_by_market_section(*sections)
        return self unless sections[0]
        @stock_info = stock_info.find_all do |info|
            sections.include?(info[:market_section])
        end
        @codes = stock_info.map{|info| info[:code]}
        @market_sections = stock_info.map{|info| info[:market_section]}
        @units = stock_info.map{|info| info[:unit]}
        self
    end
end

実行結果

割愛

感想

今日は東証に上場されている企業のデータ(企業コード・市場・最小単元数)を取得してくるという内容。
堂々とヤフーファイナンススクレイピングしてきましょうってこととその方法が書いてあってとってもロック。

5年前の本とはいえ、当時でもさすがにスクレイピングはアウトだと思うんだが…

ぼくはいいこなので別の方法で企業データを取得しました。

ちなみにこの本では企業名すら取得する必要はないそうです。ロックンロール。

当然、書籍と違う方法になる部分は自力で実装しなければならない。
とはいえ、正規表現とかでデータ抽出するのに比べればまだ楽だったような気もする。
つーかこれプログラミング初心者絶対無理だよー。
坂本めっちゃワンライナーするやん半端ないってー。

コマンドプロンプトスクリプトを動かすので、毎度のことながら文字コードがらみで大苦戦。
最初はちゃんとUTF-8で頑張っていたのだけれど、最終的に観念して「# coding: Windows-31J」する。

ところで上にあげたのは第6章の銘柄リストを読み込む部分のコードなのだけど、最後の三行

        @codes = stock_info.map{|info| info[:code]}
        @market_sections = stock_info.map{|info| info[:market_section]}
        @units = stock_info.map{|info| info[:unit]}

は元のコードにはなくて書き足した部分。

元のコードのままだと、@stock_infoを更新しても@codes,@market_sections,@unitsが更新されないような気がするのだが、私の理解がなにか間違っているのだろうか。
実際テストコードも正しく動作しなかった。

ここが誤植かどうかはあまり確信はないが、それ以外の場所でも割と誤植と思しき箇所が散見されるのがちょっと残念。

カロリーメイトいらない。

参考サイト

【Ruby】irbで日本語入力ができない|文字化けする時の対処法 - クリアメモリ

異なるエンコーディングでのファイル書き出しと読み込み - Qiita

【Ruby】よく使うFileクラスを使ったファイル読み込み処理 - Qiita

split (String) - Rubyリファレンス

Ruby で文字列が数字だけで構成されているか判定する (簡易ユニットテスト付き) - Qiita

Ruby: ファイルから1行/段落ごと読み込む(入力する)には? - Build Insider

encode, encode! (String) - Rubyリファレンス

[https://code-examples-ja.hateblo.jp/entry/2014/09/16/Ruby|%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%82%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC:title] 貼れない!?

Rubyのエンコーディング - @tmtms のメモ