PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (2) - 호가가격단위 절사 함수 생성하기

  • -

지난 게시글에서는 주식시장에서 상하한가 데이터가 어떠한 절차로 계산되는지에 대해 살펴보았다. 이번 게시글에서는 그 개념을 함수를 생성하고 함수 내에 계산 로직을 추가하는 등의 기능을 구현함으로써 상하한가 데이터를 자동적으로 계산하도록 할 것이다.

 

 

코스피와 코스닥을 먼저 구분해주자.

코스피와 코스닥을 구분하여 종목코드 리스트를 얻어오는 이유는 단순하다. 해당 종목이 상장된 시장이 코스피인가 코스닥인가에 따라 호가가격단위 미만 절사 기준 금액이 달라지기 때문이다. 실제로 대한민국 증권시장에는 약 2,000개가 넘는 종목이 상장되어 있는데, 다행히도 그 데이터를 매일매일 저장해줄 필요는 없다. 왜나하면 키움증권 Open API 내에서는 코스피 시장에 상장된 종목 리스트와 코스닥 시장에 상장된 종목 리스트를 반환할 수 있는 함수를 제공해주고 있기 때문이다. 이 함수의 사용 방법은 의외로 단순하다.

self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["시장구분코드"])

위의 코드 내에서 "시장구분코드"에 0을 입력하면 코스피에, 10을 입력하면 코스닥에 상장된 종목의 리스트를 조회할 수 있다. 다만 반환된 데이터의 형태는 "005930;066580;000020" 등과 같은 형태로 반환되기 때문에, 이를 ";"를 기준으로 한 칸 한 칸 나누는 함수인   split(";")  을 사용하여 종목코드 하나하나를 리스트로 변형해서 변수에 저장하면 된다. 예를 들면, 아래와 같은 형태가 될 것이다.

kospi_first = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["0"])
self.kospi_code_list = kospi_first.split(";")

즉, Line 1에서는 ["0"]을 전달함으로써 코스피 내 상장되어 있는 모든 종목의 종목코드를 얻어와   kospi_first  에 저장한 후,   kospi_first  를 대상으로   split(";")  을 적용함으로써 종목코드 리스트를   self.kospi_code_list  라는 변수에 입력해주는 것이다. 코스닥 역시 동일한 방식으로 진행하되 ["0"] 부분을 ["10"]으로 적용해서 사용하면 된다.

kospi_first = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["0"])
self.kospi_code_list = kospi_first.split(";")=
kosdaq_first = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["10"])
self.kosdaq_code_list = kosdaq_first.split(";")

그렇다면 여기서의   self.kospi_code_list  와   self.kosdaq_code_list  변수는 언제 생성해야 할까? 프로그램이 실행되고 나서 로그인이 완료된 시점에 사용하면 프로그램이 동작하자마자 코스피와 코스닥의 종목 코드 리스트가 담긴 변수가 자동적으로 생성되는 것과 마찬가지이다. 물론, 특정 함수 내에 해당 코드를 집어 넣어서 특정 함수가 호출되었을 때 실행되도록 수행할 수도 있다.

 

 


728x90

 

 

호가가격단위를 절사한 값을 반환하는 함수 생성하기

이는 이전 게시글에서 살펴봤듯이, 가격범위 별로 서로 다른 호가가격단위를 기반으로 절사한 값을 가져오는 함수를 생성해주면 된다. 주의할 점이 있다면 호가가격단위를 별도의 파라미터로 전달받아 계산하도록 할 것인데, 그 이유는 코스닥인가 코스피인가에 따라 가격절사단위가 다르기 때문이다.

def cal_price_range(self, price, measure):
    pass

이제 해당 함수에서 전달받은   price  와   measure  라는 두 가지 값을 기반으로 우리가 계산해야 할 값을 계산하도록 하면 되는데, 어떤 방법이 가장 간편할까? 물론 다양한 방법들이 있겠지만 본인은 나눗셈에서 나오는 나머지 값을 기준으로 계산했다. 예를 들어,   price   나누기   measure  의 나머지 값이 0이라면 절사를 할 필요가 없고, 나머지 값이 0이 아니라면   price  에서 1을 빼서 다시 계산해보는 것이다.

예를 들어 price 값에 1,052원이라는 값이 전달되면 measure 값으로는 5를 입력해줘야 할 것이다.(1,000원 이상~5,000원 미만의 호가가격단위는 5원이다.) 이 때 1,052원 나누기 5를 하면 나머지는 2가 나오는데, 이 나머지가 0이 될때까지 1,052에서 1을 빼는 계산식을 반복해서 1,050원이 될 때까지 반복하도록 하는 것이다. 여기서 A 나누기 B의 나머지를 구하는 코드는   A % B  이다.

여기서의 반복은 for문을 통해 진행할 것인데,   for i in range(범위 값):  에서 범위 값에는 최대 1000까지만 들어가면 된다. 왜냐하면 가장 큰 호가가격단위는 코스피 시장의 500,000원 이상인 경우로, 1,000원이기 때문이다. 1,000원보다 큰 호가가격단위가 없기 때문에 최대로 반복해도 1,000번만 반복하면 된다.

    def cal_price_range(self, price, measure):

        for i in range(0, 1001):        ## 최대 호가가격단위가 1,000원이니 그렇게 하면 됨
            if price % measure == 0:    ## 나머지가 0이라면
                return price            ## 값을 반환하라.

 

반대로 나머지가 0이 아닌 경우에는 어떻게 해야 할까? 사전에 전달받은   price  값에서 1을 빼서 나머지가 0이 되어 return으로 종료되는 시점까지 계속해서 1을 뺴도록 하면 된다.

def cal_price_range(self, price, measure):

    for i in range(0, 1001):        
        if price % measure == 0:
            return price
        elif price % measure != 0:  ## 나머지가 0이 아니라면
            price = price - 1       ## 1을 빼서 다시 계산하라.

 

이제 호가가격단위 미만 절사를 진행하는 함수를 구현했으니, 다음 게시글에서는 코스피와 코스닥 구분에 따라 달리 적용되는 가격 범위를 생성하고, 해당 가격 범위 내에서 각기 다른   measure  값을 전달하도록 하는 기능을 구현해보자.

 

 


728x90
반응형
Contents

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

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