RLTrader의 환경 모듈 개발

2020-03-30 • rltraderstock, 주식투자, reinforcement learning, rl, 강화학습, environment, 환경 • 2 min read

환경 모듈에 포함된 Environment 클래스의 속성과 함수를 살펴보고 파이썬으로 구현한 소스 코드를 상세히 확인합니다.

환경 모듈의 주요 속성과 함수

환경 모듈(environment.py)은 투자할 종목의 차트 데이터를 관리하는 작은 모듈입니다. 환경 모듈에는 환경 클래스(Environment)가 있습니다. 환경 클래스의 주요 속성 및 함수는 다음과 같습니다.

속성

  • chart_data: 주식 종목의 차트 데이터
  • observation: 현재 관측치
  • idx: 차트 데이터에서의 현재 위치

함수

  • reset(): idx와 observation을 초기화
  • observe(): idx를 다음 위치로 이동하고 observation을 업데이트
  • get_price(): 현재 observation에서 종가를 획득

코드 조각: 환경 클래스

다음은 환경 클래스(Environment)의 전체 소스 코드를 보여줍니다.

Environment 클래스

class Environment:
    PRICE_IDX = 4  # 종가의 위치

    def __init__(self, chart_data=None):
        self.chart_data = chart_data
        self.observation = None
        self.idx = -1

    def reset(self):
        self.observation = None
        self.idx = -1

    def observe(self):
        if len(self.chart_data) > self.idx + 1:
            self.idx += 1
            self.observation = self.chart_data.iloc[self.idx]
            return self.observation
        return None

    def get_price(self):
        if self.observation is not None:
            return self.observation[self.PRICE_IDX]
        return None

    def set_chart_data(self, chart_data):
        self.chart_data = chart_data

환경 클래스 생성자에서 관리할 차트 데이터를 할당합니다. 여기서는 차트 데이터 chart_data를 입력으로 받아서 객체 내의 변수인 chart_data로 저장해 줍니다. 차트 데이터에서 현재 위치의 관측 값이 observation에 저장될 것입니다. 현재 위치는 idx에 저장됩니다.

파이썬 팁: 파이썬 클래스의 생성자 __init__()는 클래스의 객체가 생성될 때 자동으로 호출되는 함수입니다. 보통 이 함수에서 입력으로 받은 값들을 객체 내의 변수로 할당합니다.

차트 데이터(chart_data)는 2차원 배열이라고 생각하면 됩니다. RLTrader에서는 이러한 2차원 자료 구조를 효과적으로 처리하기 위해 Pandas의 DataFrame 클래스를 사용합니다. DataFrame의 사용법 등의 내용은 필요할 때마다 소개하겠습니다.

observe() 함수에서 하루 앞으로 이동하며 차트 데이터에서 관측 데이터(observation)를 제공합니다. 더 이상 제공할 데이터가 없을 때는 None을 반환합니다.

파이썬 팁: len() 함수는 파이썬 내장 함수로 문자열, 리스트 등의 길이를 반환합니다.

차트 데이터의 전체 길이보다 다음 위치가 작을 경우 가져올 데이터가 있다는 뜻이고 이 경우 현재 위치 idx에 1을 더하고 차트 데이터에서 이 위치의 요소를 가져옵니다.

파이썬 팁: iloc() 함수는 DataFrame 함수로 특정 행의 데이터를 가져옵니다.

reset() 함수는 다시 차트 데이터의 처음으로 돌아가게 합니다. 즉, 현재 위치 idx를 -1로, observationNone으로 초기화합니다.

get_price() 함수에서는 관측 데이터로부터 종가를 가져와서 반환합니다. 종가 close의 위치가 5번째 열이기 때문에 0부터 시작하는 인덱스인 PRICE_IDX 값은 4입니다. observation은 하나의 행이고 여기서 인덱스 4의 값인 observation[4]가 종가에 해당됩니다.