ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python][대신증권] cybos 현재 모든 종목 데이터 받기
    IT/python 2022. 1. 4. 16:54

    키움증권의 경우 현재 모든 종목의 가격을 한번에 불러올 수 없다.

     

    한국 거래소 데이터를 이용할 수 있지만 20분 지연데이터,,,,

     

    대신증권에서는 한번에 모든 종목의 가격 및 기타 정보들을 받을 수 있다.

     

    # 필요 라이브러리

    ########################################################################################

    python 3.7 version (32bit)

    win32com.client (pip install pywin32==301)

    Name: pywin32
    Version: 301
    Summary: Python for Window Extensions
    Home-page: https://github.com/mhammond/pywin32
    Author: Mark Hammond (et al)
    Author-email: mhammond@skippinet.com.au
    License: PSF
    Location: c:\programdata\anaconda3\envs\py37_32bit\lib\site-packages
    Requires:
    Required-by: web3, pywinauto, jupyter-core

     

    pywinauto (pip install pywinauto==0.6.8)

    Name: pywinauto
    Version: 0.6.8
    Summary: A set of Python modules to automate the Microsoft Windows GUI
    Home-page: http://pywinauto.github.io/
    Author: Mark Mc Mahon and Contributors
    Author-email: pywinauto-users@lists.sourceforge.net
    License: BSD 3-clause
    Location: c:\programdata\anaconda3\envs\py37_32bit\lib\site-packages
    Requires: comtypes, pywin32, six
    Required-by: hwpconv

    ###################################################################################

     

    # 코드

    ###################################################################################

    import os
    import win32com.client
    from pywinauto import application
    import time
    import pandas as pd
    
    
    def connect(reconnect=True):
        # 재연결이라면 기존 연결을 강제로 kill
        if reconnect:
            try:
                os.system('taskkill /IM ncStarter* /F /T')
                os.system('taskkill /IM CpStart* /F /T')
                os.system('taskkill /IM DibServer* /F /T')
                os.system('wmic process where "name like \'%ncStarter%\'" call terminate')
                os.system('wmic process where "name like \'%CpStart%\'" call terminate')
                os.system('wmic process where "name like \'%DibServer%\'" call terminate')
            except:
                pass
    
        CpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
    
        if CpCybos.IsConnect:
            print('already connected.')
    
        else:
            app = application.Application()
            app.start(
                'C:\Daishin\Starter\\ncStarter.exe /prj:cp /id:{id} /pwd:{pwd} /pwdcert:{pwdcert} /autostart'.format(
                    id='아이디', pwd='비밀번호', pwdcert='공인인증서비밀번호')
            )
            # 연결 될때까지 무한루프
            while True:
                if CpCybos.IsConnect:
                    break
                time.sleep(1)
    
            print('connected.')
        return CpCybos
    
    
    def get_curr_price(CpCybos, code_list, field_list=[0, 4, 5, 6, 7, 11, 20]):
    
        field_dic = {
            '0': 'code',
            '4': 'close',
            '5': 'open',
            '6': 'high',
            '7': 'low',
            '11': 'value',
            '20': 'stocks',
            '23': 'prev_close'
        }
    
        MarketEye = win32com.client.Dispatch("CpSysDib.MarketEye")
        division = len(code_list) // 200
        remain = len(code_list) % 200
        df = []
    
        for d_idx in range(division):
            remain_request_count = CpCybos.GetLimitRemainCount(1)
            if remain_request_count == 0:
                time.sleep(2)
    
            MarketEye.SetInputValue(0, field_list)  # 요청 필드
            MarketEye.SetInputValue(1, code_list[d_idx * 200: (d_idx + 1) * 200])  # 종목코드 or 종목코드 리스트
            MarketEye.BlockRequest()
    
            row_cnt = MarketEye.GetHeaderValue(2)
            for r_idx in range(row_cnt):
    
                curr_data = []
                for f_idx in range(len(field_list)):
                    curr_data.append(MarketEye.GetDataValue(f_idx, r_idx))
                df.append(curr_data)
    
    
        remain_request_count = CpCybos.GetLimitRemainCount(1)
        if remain_request_count == 0:
            time.sleep(2)
    
        MarketEye.SetInputValue(0, field_list)  # 요청 필드
        MarketEye.SetInputValue(1, code_list[-remain:])  # 종목코드 or 종목코드 리스트
        MarketEye.BlockRequest()
    
        row_cnt = MarketEye.GetHeaderValue(2)
    
        for r_idx in range(row_cnt):
    
            curr_data = []
            for f_idx in range(len(field_list)):
                curr_data.append(MarketEye.GetDataValue(f_idx, r_idx))
            df.append(curr_data)
    
        cols = []
        for field in field_list:
            cols.append(field_dic[str(field)])
    
        df = pd.DataFrame(df, columns=cols)
        return df
    
    # 이미 연결되어있다면 재연결 x
    CpCybos = connect(False)
    
    CpCodeMgr = win32com.client.Dispatch('CpUtil.CpCodeMgr')
    kospi = CpCodeMgr.GetStockListByMarket(1)
    kosdaq = CpCodeMgr.GetStockListByMarket(2)
    code_list = list(kospi + kosdaq)
    print(f'{len(code_list)} stocks')
    
    df = get_curr_price(CpCybos, code_list)
    print(df)
    

    ###################################################################################

     

    # 실행화면

    ###################################################################################

    ###################################################################################

Designed by Tistory.