2016년 1월 16일 토요일

대신증권 API 연동 방법

자동 주식 매매를 위한 대신증권 API 연동 방법을 요약한다.

1. 대신증권 계좌 개설 (오프라인)
근처 은행에서 통장에 연계 계좌를 개설한다.

2. 대신증권 계좌를 등록 (온라인)
인터넷으로 대신증권 계좌 등록 및 (증권용) 공인 인증서를 발급 받는다.

3. CYBOS 5 설치

4. CYBOS Plus 로그인 및 사용 동의
CYBOS Plus를 통해서 로그인 한다.
주문 오프젝트 사용 동의를 한다.

5. 파이썬 설치
아나콘다(anaconda)를 통해서 python3.x 32bit 버전 설치

6. COM 객체 모델을 이용한 API 호출
관리자 권한으로 pywin32 라이브러리를 호출한다.

import win32com.client
cy = win32com.client.Dispatch("CpUtil.CpCybos")
print ( cy.IsConnect )

1이 나오면 준비가 완료 되었다.


* (윈도우가 답답한) 맥 유저를 위한 팁

1. 관리자 권한으로 주피터 노트북을 연다.
2. 윈도우 방화벽에 인바운드(python) 허용한다.
3. 맥에서 주피터 노트북에 접속한다.


References

COM (Component Object Model)
마이크로소프트가 개발한 소프트웨어 구성 요소들의 응용 프로그램 이진 인터페이스이다.

본문 참고 사이트
https://wikidocs.net/2870

웹 API 가이드
http://cybosplus.github.io

샘플 코드 로그
전체 종목 코드 추출 하기
import win32com.client
cursor = win32com.client.Dispatch("CpUtil.CpStockCode")
MAX = curosr.GetCount()
code_map = []
for i in range(MAX):
    code_map.append((cursor.GetData(0,i),
                     cursor.GetData(1,i),
                     cursor.GetData(2,i)))
df = pd.DataFrame(code_map,columns=['code','name','full_code'])
df = df[ df['code'].apply(lambda i: i[0] == 'A') ]
df.to_sql(name='item_names',con=conn,index=True,if_exists='replace')

종목에 대한 분단위 기간 데이터 추출 하기
def insert_item(code,start_date,end_date):
    cursor = win32com.client.Dispatch("CpSysDib.StockChart")
    cursor.SetInputValue(0, code)  # 코드 이름으로 종목 선택
    cursor.SetInputValue(1, ord("1")) # 기간 단위로 받기
    cursor.SetInputValue(2, end_date)  # 날짜 이하
    cursor.SetInputValue(3, start_date)  # 날짜 이상
    cursor.SetInputValue(5, (0, 1, 2, 8)) # 날짜, 시간, 시가, 거래량
    cursor.SetInputValue(6, ord("m"))  # 분단위 추출

    cursor.BlockRequest()   # 서버에 데이터 요청

    _rows = cursor.GetHeaderValue(3)  # 데이터 갯수
    _cols = cursor.GetHeaderValue(1)  # 추출 필드 갯수 setInputValue(5,x) 항목

    _df = pd.DataFrame()
    # GetDataValue
    for i in range(_rows):
        _rec = [];
        for j in range(_cols):
            rec.append(cursor.GetDataValue(j, i))
        _df = _df.append([_rec])
    _df.columns = ('date','time','price','volume')
    _df.to_sql(name="item_"+code,con=conn,index=False,if_exists='append')


커버사진
출처 : 대신증권 홈페이지

0 개의 댓글:

댓글 쓰기