PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 알고리즘 구축하기 (12) - 매수 예정 종목 데이터프레임 확인하기 ①

  • -

지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다.

 

 

기본적인 방법론

사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다.

예를 들어 아래와 같이   calculator   라는 클래스 내에   add, sub, multiple  이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는   value1  과   value2  라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다.

class calculator:

    def __init__(self, value1, value2):
        self.value1 = int(value1)
        self.value2 = int(value2)
    
    def add(self):
        return self.value1 + self.value2
    
    def sub(self):
        return self.value1 - self.value2
    
    def multiple(self):
        return self.value1 * self.value2

 

이 때 각각의 결과값들을 얻어오는 방법은 아래와 같다.

>>> calculator(1, 2).add()
>>> 3

>>> calculator(1, 2).sub()
>>> -1

>>> calculator(1, 2).multiple()
>>> 2

 

물론 클래스와 함수 간에 변수들을 어떻게 주고 받느냐에 따라 구현해야 할 구조는 달라질 수 있겠지만, 본인은 위의 형태를 가장 선호하고 있는 것은 맞다. 그렇다면 만약에 a와 b를 더한 값에 b를 곱한 값을 반환하도록 하기 위해서는 어떤 구조를 갖춰야 할까? 아래의 코드를 살펴보자.

>>> calculator(calculator(1, 2).add(), 2).multiple()
>>> 6

구조가 너무 복잡해진 게 대충 봐도 보일 정도로 눈에 선하다.

 

그렇다면 우리는 1과 2를 더한 값에 2를 곱하도록 하는 구조를 어떻게 만들어낼 수 있을까? 바로 클래스를 조금 수정해주면 된다. 즉, 아래의 코드와 같이 6번째 줄에서   self.add()  를 실행한 후 해당 결과값을   self.value3  라는 변수에 입력하게 되면   self.value3  에는 3이라는 값이 입력되어 있을 것이다. 그 후에   multiple()  을 사용하면 알아서 self.value3과 self.value2를 곱한 값을 반환하게 되는 것이다.
※ Line : 6, 15

class calculator:

    def __init__(self, value1, value2):
        self.value1 = int(value1)
        self.value2 = int(value2)
        self.value3 = self.add()
    
    def add(self):
        return self.value1 + self.value2
    
    def sub(self):
        return self.value1 - self.value2
    
    def multiple(self):
        return self.value3 * self.value2

 

>>> calculator(1, 2).multiple()
>>> 6

 

 


728x90

 

 

그래서 무슨 말이 하고 싶은 건데?

이제 다시 본론으로 돌아와서 algorithm_1.py 파일의 맨 밑에 위치한   if __name__ == "__main__":  부분을 살펴보도록 하자.   Line 5  에서 그 결과값을 얻어올 수 있다는 것을 어렵지 않게 확인할 수 있는데, 그렇다면 그 코드의 결과값을   result  라는 변수 안에 입력해서 출력해보도록 하자. 

if __name__ == "__main__":
    item_code = "005930"
    start_date = "20220715"
    min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
    algo1(min5_data, start_date).run()

 

아래의 수정 사항을 참고하여 결과 데이터를 확인해보자.
※ Line : 5, 6

if __name__ == "__main__":
    item_code = "005930"
    start_date = "20220715"
    min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
    result = algo1(min5_data, start_date).run()
    print(result)
    
>>>
고가가 갱신되었습니다... 20220715, 20220715090000
저가가 갱신되었습니다... 20220715, 20220715090000
고가가 갱신되었습니다... 20220715, 20220715090500
저가가 갱신되었습니다... 20220715, 20220715090500
                      :
                 (이하 생략)
                      :
(True,    item_code  first_buy_price  second_buy_price
0        NaN          60250.0               NaN)

 

  Line 16, 17  을 통해 현재   result  값이 소괄호인   ()  로 감싸져 있다는 것을 확인할 수 있으며, True라는 값 뒤에 쉼표가 찍혀 있고 그 뒤 부분에 데이터프레임이 딸려오고 있다는 것 역시 확인할 수 있다. 그렇다면   result  부분을   result[0]  과   result[1]  으로 나누어 출력해보자.
※ Line : 6, 7

if __name__ == "__main__":
    item_code = "005930"
    start_date = "20220715"
    min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
    result = algo1(min5_data, start_date).run()
    print(result[0])
    print(result[1])
    
>>>
고가가 갱신되었습니다... 20220715, 20220715090000
저가가 갱신되었습니다... 20220715, 20220715090000
고가가 갱신되었습니다... 20220715, 20220715090500
저가가 갱신되었습니다... 20220715, 20220715090500
                      :
                 (이하 생략)
                      :
True
   item_code  first_buy_price  second_buy_price
0        NaN          60250.0               NaN

 

이제 알고리즘 파일에서 매수 예정 가격 데이터가 올바르게 계산되며 해당 데이터가 데이터프레임에 정상적으로 입력되는 것을 확인했으므로, 이제 다음 게시글에서 이 데이터를 main.py 파일 내에서 어떻게 활용할 수 있는지 살펴보도록 하자.

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.