Creon API를 이용하여 주식 종목 코드를 가져오려고 한다.
API는 예전에 블로그에 정리한 것을 참고해주세요.
https://songveloper.tistory.com/15?category=688936
https://songveloper.tistory.com/12
위의 공부한 것을 바탕으로 내가 쓰기 좋게 Creon AP를 구성하고 구현한 것은 다음과 같다.
연결을 확인하고, 내가 원하는 Stock 리스트를 가져오는 그런 코드입니다.
import time
import win32com.client
import pandas as pd
from pandas import DataFrame
import copy
class Creon:
def __init__(self):
self.obj_CpCodeMgr = win32com.client.Dispatch('CpUtil.CpCodeMgr')
self.obj_CpCybos = win32com.client.Dispatch('CpUtil.CpCybos')
self.obj_StockChart = win32com.client.Dispatch('CpSysDib.StockChart')
def creonConnectCheck(self):
b_connected = self.obj_CpCybos.IsConnect
if b_connected == 0:
print("connect fail")
return False
else :
return True
def setAllStockList(self):
# ## 대신 api 세팅
obj = win32com.client.Dispatch("CpUtil.CpStockCode")
numData = obj.GetCount()
data = []
self.numTotalCount = 0
for index in range(numData):
tempData = []
tempData.append(obj.GetData(0, index))
if self.obj_CpCodeMgr.GetStockMarketKind(tempData[0]) == 1 or self.obj_CpCodeMgr.GetStockMarketKind(tempData[0]) == 2:
data.append(tempData)
return data;
def dataSlice(self,stockList):
refinedStockList = []
stockCount = len(stockList);
listRowCount = int(stockCount/200) + 1 #we just we 200 stock.. , so we need to slice the data.
for i in range(listRowCount):
tempList = [] # 안쪽 리스트로 사용할 빈 리스트 생성
for j in range(200):
numOfList = i*200 + j
if stockCount <= numOfList :
break
tempList.append(stockList[numOfList]) # 안쪽 리스트에 0 추가
refinedStockList.append(tempList)
return refinedStockList
def subMarketSingArray(self, codeList, mInfoList):
numCodeRow =len(codeList)
print(numCodeRow)
obj = win32com.client.Dispatch("cpsysdib.MarketEye")
obj.SetInputValue(0, mInfoList)
obj.SetInputValue(1, codeList)
obj.BlockRequest()
numField = obj.GetHeaderValue(0)
numData = obj.GetHeaderValue(2)
data=[]
for idx_x in range(numData):
tempdata=[]
for idx_y in range(numField):
tempdata.append(obj.GetDataValue(idx_y, idx_x))
data.append(tempdata)
return data
def subMarketEye(self, codeList, mInfoList):
numCodeRow =len(codeList)
print(numCodeRow)
obj = win32com.client.Dispatch("cpsysdib.MarketEye")
data=[]
for index in range(numCodeRow):
obj.SetInputValue(0, mInfoList)
obj.SetInputValue(1, codeList[index])
obj.BlockRequest()
numField = obj.GetHeaderValue(0)
numData = obj.GetHeaderValue(2)
for idx_x in range(numData):
tempdata=[]
for idx_y in range(numField):
tempdata.append(obj.GetDataValue(idx_y, idx_x))
data.append(tempdata)
return data
그 다음에 오늘은 배당금을 가져오고 싶었으나 관련 API 를 찾지 못해서 해당 API를 이용하여
종목명, 그리고 종목 코드를 가져오는 것을 구현
import time
import pandas as pd
from pandas import DataFrame
import CreonApi
import copy
class DividStock(object) :
def __init__(self, stockCode, price, stockName,dividend):
print("divide")
self.stockCode = stockCode
self.price = price
self.stockName = stockName
self.dividend =dividend;
def printStock(self):
result = []
result.append(self.stockCode)
result.append(self.price)
result.append(self.stockName)
result.append(self.dividend)
return result
class DivideStrategy():
creon = CreonApi.Creon()
codeinformList = [0,17]
stockList = []
# 0 종목코드, 4 현재가, 17 종목명, 20 : 총 상장주식수, 74 배당률, 75 부채비율, 77 ROA, 80 순이익증가율
# 89 BPS, 91 영업이익 95 결산연월, 102 분기영업이익,107 분기 ROE, 111 결산연월 123 SPS 124 CFPS
def refinedStock(self, inputdata):
data = []
lenofdata = len(inputdata)
for index in range(lenofdata):
tempdata = copy.deepcopy(inputdata[index])
tempStock = DividStock(tempdata[0],tempdata[1],tempdata[2])
self.stockList.append(tempStock)
def saveDataStockList(self):
lenofdata = len(self.stockList)
result = []
for index in range(lenofdata):
result.append(self.stockList[index].printStock())
df = DataFrame(result,columns=['종목코드', '종목명'])
df.to_csv('StockList.csv')
def dividStrategy(self):
if self.creon.creonConnectCheck() == True:
print("start")
tempdata = self.creon.setAllStockList()
sliceData = self.creon.dataSlice(tempdata)
print("refinde")
self.refinedStock(self.creon.subMarketEye(sliceData, self.codeinformList))
print("saved")
self.saveDataStockList()
print("end")
else:
print("bye!")
def DivideStockList():
divideStcok = DivideStrategy()
divideStcok.dividStrategy()
DivideStockList()
이것으로 가져온 리스트를 활용해서 내가 가진 주식의 배당금을 직전 년도 배당을 통해 알아보고,
내년에 나는 얼마의 배당을 받을 수 있을지 예측하는 프로그램을 만들어볼까합니다.