「Rubyではじめるシステムトレード」のPython版開発4

投稿者: | 2024年1月11日

「Rubyで始めるシステムトレード」を読み進めながら、オリジナルのruby codeのpythonでの記述を進めていたが、随分長い間放置してしまった。2024年再び再開する。rubyからpythonへのコード書き換えの効率を上げるため、ChatGPTを活用する。

コードの変換テストとして、下記のSpeaker.rbをChatGPTでpythonへ変換してみた。

"speak.rb"
class Speaker
    def say(*word)
        puts word
    end
end

speaker = Speaker.new
speaker.say("Good morning")
speaker.say("Hello","How are you?","Good-by")

ChatGPTは、Pythonの可変長引数の表し方を説明しながら、問題なく動くPythonコードを出力してくれた。これはとてつもなく便利ではないか。続いて以下のRubyのコードもChatGPTでPythonに変換してみた。

"stock_list_loader.py"
class StockListLoader:
    def initialize(stock_list_file)
        unless stock_list_file
            raise "Identify the stock list."
        end
        @stock_list = File.readlines(stock_list_file).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], :uint => data[2].to_i}
        end
    end

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

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

    def units
        @units ||= stock_info.map (|info| info[:uint])
    end

    def filter_by_market_section(*sections)
        return self unless sections[0]
        @stock_info = stock_info.find_all do |info| section.include?(info[:market_section])
        end
        self
    end
end

以下が変換されたPythonコードだ。動作テストはまだ行っていないが、それなりのものを出力しているように見える。

"stock_list_loader.rb"
class StockListLoader:
    def __init__(self, stock_list_file):
        if not stock_list_file:
            raise ValueError("Identify the stock list.")
        with open(stock_list_file, 'r') as file:
            self.stock_list = [line.strip().split(",") for line in file]

    @property
    def stock_info(self):
        if not hasattr(self, '_stock_info'):
            self._stock_info = [
                {'code': int(data[0]), 'market_section': data[1], 'unit': int(data[2])}
                for data in self.stock_list
            ]
        return self._stock_info

    @property
    def codes(self):
        if not hasattr(self, '_codes'):
            self._codes = [info['code'] for info in self.stock_info]
        return self._codes

    @property
    def market_sections(self):
        if not hasattr(self, '_market_sections'):
            self._market_sections = [info['market_section'] for info in self.stock_info]
        return self._market_sections

    @property
    def units(self):
        if not hasattr(self, '_units'):
            self._units = [info['unit'] for info in self.stock_info]
        return self._units

    def filter_by_market_section(self, *sections):
        if not sections or not sections[0]:
            return self
        self._stock_info = [info for info in self.stock_info if info['market_section'] in sections]
        return self

元々のRubyのコードをChatGPTでPythonに変換し、動作確認を行いながらコードを修正するという方法が機能しそうだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です