10장 1)~3)까지 정리
앞으로 다루게 될 클래스의 대다수는 CpUtil에서 나옴
이번에 다루는 것은 CpUtil 중에서도 CpCybos에 대한 이야기
import win32com.client
instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
print(instCpCybos.IsConnect)
import win32com.client
instCpStockCode = win32com.client.Dispatch("CpUtil.cpCybos")
print(instCpStockCode.GetCount())
GetCount 함수를 통해 상장된 주식의 갯수를 확인할 수 있다.
import win32com.client
instCpStockCode = win32com.client.Dispatch("CpUtil.CpStockCode")
print(instCpStockCode.GetData(1, 0))
GetData 함수는 각 인덱스에 해당하는 종목에 대한 데이터를 얻기 위해 사용하며
첫번째 인자의 값이 0이면 종목 코드, 1이면 종목명, 2면 FullCode를 받게 된다.
import win32com.client
instCpStockCode = win32com.client.Dispatch("CpUtil.CpStockCode")
naverCode = instCpStockCode.NameToCode('NAVER')
naverIndex = instCpStockCode.CodeToIndex(naverCode)
print(naverCode)
print(naverIndex)
원하는 종목명의 데이터를 가져오기 위해서 NameToCode라는 함수가 따로 존재한다.
CpCodeMgr 클래스는 각종 코드 정보 및 코드 목록을 구하는 데 사용됨.
import win32com.client
instCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
codeList = instCpCodeMgr.GetStockListByMarket(1)
print(codeList)
메서드의 인자로 1을 전달하면 유가증권시장의 종목을 파이썬 튜플 형태로 반환받을 수 있다.
import win32com.client
instCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
codeList = instCpCodeMgr.GetStockListByMarket(1)
kospi = {}
for code in codeList:
name = instCpCodeMgr.CodeToName(code)
kospi[code] = name
import win32com.client
instCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
codeList = instCpCodeMgr.GetStockListByMarket(1)
kospi = {}
for code in codeList:
name = instCpCodeMgr.CodeToName(code)
kospi[code] = name
f = open('c:\\Users\\Jason\\Desktop\\kospi.csv', 'w')
for key, value in kospi.items():
f.write("%s,%s\n" % (key, value))
f.close()
GetStockListBtMarket 리스트에는 ETF와 ETN이 존재함.
CpCodeMgr 클래스를 보면 GetStockSectionKind 메서도그 존재하기 때문에 이 메서드를 이용하면 어떤 종목이 주권인지 ETF인지 ETN인지 화인 가능
유가증권시장의 종목에 대해 인덱스, 종목 코드, 부 구분 코드, 종목명을 구할 수 있다. 이때 우리가 필요한 부 구분 코드는 1번이 주권, 10번이 ETF, 17번이 ETN이다.
import win32com.client
instCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
codeList = instCpCodeMgr.GetStockListByMarket(1)
for i, code in enumerate(codeList):
secondCode = instCpCodeMgr.GetStockSectionKind(code)
name = instCpCodeMgr.CodeToName(code)
print(i, code, secondCode, name)
Request/Reply 방식으로 작동하며 Request로 사용자가 어떤 정보를 얻고자 할 때 얻으려는 정보가 무엇인지를 정확히 알려준 후 요청하면 CYBOX Plus가 이에 대한 답을 돌려주는(Reply) 방식을 의미
맨 처음에 해야하는 일은 어떤 데이터를 원하는지 정확히 알려주는 일이다. 그래서 CySysDib 클래스의 SetInputValue 함수를 호출하여서 원하는 데이터를 요청(request) 하여야 한다.
instStockChart.SetInputValue(0, "A003540")
instStockChart.SetInputValue(1, ord('2'))
instStockChart.SetInputValue(4, 10)
instStockChart.SetInputValue(5, 5)
instStockChart.SetInputValue(6, ord('D'))
instStockChart.SetInputValue(9, ord('1'))
첫 번째 인자는 입력 데이터 타입을 의미, 두 번째 인자는 입력 데이터 값을 의미
SetInputValue(0, "A003540") : 0은 종목 코드를 의미 A003540은 조회하려는 종목의 코드값을 의미
SetInputValue(1, ord('2')) : 1은 기간으로 요청함 ord(2)는 갯수를 요청함(문자열 값을 아스키 코드로 변환한 )
SetInputValue(4, 10) : 4는 요청 개수라는 타입을 의미 10이 실재로 요청할 데이터의 개수를 이미. 10은 최근 거래일로부터 10일 치에 해당하는 데이터를 의미
SetInputValue(5, 5) : 요청할 데이터의 종류. 종가에 해당하는 값이 5
SetInputValue(6, ord('D')) : 차트의 종류로서 일 단위의 데이터를 가져오기 위해 ord('D')를 입력.
SetInputValue(9, ord('1')) : 수정 주가의 반영 여부에 대한 것으로 수정 주가를 의미하는 ord('1')을 입력
이렇게 요청할 내역을 만든다음에 데이터 처리를 요청
instStockChart.BlockRequest()
이제 반복문으로 원하는 데이터를 모두 가지고 오고 수신한 데이터의 개수를 확인
numData = instStockChart.GetHeaderValue(3)
numData만큼의 데이터를 가져오기 위해 간단한 for문을 작성하고 해당 for문 내에서 GetDataValue 메서드를 호출해 10일 치 데이터를 화면에 출력하기
for i in range(numData):
print(instStockChart.GetDataValue(0, i))
GetDataValue 메서드의 첫 번째 인자는 요청한 데이터의 인덱스를 의미함, 우리는 현재 시가, 고가, 저가, 종가, 거래량을 얻어왔기 때문에. 시가를 얻을 때는 0, 고가를 얻을 때는 1을 사용하면 됨.
그래서 for문으로 종가만을 구해온 데이터의 갯수만큼 출력해주어 원하는 결과를 얻어내자
위의 과정이 어떻게 수행되는지 이야기 해보자면
win32com.client 모듈의 Dispatch 함수를 사용해 객체를 생성한다. 그 다음 생성된 객체의 SetInputValue 메서드를 호출해 요청할 데이터에 대한 정보를 입력합니다.