Kiwoom Open API+

opt10081: 주식일봉차트조회요청 분석

Falto 2024. 11. 10. 16:56
반응형

종목코드 149980

기준일자 20240207

수정주가구분 0

으로 조회한 결과는 아래와 같다. 출력에서 종목코드는 이미 알고 있는 정보이므로 생략했고, 대업종구분, 소업종구분, 종목정보, 수정주가이벤트, 전일종가는 항상 비어있어서 생략했다.

---

16:37:47.928 : [주식일봉차트조회요청] [opt10081] Count=600 PrevNext=2, 데이터수집 (9,001개, 130,923uS)
[opt10081][0] 현재가=8070
[opt10081][0] 거래량=307413
[opt10081][0] 거래대금=2520
[opt10081][0] 일자=20240207
[opt10081][0] 시가=8450
[opt10081][0] 고가=8460
[opt10081][0] 저가=8010
[opt10081][0] 수정주가구분=256
[opt10081][0] 수정비율=-15.08
[opt10081][1] 현재가=9950
[opt10081][1] 거래량=283593
[opt10081][1] 거래대금=2747
[opt10081][1] 일자=20240206
[opt10081][1] 시가=9350
[opt10081][1] 고가=9950
[opt10081][1] 저가=9310
[opt10081][1] 수정주가구분=
[opt10081][1] 수정비율=

---

 

 

 

종목코드 149980

기준일자 20240207

수정주가구분 1

로 조회한 결과는 아래와 같다.

---

16:39:04.516 : [주식일봉차트조회요청] [opt10081] Count=600 PrevNext=2, 데이터수집 (9,001개, 133,460uS)
[opt10081][0] 현재가=8070
[opt10081][0] 거래량=307413
[opt10081][0] 거래대금=2520
[opt10081][0] 일자=20240207
[opt10081][0] 시가=8450
[opt10081][0] 고가=8460
[opt10081][0] 저가=8010
[opt10081][0] 수정주가구분=256
[opt10081][0] 수정비율=-15.08
[opt10081][1] 현재가=8450
[opt10081][1] 거래량=333953
[opt10081][1] 거래대금=2747
[opt10081][1] 일자=20240206
[opt10081][1] 시가=7940
[opt10081][1] 고가=8450
[opt10081][1] 저가=7906
[opt10081][1] 수정주가구분=
[opt10081][1] 수정비율=

---

수정주가구분이 0이든 1이든 상관없이 수정비율수정주가구분 데이터는 똑같이 받아와짐을 알 수 있다.

 

256은 권리락을 의미한다. KOAStudio에서 확인할 수 있다.

 

일반적으로, 내가 받아온 데이터가 수정주가인지 아니면 원래 주가인지는 입력값(수정주가구분)을 어딘가에 저장해야만 알 수 있다.

 

수정주가구분 0의 주가로부터 수정주가구분 1의 주가를 계산하는 공식은

( 주가 ) * ( 100 + 수정비율 ) / 100

이다.

 

여기서 수정비율은 % 단위이다. 데이터도 % 단위로 받아와진다.

 

실제로 Python으로 계산해보면

현재가 9950 * ( 100 - 15.08 ) / 100 = 8449.54

시가 9350 * ( 100 - 15.08 ) / 100 = 7940.02

고가 9950 * ( 100 - 15.08 ) / 100 = 8449.54

저가 9310 * ( 100 - 15.08 ) / 100 = 7906.052000000001

가 나온다. 소수 첫째 자리에서 반올림할 경우 실제 결과와 각각 일치한다.

 

모든 날의 거래대금은 주가가 수정되어도 유지되어야 한다. 거래대금은 주가에 거래량을 곱해서 산출된다. 수정주가가 원래 주가보다 크면 수정된 거래량은 수정 전보다 작다. 반대로 수정주가가 원래 주가보다 작으면 수정된 거래량은 수정 전보다 크다. 즉 수정주가와 수정거래량은 반비례 관계다. 원래 거래량으로부터 수정 거래량을 구하는 공식은

(수정 거래량) = (원래 거래량) * 100 / ( 100 + 수정비율 )

이다.

 

283593 * 100 / ( 100 - 15.08 ) = 333953.1323598681

이고 이 역시 소수 첫째 자리에서 반올림할 경우 위에서 받은 수정 거래량과 결과가 일치한다.

 

코드 상에서 수정주가를 적용하려면 double 변수 하나 1로 초기화해놓고 그거 이용해서 for문 돌려서 계속 곱하면 된다. C# 코드의 일부를 가져왔다. 아래 참고.

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ForceMonitor4
{
    internal class Opt10081Rows:List<Opt10081Row>
    {
        internal bool Compiled { get; private set; }
        internal SortOrder sortOrder;
        internal void Compile()
        {
            if (Compiled)
            {
                return;
            }
            if(Count <= 0)
            {
                Compiled = true;
                return;
            }
            if(sortOrder == SortOrder.Unspecified)
            {
                throw new InvalidOperationException();
            }
            if(sortOrder == SortOrder.Ascending)
            {
                Reverse();
            }
            checked
            {
                double ratio = 1;
                for (short i = 0; i < Count; i++)
                {
                    this[i].High = (long)(this[i].High * ratio);
                    this[i].Low = (long)(this[i].Low * ratio);
                    this[i].Open = (long)(this[i].Open * ratio);
                    this[i].Close = (long)(this[i].Close * ratio);
                    this[i].Volume = (long)(this[i].Volume / ratio);
                    ratio *= (100 + this[i].ModifyRatio) / 100;
                }
            }
            if (sortOrder == SortOrder.Ascending)
            {
                Reverse();
            }
            Compiled = true;
        }
    }
}

checked로 감싸진 부분이 수정주가와 수정거래량을 계산하는 중요한 부분이다.

반응형