AUTO TRADE/자동 매매 프로그램

[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (3) - 상하한가 계산 함수 생성하기

지난 게시글에서 호가가격단위 미만 절사를 적용하는 함수를 구현했으니, 이번에는 전달받은 종목코드를 기반으로 시장을 구분하고 그 시장 구분에 따라 각기 달리 적용되는 가격 범위 내에서 각기 다른   measure  값을 전달하도록 하는 함수를 구현해보도록 하자. 

 

 

이번에 생성할 함수는 종목코드와 전일 종가(이하 기준 가격) 데이터를 받아온 후에 그 데이터를 기반으로 코스피와 코스닥 등의 시장 구분을 하고, 시장 구분에 따라 각기 다른 함수를 적용하여 상하한가를 계산하는 함수이다.

def cal_limit(self, item_code, yclose):
yclose = int(yclose)
price_range = float(yclose * 0.3)

가장 먼저   cal_limit  이라는 이름의 함수를 생성한 후, 그 인자로   item_code(종목코드)  와   yclose(전일 종가, 기준 가격)  을 받아오도록 하자. 그 후에   yclose  변수의 자료형을 숫자형으로 변경해주고, yclose에 0.3을 곱한 값(가격제한폭)을   price_range  변수에 입력하자. 각 값들의 호가가격단위 미만 절사는 아직 적용하지 않은 상태이다.

여기서 호가가격단위 미만 절사를 적용하는 순서는 ①가격제한폭, ②상하한가의 순서로 적용하게 된다. 아직 상하한가 계산의 로직이 잘 이해가 가지 않는다면 상하한가 계산 로직 게시글을 다시 보고 오자.

이제 가격제한폭에 대한 호가가격단위 미만 절사를 적용하기 전에 앞서, 호가가격단위는 시장에 따라 적용되는 값이 다르므로 해당 종목코드 변수(  item_code  )가 어떤 시장에 속한 종목인지를 구분해주자.(Line 6, 10)

def cal_limit(self, item_code, yclose):
yclose = int(yclose)
price_range = float(yclose * 0.3)
## 코스피 종목의 상하한가 계산..
if item_code in self.kospi_code_list:
pass
## 코스닥 종목의 상하한가 계산
elif item_code in self.kosdaq_code_list:
pass
else:
set_logging.log.error(f"※※※ [{item_code}]가 코스피 및 코스닥 종목 정보에 없습니다.")

 

 

이제 해당 종목이 코스피 종목인지 코스닥 종목인지 구분했다면, 코스피와 코스닥에 대해 각기 다른 기준이 적용되는 호가가격단위 미만 절사 기능을 구현해줘야 한다. 각 시장에 대응하는 함수 이름은 코스피는   def kospi_price_range(self, price):  , 코스닥은   def kosdaq_price_range(self, price):  로 하였다.  

def kospi_price_range(self, price):
price = float(price)
def kosdaq_price_range(self, price):
price = float(price)

 

이제 코스피와 코스닥에 대해 아래의 표와 같은 가격 범위에 따라 각기 다른 호가가격단위를   self.cal_price_range  함수의   measure  인자로 전달해주면 된다.

 

※ Line 4~17, 24~33

def kospi_price_range(self, price):
price = float(price)
if 0 <= price < 1000: ## 1,000원 미만 : 1원 단위로 정수 만들기
return self.cal_price_range(price, 1)
elif 1000 <= price < 5000: ## 1,000원~5,000원 : 5원 단위
return self.cal_price_range(price, 5)
elif 5000 <= price < 10000: ## 5,000원~10,000원 : 10원 단위
return self.cal_price_range(price, 10)
elif 10000 <= price < 50000: ## 10,000원~50,000원 : 50원 단위
return self.cal_price_range(price, 50)
elif 50000 <= price < 100000: ## 50,000원~ 100,000원 : 100원 단위
return self.cal_price_range(price, 100)
elif 100000 <= price < 500000: ## 100,000원~500,000원 : 500원 단위
return self.cal_price_range(price, 500)
elif 500000 <= price: ## 500,000원 이상: 1000원 단위
return self.cal_price_range(price, 1000)
def kosdaq_price_range(self, price):
price = float(price)
if 0 <= price < 1000: ## 1,000원 미만 : 1원 단위
return self.cal_price_range(price, 1)
elif 1000 <= price < 5000: ## 1,000원~5,000원 : 5원 단위
return self.cal_price_range(price, 5)
elif 5000 <= price < 10000: ## 5,000원~10,000원 : 10원 단위
return self.cal_price_range(price, 10)
elif 10000 <= price < 50000: ## 10,000원~50,000원 : 50원 단위
return self.cal_price_range(price, 50)
elif 50000 <= price: ## 50,000원 이상 : 100원 단위
return self.cal_price_range(price, 100)

 

 

 


728x90

 

 

이제 다시   def cal_limit(self, item_code, yclose):  함수로 돌아와서 각 시장에 따라 구분해주었던 조건문 하단에서 ①가격제한폭, ②상하한가 값의 순서로 호가가격단위 미만 절사를 적용하도록 구현하면 된다.
※ Line : 7~12, 16~21

def cal_limit(self, item_code, yclose):
yclose = int(yclose)
price_range = float(yclose * 0.3)
## 코스피 종목의 상하한가 계산..
if item_code in self.kospi_code_list:
price_range = self.kospi_price_range(price_range)
var1 = float(yclose + price_range)
up_price = self.kospi_price_range(var1)
var2 = float(yclose - price_range)
down_price = self.kospi_price_range(var2)
return up_price, down_price
## 코스닥 종목의 상하한가 계산
elif item_code in self.kosdaq_code_list:
price_range = self.kosdaq_price_range(price_range)
var1 = float(yclose + price_range)
up_price = self.kosdaq_price_range(var1)
var2 = float(yclose - price_range)
down_price = self.kosdaq_price_range(var2)
return up_price, down_price
else:
set_logging.log.error(f"※※※ [{item_code}]가 코스피 및 코스닥 종목 정보에 없습니다.")

 

먼저   Line 7~12  의 경우에는   price_range  값을   self.kospi_price_range  함수에 전달함으로써 가격제한폭 값에 대해 호가가격단위 미만 절사를 적용한 후,   var1  에서는 기준값에 가격제한폭을 더하여 상한가를 계산하고, 그 상한가를 다시 동일한 함수에 전달하여 호가가격단위 미만 절사를 적용한 후   up_price  변수에 입력했다. 하한가의 경우에도   var2  에서 기준값에 가격제한폭을 빼서 하한가를 계산하고, 그 하한가를 다시 동일한 함수에 전달하여 호가가격단위 미만 절사를 적용한 후   down_price  변수에 입력했다. 

이제 상하한가 데이터는 단순하게   self.cal_limit(종목코드, 기준가격)  과 같은 형태의 코드 한 줄로 손쉽게 얻어올 수 있게 되었다. 다음 게시글에서 실제 데이터와의 비교를 통해 코드가 정상적으로 동작하는지 확인해보도록 하자.

 

 


728x90
반응형

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

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