선물 tick 데이터를 연속으로 받는 중 발견한 오류입니다.

tick 데이터는 msec 해상도를 가지는데, msec까지 같은 경우가 가끔 있습니다. 그런데 연속 조회시 마지막 데이터와 다음 조회시에 받을 데이터가 같은 msec인 경우에 연속 조회시 받을 수 있는 두가지 오류가 발견되었습니다.

 

일단 원 데이터를 보겠습니다.

아래는 2024년 1월 29일 선물 tick 데이터입니다. 09:39:36초에 총 4번의 거래가 발생하였음을 알 수 있습니다.

 

첫 번째 오류는 최근에 받은 tick 자료에 msec이 같은 tick이 더 있는 경우에 발생하는 오류입니다. 

아래 자료 중 밑에 있는 것은 이전에 받은 tick 정보입니다. 09:39:36초에 2건의 거래가 있었음을 알려줍니다. querycnt 값이 차서 이 상태로 돌려줍니다. 이때 cts_time 정보는 0939363755가 돌아옵니다. API ref를 보면 돌려주는 cts_time 정보를 다음 연속 query할 때 입력으로 사용하라고 명시되어 있습니다.  다음 query의 결과값은 0939363755 보다 큰 값을 가진 tick 정보를 돌려주는 방식입니다. 이 가정에서 오류가 발생하는데요.

 

앞에서 설명하였듯이 09:39:36초에는 총 4건의 거래가 있습니다. 다음 query에서는 이 전에 몇 건을 보냈는 정보를 관리하지 않아서 무조건 cts_time보다 큰 값을 가진 tick을 돌려줍니다. 따라서 미처 받지 못한 2건은 사라지게 됩니다.

 

ebest api를 수정할 방법은 없으니 회피 방법을 찾아봅니다.

 

cts_time을 전달할 때 query에서 준 값이 아닌 tick 정보 중 최근 값보다 큰 값을 전달하면 될 듯합니다. 기본 가정은 최신 tick 시간에는 중복된 데이타가 있다고 가정을 하는 것이죠. 이렇게 해보니 msec이 중복된 tick 정보는 모두 받을 수 있는데  또 한가지 처리하여할 문제가 발생합니다. 바로 중복 저장 문제입니다.

 

수정한 방식으로 연속 query를 하면 아래와 같이 09:39:36초 데이터가 중복으로 받아집니다. api 입장에서는 0939363755 틱을 이전에 받았는지 알 수가 없는 것이죠. 그래서 중복된 모든 tick 정보를 다시 전달해줍니다. 

 

이 또한 어쩔 수 없는 것이므로, 중복된 tick을 제거하는 방식으로 처리하여야합니다.

 

방법은 간단한데요. 이전에 받은 자료 중 같은 시간에 해당하는 tick의 수를 계산해서 이번에 받은 자료에서 그 만큼 차감하여 저장하면 됩니다. 이렇게 하면 아래와 같이 중복된 자료가 사라짐을 알 수 있습니다.

 

결과적으로 msec이 같은 tick 정보를 모두 받을 수 있고, 중복된 tick 정보도 제거할 수 있었습니다.

 

이런 과정없이 tick을 저장하신 분들이 msec이 같은 경우에 이빨이 빠져있을 수 있으니 이점 참고하시기 바랍니다.

 

반응형

설정

트랙백

댓글

ebest api에서 t8413을 이용하여 특정 주식의 일봉 자료를 얻을 수 있습니다. 자료에 보면 jongchk와 rate라는 항목이 있는데 여기에 주가 변동 사항에 대하여 정리가 되어 있습니다.

 

이동 평균선을 구할 때 이 항목을 잘 확인을 해야하는데요. 이걸 무시하면 엉뚱한 결과가 나올 수 있습니다.

 

삼성전자 예를 들어보겠습니다. 아시다시피 삼성전자는 액면가 5,000원을 100으로 변경하는 액면분할을 하였습니다. 당시 일봉자료를 보면 아래와 같은 값이 표기되어 있습니다.

 jongchk : 4100

rate : -98

 

그 의미를 이해하려면 4100을 hex 값으로 변환하여야 합니다. 4100의 hex값은 1004가 됩니다. 위에 그림에서 보면 0x1000은 기준가 조정이고 마지막 4는 액면분할을 의미합니다. 

 

 

그리고 rate값인 -98은 액면가가 98% 줄어들었다는 의미입니다.

주가 보정을 위해서는 아래와 같은 방식으로 하면 됩니다.

삼성전자 2018/05/03 주가 2,650,000  

수정주가 => 2,650,000 * (100+rate)/100  = 53,000

 

반대로 액면병합인 경우에는 rate 값이 양수로 표기됩니다.

 

액면병합, 연말 배당, 유상증자 등으로 권리변동이 계속 발생하므로 변경이 생긴 원인을 파악하고 이에 맞는 적절한 가격 계산을 해 주어야 합니다.

 

반응형

설정

트랙백

댓글