ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주식 종목 코드 가져오기
    개발자로 살아남기/python 2020. 3. 20. 07:08

     

    Creon API를 이용하여 주식 종목 코드를 가져오려고 한다.

     

    API는 예전에 블로그에 정리한 것을 참고해주세요.

    https://songveloper.tistory.com/15?category=688936

     

    [Creon API] 종목 코드를 이용하여 여러 정보 가져오기

    Creon API 에서 MarketEye 를 이용해서 종목 코드만 있으면 다음과 같은 정보들을 가져올 수 있다. http://money2.creontrade.com/e5/mboard/ptype_basic/HTS_Plus_Helper/DW_Basic_Read_Page.aspx?boardseq=284&s..

    songveloper.tistory.com

    https://songveloper.tistory.com/12

     

    Creon API로 connect

    맨날 공부한다고 생각만하고 있어서 그런지 상당히 더디게 프로젝트가 진행되고 있다. 처음에는 python 공부를 목적으로 하였지만.. 그것보단 내가 어떤 주식을 사야할지, 데이터 접근하여 값을 가져오는 용도로..

    songveloper.tistory.com

    위의 공부한 것을 바탕으로 내가 쓰기 좋게 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()



     

    이것으로 가져온 리스트를 활용해서 내가 가진 주식의 배당금을 직전 년도 배당을 통해 알아보고,

    내년에 나는 얼마의 배당을 받을 수 있을지 예측하는 프로그램을 만들어볼까합니다.

     

     

     

Designed by Tistory.