대신증권 크레온에서 투자자별 매매동향 수집하기

2021-11-24 • quant퀀티랩, 대신증권, 크레온, 투자자, 매매동향, 수급 • 5 min read

이번 포스트에서는 크레온 플러스 API를 이용하여 개인, 기관, 외국인의 매매동향 데이터를 수집하는 방법을 다루겠습니다.

퀀티랩 SysTrader 패키지를 다운받아 설치하시면 다음과 같이 쉽게 기능을 사용할 수 있습니다.

from quantylab.systrader.creon import Creon

c = Creon()
data = c.get_investorbuysell('005930', n=60)

지금부터는 SysTrader 설치 없이 위 기능을 직접 구현해 보실 수 있도록 풀어서 설명하겠습니다.

퀀티랩 YouTube 채널이 영상을 보셔도 됩니다.

투자자별 매매동향 데이터는 크레온의 매매입체분석 CpSysDib.CpSvr7254 모듈을 사용해서 가져올 수 있습니다.

크레온 플러스 API 사용을 위해서는 win32com 패키지가 필요한데 pip install pywinauto로 설치할 수 있습니다.

먼저 win32com.client를 임포트하여 CpSysDib.CpSvr7254 모듈을 Dispatch 합니다.

import win32com.client
obj = win32com.client.Dispatch('CpSysDib.CpSvr7254')

이제 파라미터를 입력해야 합니다. 문서를 보면 다양한 파라미터들이 있는데 여기서는 하나의 예시를 들겠습니다. 이 문서에서 확인하시어 아래 예제처럼 원하시는 값으로 입력해 주시면 됩니다.

obj.SetInputValue(0, 'A005930')  # 종목코드
obj.SetInputValue(1, 6)  # 기간선택구분 - 6:일별
obj.SetInputValue(4, ord('0'))  # 매매비중구분 - '0':순매수
obj.SetInputValue(5, 0)  # 투자자 - 0:전체
obj.SetInputValue(6, ord('1'))  # 데이터 구분 - '1':순매수량

이렇게 삼성전자에 대해 투자자들의 일별 매매동향을 가져오도록 파라미터를 채웠습니다. 이제 요청을 다음과 같이 보내면 됩니다.

obj.BlockRequest()

이제 요청 결과를 가져올 수 있는데, 먼저 결과 데이터 개수를 확인해 보겠습니다. 이건 GetHeaderValue(type) 메소드로 가져올 수 있는데 type은 모듈마다 달라서 문서를 확인해야 합니다. 이 모듈에서 결과의 데이터 개수에 대한 type 값은 1 입니다.

cnt = obj.GetHeaderValue(1)

아마 cnt는 17개로 나올 것입니다. 이건 이 모듈이 한번 조회할 때 최대 17개까지만 반환해주기 때문입니다. 더 많은 과거 데이터를 원할 경우 연속조회 하면 됩니다. 이건 뒤에서 확인하겠습니다.

먼저 현재 요청 결과를 dict로 구성해 보겠습니다. 결과는 GetDataValue(type, index) 메소드로 가져옵니다. type은 문서를 확인하면 되고 index는 17개 아이템에 대한 인덱스 입니다.

이렇게 결과를 dict 형태로 만들 수 있습니다.

keys = [
    '일자',
    '개인',
    '외국인',
    '기관계',
    '금융투자',
    '보험',
    '투신',
    '은행',
    '기타금융',
    '연기금 등',
    '기타법인',
    '기타외인',
    '사모펀드',
    '국가지자체',
    '종가',
    '대비',
    '대비율',
    '거래량',
    '확정치여부',
]
data = []
for i in range(cnt):
    item = {k: obj.GetDataValue(j, i) for j, k in enumerate(keys)}
    data.append(item)

이제 연속조회로 더 많은 데이터를 가져와 보겠습니다.

if obj.Continue:
    obj.BlockRequest()

그리고 위와 똑같이 dict 형태로 만들어서 data에 추가하면 됩니다.

cnt = obj.GetHeaderValue(1)
for i in range(cnt):
    item = {k: obj.GetDataValue(j, i) for j, k in enumerate(keys)}
    data.append(item)

이 데이터를 pandas DataFrame으로 변환하여 출력해보면 다음처럼 테이블로 결과를 볼 수 있습니다.

import pandas as pd
df = pd.DataFrame(data)
index 일자 개인 외국인 기관계 금융투자 보험 투신 은행 기타금융 연기금 등 기타법인 기타외인 사모펀드 국가지자체 종가 대비 대비율 거래량 확정치여부
0 20211122 -8689002 5766721 3033799 1879919 20352 738060 -36395 27387 85824 -82117 -29401 318652 0 74900 3700 5.20 27239836 49
1 20211119 -742078 313970 432827 283202 12079 -23332 -3478 -24859 179418 -8721 4002 9797 0 71200 1000 1.42 11954728 49
2 20211118 1314434 -738137 -576566 -103191 -3195 -10927 0 1 -456299 -5413 5682 -2955 0 70200 -500 -0.71 10144957 49
3 20211117 1234537 1519353 -2816912 -2557894 27969 122759 105367 -114917 -491388 57393 5629 91192 0 70700 -600 -0.84 11027606 49
4 20211116 -753052 1025989 -202007 148871 -48992 122148 46961 -116 -551871 -73698 2768 80992 0 71300 -100 -0.14 10919239 49
5 20211115 -3174454 976207 2301384 1708103 27375 63674 -6560 2705 369771 -86615 -16522 136316 0 71400 800 1.13 12420710 49
6 20211112 -2411322 384228 2046949 2015464 -10560 196819 -761 405 -152781 -16190 -3665 -1637 0 70600 700 1.00 10087450 49
7 20211111 2266214 -2179760 -116698 655621 67711 -133062 2502 -234 -389250 27906 2338 -319986 0 69900 -300 -0.43 11489122 49
8 20211110 -722793 1435001 -724133 -268435 -14154 32610 0 -5246 -475829 9024 2901 6921 0 70200 -300 -0.43 9422009 49
9 20211109 -454505 -725539 1193368 1695062 -18889 -35616 0 1624 -478674 -10796 -2528 29861 0 70500 -100 -0.14 11159589 49
10 20211108 714776 -628399 -89168 233239 23127 38912 7130 103 -384412 855 1936 -7267 0 70600 400 0.57 11121981 49
11 20211105 2087811 -1174569 -905068 -452144 158763 28084 2288 -682 -633973 -11957 3783 -7404 0 70200 -400 -0.57 12667743 49
12 20211104 -1743969 -80764 1947030 1874492 201770 -16178 3000 -196 -190245 -119787 -2510 74387 0 70600 200 0.28 11818987 49
13 20211103 3748000 -1032459 -2789497 -2145003 -97809 -8839 3000 4247 -300074 72239 1717 -245019 0 70400 -1100 -1.54 12770428 49
14 20211102 -5644694 2043624 3621076 3253414 -151433 150916 223 348 113959 -2851 -17155 253649 0 71500 1600 2.29 16812570 49
15 20211101 -1367521 -1651736 3003169 2827678 65072 38774 2 -7314 -75387 13386 2702 154344 0 69900 100 0.14 11503729 49
16 20211029 4050479 -1812320 -2365662 -1496831 66131 124596 18242 5201 -1103470 111608 15895 20469 0 69800 -900 -1.27 17016151 49
17 20211028 899791 -2432885 1281744 98960 17371 446463 -5311 2738 200349 253867 -2517 521174 0 70700 600 0.86 20644902 49
18 20211027 3080455 -2124585 -1005822 -622428 -28520 -4796 3894 -436 -354458 34143 15809 922 0 70100 -1000 -1.41 10295316 49
19 20211026 -1247398 -551563 1812123 1501865 -3643 78012 7236 757 96060 -16422 3260 131836 0 71100 900 1.28 10528252 49
20 20211025 582794 -1599446 988462 1110489 17838 8699 -1410 547 -182522 30985 -2795 34821 0 70200 -200 -0.28 10029621 49
21 20211022 -644269 -128538 762404 1215268 2445 -40105 -682 -167 -452150 12542 -2139 37795 0 70400 200 0.28 8395448 49
22 20211021 203876 109754 -197734 242202 -125548 -30478 0 -13079 -275758 -116542 646 4927 0 70200 -100 -0.14 10891094 49
23 20211020 556532 256311 -829527 -125516 -131592 -86437 200 -558 -486593 8664 8020 969 0 70300 -300 -0.42 10151638 49
24 20211019 -504814 -431790 910091 1429098 16262 -61830 1361 167 -432527 33963 -7450 -42440 0 70600 400 0.57 9507991 49
25 20211018 771890 1303614 -2117009 -1564134 -42320 -17082 -329 833 -477196 30584 10921 -16781 0 70200 100 0.14 13486391 49
26 20211015 822742 -1376104 456288 626433 -60458 99645 21339 242 -312400 84238 12836 81487 0 70100 700 1.01 18051612 49
27 20211014 2011163 -3787173 1696662 1993635 -93476 76957 -20 10524 -236463 62704 16644 -54495 0 69400 600 0.87 19520641 49
28 20211013 2224620 -5271845 2725596 2539887 -100166 33871 16584 -7544 20055 311767 9862 222909 0 68800 -200 -0.29 24172015 49
29 20211012 12155071 -11004329 -1421202 -907809 -230050 -178155 15394 -60991 12399 248713 21747 -71990 0 69000 -2500 -3.50 31001484 49
30 20211008 2612855 319900 -2923031 -1565044 -88549 42805 3341 -8642 -1269657 -10175 451 -37285 0 71500 -100 -0.14 14043287 49
31 20211007 1266151 -2661506 1391358 1821608 -90182 69692 -1689 5770 -407085 -2507 6504 -6756 0 71600 300 0.42 13683532 49
32 20211006 1374960 -1070439 -342467 244117 -24935 102550 1669 924 -599759 41544 -3598 -67033 0 71300 -900 -1.25 18956962 49
33 20211005 1783237 -3025584 1255911 1173732 -5740 62289 -47544 -9339 104473 -18889 5325 -21960 0 72200 -1000 -1.37 24013921 49