PYTHON/Kiwoom Open API

키움증권 Open API - 차트 데이터 이어서 조회하기 (2)

  • -

지난 게시글에서는 특정 종목의 종목코드가 if_savepoint 데이터베이스 안에 저장되어 있는지를 판단하는 코드를 제작하였고, 이번 게시글에서 if문과 else문 아래 부분의 코드 제작을 마무리할 예정이다.

if문은 filtered_code 안에 있는 종목이 item_savepoint 데이터베이스 안에 있는 경우이고, else문은 반대로 filtered_code안에는 있지만 item_savepoint 데이터베이스 안에는 없는 종목이다.

 

해당 종목의 날짜 불러오기

일단 filtered_code() 안에 있는 종목이 item_savepoint 데이터베이스에 있는 경우에는 해당 종목 코드와 함께 저장된 저장 일자를 불러와야 한다. 그러기 위해서는 SELECT 명령어와 WHERE 명령어를 함께 사용해서 불러와야 한다. 따라서 이에 대한 함수를 따로 제작(select_data_where 함수)해준 후에, 코드를 제작하도록 하자.

def select_data_where(columns_name, db_name, table_name, wherecol_name, where_data):
	connect = mysql.connector.connect(user='root', password='a9985623', host='127.0.0.1', charset='utf8mb4')
	cur = connect.cursor()

	select_data = "SELECT " + columns_name + " FROM `" + db_name + "`.`" + table_name + "` WHERE `" + wherecol_name + "`='" + where_data + "'"
	cur.execute(select_data)
	result = cur.fetchall()
	return result

 

code_list = trade.filtered_code()
code_list_inDB = posting_mysql.codelist_inDB()
db_data = posting_mysql.select_data('*', 'item_savepoint', 'item_savepoint')

for code in code_list:
	print(code)

	if code in code_list_inDB:
		saved_date = posting_mysql.select_data_where('sv_day', 'item_savepoint', 'item_savepoint', 'code', code)

		print("종목코드:", code)
		print("저장일자:", saved_date[0][0])
		print("최신일자:", latest_date)

		if saved_date[0][0] == latest_date:
			print("종목코드:", code, " 데이터가 최신 데이터입니다.")
		else:
			print("종목코드:", code, " 데이터가 구식 데이터입니다.")
            
	else:
		print("안에 없음")

위 코드 내에서 보면 if code in code_list_inDB: 조건문이 print("안에 있음")을 출력했던 부분이다. 그렇기 때문에 WHERE 명령어가 곁들여 있는 select_data_where 함수에 관련 인자들을 전달해준 후에, 반환된 값을 saved_date에 저장하였다. 그 아래에 있는 세 줄의 print()문을 보면 알 수 있듯이, 현재 조회하고 있는 종목 코드는 code이고 그 종목 코드의 저장되어 있는 일자가 saved_date[0]이며, 현재 시각과 일자를 기준으로 가장 최신의 거래일자는 latest_date이다. 

이에 따라서 그 아래의 if문에서는 saved_date[0]의 값과 latest_date의 값을 비교해서 동일하다면 "최신 데이터"임을, 동일하지 않다면 "구식 데이터"임을 출력하도록 하였다. 그리고 해당 코드를 실행하면 아래와 같은 결과물을 얻을 수 있다.

WorkBench 내에서 확인해본 결과 001040까지는 20210608이 잘 입력되어 있으며 001060에서는 저장일자가 없기 때문에 데이터가 구식이라는 결과값이 출력된 것이다. 이처럼, 저장되어 있는 날짜와 현재 시점의 가장 최신 일자를 비교함으로써 "구식 데이터"라고 출력되는 부분에 한해서 업데이트를 진행하면 되는 것이다. 

 


728x90

 

 

구식 데이터일 경우 차트 조회하기

일단 차트 조회를 하는 방법은 정말 단순하게도, 이전에 여러 번 서술했었다. 따라서 그냥 그 코드 내용들을 그대로 불러와서, 위에서 제작한 코드 중 "구식 데이터"라고 출력되는 부분의 하단부에 입력해주면 된다. 

if saved_date[0][0] == latest_date:
	print("종목코드:", code, " 데이터가 최신 데이터입니다.")
else:
	print("종목코드:", code, " 데이터가 구식 데이터입니다.")

	trade.rq_chart_data(code, latest_date, 1)
	df_day_data = pandas.DataFrame(trade.day_data, columns=['date', 'open', 'high', 'low', 'close', 'volume', 'trade_volume'])
	print(df_day_data)
	df_day_data.to_sql(name="s" + code, con=engine_all, index=False, if_exists='replace')
	print("종목코드:", code, "  데이터베이스에 저장되었습니다.")

	posting_mysql.update_data('item_savepoint', 'item_savepoint', 'sv_day', latest_date, 'code', code)

즉, 구식 데이터라고 출력된 경우에는 rq_chart_data라는 함수에 code와 latest_date, 1 이라는 세 개의 인자를 전달해주고 그로 인해 발생한 결과 데이터를 DataFrame으로 만들고, 그 DataFrame 형태의 차트 데이터를 to_sql을 통해 name=s000000과 같은 형태로 데이터베이스에 저장해주는 것이다. 그 후에 데이터베이스에 저장되었음을 출력하도록 한 후에는, update_data 함수를 통해 item_savepoint 데이터베이스의 sv_day 칼럼에 latest_date를 입력해주는 것이다.  

그러면 우리가 위에서 살펴본 결과값에 따르면, 이제 이 코드를 실행하게 되면 종목코드 001060이라는 종목에 대해 "구식 데이터"임이 출력되고 나서 차트 데이터를 조회하고, "종목코드:001060 데이터베이스에 저장되었습니다."라는 결과물이 출력되어야 할 것이다. 즉, 가장 최근에 저장한 종목 코드가 001040이므로 이제는 001060부터 차트 데이터 조회를 요청하는 것이다. 그러면 한 번 실행해보도록 하자.

종목코드: 001040
저장일자: 20210608
최신일자: 20210608
종목코드: 001040  데이터가 최신 데이터입니다.

종목코드: 001060
저장일자: None
최신일자: 20210608
종목코드: 001060  데이터가 구식 데이터입니다.
          date   open   high    low  close volume trade_volume
0     20210608  29000  29650  29000  29350  71907         2115
1     20210607  29050  29300  29050  29050  43400         1265
2     20210604  29050  29250  28900  29050  35218         1023
3     20210603  29150  29350  29000  29200  39710         1160
4     20210602  29300  29300  28800  29300  45501         1323
...        ...    ...    ...    ...    ...    ...          ...
9634  19850109   2146   2161   2146   2161   9980            1
9635  19850108   2208   2208   2111   2111   3447            0
9636  19850107   2208   2211   2208   2208   3928            0
9637  19850105   2246   2246   2246   2246      0            0
9638  19850104   2280   2280   2280   2280    922            0

[9639 rows x 7 columns]
종목코드: 001060   데이터베이스에 저장되었습니다.

종목코드: 001070
저장일자: None
최신일자: 20210608
종목코드: 001070  데이터가 구식 데이터입니다.

저장일자에 20210608이 없음이 확인되자 새롭게 데이터를 조회하는 모습을 확인할 수 있고, 데이터베이스에 저장되었다는 문구도 잘 출력된다는 것을 확인할 수 있다. 그렇다면 이제 WorkBench 내에서 해당 데이터를 확인해보도록 하자.

파이참 내에서 001200에 대한 처리가 완료되었다고 출력

 

WorkBench에서 확인해본 결과 일봉 데이터가 잘 저장되어 있고, 저장 일자가 20210608로 정확히 입력되어 있음

잘 조회되고 잘 저장되는 모습을 확인할 수 있다. 

else: 부분의 경우에는 해당 종목 코드가 item_savepoint 데이터베이스에는 없지만 filtered_code() 함수에는 있는 것으로 보아, 우리가 item_savepoint 데이터베이스를 만든 이후에 새롭게 상장된 종목이라는 것을 유추해낼 수 있다. 따라서 else:문 아래에는 앞서 제작했던 코드들을 참고해서 item_savepoint 데이터베이스에 해당 종목 코드를 입력해주고, 위에서 제작했던 것과 같이 일봉 차트 데이터를 조회하고, to_sql을 통해 저장하고, item_savepoint에는 저장 일자를 입력하는 방식으로 작성해주면 된다.

이제 차트 데이터를 이어서 조회하고 저장하는 방법에 대한 포스팅은 마무리해도 될 것 같다. 추가적으로 분봉 데이터를 조회한다거나 할 때에도 마찬가지로 item_savepoint 내에서 sv_day가 아닌 sv_3min 등과 같은 칼럼을 만들어주고, 이전에 제작해두었던 check_db 함수를 통해 day_data가 아닌 min3_data와 같은 데이터베이스를 생성해준 후에 해당 데이터베이스 내에는 3분봉 데이터를 저장하고 sv_3min에는 3분봉 데이터가 저장된 일자를 입력하는 등의 방식으로 제작하면 된다.

 

 


728x90
반응형
Contents

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

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