API 적용 예제 (파이썬)

주식시간대별 체결(t1301) 조회

주식시간대별 체결(t1301)를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
t1301의 PATH는 "stock/market-data"입니다. API가이드에서 확인하실 수 있습니다.

BASE_URL = "https://openapi.ebestsec.co.kr:8080"
PATH = "stock/market-data"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "APP_KEY, APP_SECRET를 이용하여 발급받은 접근토큰"

다음으로는 header를 구성합니다.

header = {  
    "content-type":"application/json; charset=utf-8", 
    "authorization": f"Bearer {ACCESS_TOKEN}",
    "tr_cd":"t1301", 
    "tr_cont":"N",
    "tr_cont_key":"",
}

다음으로 주식시간대별 체결(t1301)의 입력값을 셋팅합니다.
종목코드 shcode는 078020(이베스트투자증권), 특이거래량 cvolume는 0이상 조건으로 조회합니다.

body = {
    "t1301InBlock" : 
    {    
        "shcode" : "078020",    
        "cvolume" : 0,    
        "starttime" : "",    
        "endtime" : "",    
        "cts_time" : ""  
    }
}

모든 입력값을 셋팅후 조회 요청을 합니다.

requset = requests.post(URL, headers=header, data=json.dumps(body))
requset.json()

*결과값

t1301은 두개의 t1301OutBlock, t1301OutBlock1으로 나누어져 있으며, 결과값 및 메세지코드, 메세지를 을 확인할 수 있습니다.

{
    "t1301OutBlock": {
        "cts_time":""
    },
    "t1301OutBlock1":[
        {
            "chetime":"090143",                
            "price":3570,
            "sign":"5",
            "change":40,
            "diff":"-1.11",
            "cvolume":39,
            "chdegree":"0.00",
            "volume":1872,
            "mdvolume":1766,
            "mdchecnt":10,
            "msvolume":0,
            "mschecnt":0,
            "revolume":-1766,
            "rechecnt":-10
        },
        {
            "chetime":"090143",
            "price":3580,
            "sign":"5",
            "change":30,
            "diff":"-0.83",
            "cvolume":1,
            "chdegree":"0.00",
            "volume":1833,
            "mdvolume":1727,
            "mdchecnt":9,
            "msvolume":0,
            "mschecnt":0,
            "revolume":-1727,
            "rechecnt":-9
        }
    ],
    "rsp_cd":"00000",
    "rsp_msg":"정상적으로 조회가 완료되었습니다."
}   

주식현재가호가(t1101) 조회

주식현재가호가(t1101)를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
tt1101의 PATH는 "stock/market-data"입니다. API가이드에서 확인하실 수 있습니다.

BASE_URL = "https://openapi.ebestsec.co.kr:8080"
PATH = "stock/market-data"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "APP_KEY, APP_SECRET를 이용하여 발급받은 접근토큰"

다음으로는 header를 구성합니다.

header = {  
    "content-type":"application/json; charset=utf-8", 
    "authorization": f"Bearer {ACCESS_TOKEN}",
    "tr_cd":"t1101, 
    "tr_cont":"N",
    "tr_cont_key":"",
}

다음으로 주식현재가호가(t1101)의 입력값을 셋팅합니다.
종목코드 shcode는 078020(이베스트투자증권), 특이거래량 cvolume는 0이상 조건으로 조회합니다.

body = {
    "t1101InBlock" : 
    {    
        "shcode" : "078020",    
    }
}

모든 입력값을 셋팅후 조회 요청을 합니다.

requset = requests.post(URL, headers=header, data=json.dumps(body))
requset.json()

*결과값

t1101은 한개의 t1101OutBlock으로, 결과값 및 메세지코드, 메세지를 을 확인할 수 있습니다.

{
    "t1101OutBlock":{
        "hname":"이베스트투자증권",
        "price":4545,
        "sign":"2",
        "change":10,
        "diff":"0.22",
        "volume":2702,
        "jnilclose":4535,
        "offerho1":4550,
        "bidho1":4540,
        "offerrem1":507,
        "bidrem1":430,
        "preoffercha1":0,
        "prebidcha1":0,
        "offerho2":4560,
        "bidho2":4535,
        "offerrem2":111,
        "bidrem2":120,
        "preoffercha2":0,
        "prebidcha2":0,
        "offerho3":4575,
        "bidho3":4530,
        "offerrem3":5,
        "bidrem3":169,
        "preoffercha3":0,
        "prebidcha3":0,
        "offerho4":4590,
        "bidho4":4525,
        "offerrem4":4,
        "bidrem4":101,
        "preoffercha4":0,
        "prebidcha4":0,
        "offerho5":4600,
        "bidho5":4520,
        "offerrem5":309,
        "bidrem5":609,
        "preoffercha5":0,
        "prebidcha5":0,
        "offerho6":4605,
        "bidho6":4515,
        "offerrem6":5756,
        "bidrem6":301,
        "preoffercha6":0,
        "prebidcha6":0,
        "offerho7":4610,
        "bidho7":4510,
        "offerrem7":466,
        "bidrem7":603,
        "preoffercha7":0,
        "prebidcha7":0,
        "offerho8":4620,
        "bidho8":4505,
        "offerrem8":27,
        "bidrem8":1045,
        "preoffercha8":0,
        "prebidcha8":0,
        "offerho9":4625,
        "bidho9":4500,
        "offerrem9":20,
        "bidrem9":179,
        "preoffercha9":0,
        "prebidcha9":0,
        "offerho10":4630,
        "bidho10":4495,
        "offerrem10":22,
        "bidrem10":299,
        "preoffercha10":0,
        "prebidcha10":0,
        "offer":7227,
        "bid":3856,
        "preoffercha":0,
        "prebidcha":0,
        "hotime":"09535583",
        "yeprice":0,
        "yevolume":0,
        "yesign":"3",
        "yechange":0,
        "yediff":"0.00",
        "tmoffer":0,
        "tmbid":0,
        "ho_status":"1",
        "shcode":"078020",
        "uplmtprice":5890,
        "dnlmtprice":3175,
        "open":4555,
        "high":4555,
        "low":4525
    },
    "rsp_cd":"00000",
    "rsp_msg":"정상적으로 조회가 완료되었습니다."
}

주식 잔고2(t0424) 조회

주식 잔고조회2(t0424)를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
t0424의 PATH는 "stock/accno"입니다. API가이드에서 확인하실 수 있습니다.

BASE_URL = "https://openapi.ebestsec.co.kr:8080"
PATH = "stock/accno"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "APP_KEY, APP_SECRET를 이용하여 발급받은 접근토큰"

다음으로는 header를 구성합니다.

header = {  
    "content-type":"application/json; charset=utf-8", 
    "authorization": f"Bearer {ACCESS_TOKEN}",
    "tr_cd":"t0424", 
    "tr_cont":"N",
    "tr_cont_key":"",
}

다음으로 주식 잔고조회2(t0424)의 입력값을 셋팅합니다.

  1. prcgb 단가구분 (1:평균단가,2:BEP단가),
  2. chegb 체결구분 (0:결제기준잔고,2:체결기준잔고 - 잔고가 0이아 닌 종목만 조회) ,
  3. dangb 단일가구분 (0:정규장, 1:시간외단일가),
  4. charge 제비용 포함여부 (0:미포함,1:포함),
  5. CTS_expcode CTS_종목번호 처음조회시 Space 로 조회, 연속조회시에 이전 조회한 OutBlock의 cts_expcode값으로 설정합니다.
body = {
    "t0424InBlock" : 
    {    
        "prcgb" : "",    
        "chegb" : "",    
        "dangb" : "",    
        "charge" : "",    
        "cts_expcode" : ""  
    }  
}

모든 입력값을 셋팅후 조회 요청을 합니다.

requset = requests.post(URL, headers=header, data=json.dumps(body))
requset.json()

*결과값

t0424은 두개의 t0424OutBlock, t0424OutBlock1으로 나누어져 있으며, 결과값 및 메세지코드, 메세지를 을 확인할 수 있습니다.

{
    "rsp_cd": "00000",
    "t0424OutBlock": 
    {
        "dtsunik": 0,
        "cts_expcode": "",
        "mamt": 258325842,
        "sunamt1": 0,
        "tappamt": 203287854,
        "sunamt": 203287854,
        "tdtsunik": -55037988
    },
    "t0424OutBlock1": [
        {
            "sininter": 0,
            "fee": 12842,
            "mamt": 67730600,
            "sinamt": 0,
            "mpmd": 0,
            "mdposqt": 1091,
            "jsat": 0,
            "janqty": 1091,
            "loandt": "",
            "sysprocseq": 0,
            "price": 16400,
            "janrt": "26.22",
            "jdat": 0,
            "jpms": 0,
            "hname": "일동제약",
            "appamt": 17853933,
            "sunikrt": "-73.64",
            "jonggb": "3",
            "msat": 0,
            "tax": 35784,
            "pamt": 62081,
            "jpmd": 0,
            "marketgb": "",
            "jangb": "",
            "dtsunik": -49886826,
            "expcode": "249420",
            "mdat": 0,
            "mpms": 0,
            "lastdt": ""
        },
        {
            "sininter": 0,
            "fee": 3081,
            "mamt": 13365000,
            "sinamt": 0,
            "mpmd": 0,
            "mdposqt": 891,
            "jsat": 0,
            "janqty": 891,
            "loandt": "",
            "sysprocseq": 0,
            "price": 8060,
            "janrt": "5.17",
            "jdat": 0,
            "jpms": 0,
            "hname": "프롬바이오",
            "appamt": 7166021,
            "sunikrt": "-46.39",
            "jonggb": "2",
            "msat": 0,
            "tax": 14362,
            "pamt": 15000,
            "jpmd": 0,
            "marketgb": "",
            "jangb": "",
            "dtsunik": -6200983,
            "expcode": "377220",
            "mdat": 0,
            "mpms": 0,
            "lastdt": ""
        },
        {
            "sininter": 0,
            "fee": 53322,
            "mamt": 177218079,
            "sinamt": 0,
            "mpmd": 0,
            "mdposqt": 0,
            "jsat": 0,
            "janqty": 177218079,
            "loandt": "",
            "sysprocseq": 0,
            "price": 0,
            "janrt": "68.61",
            "jdat": 0,
            "jpms": 0,
            "hname": "CMA RP",
            "appamt": 178267900,
            "sunikrt": "0.59",
            "jonggb": "9",
            "msat": 0,
            "tax": 0,
            "pamt": 0,
            "jpmd": 0,
            "marketgb": "",
            "jangb": "0",
            "dtsunik": 1049821,
            "expcode": "CMARP",
            "mdat": 0,
            "mpms": 0,
            "lastdt": ""
        }
    ],
    "rsp_msg": "조회가 완료되었습니다."
}

현물계좌 잔고내역(CSPAQ12300) 조회

주현물계좌 잔고내역(CSPAQ12300)를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
CSPAQ12300의 PATH는 "stock/accno"입니다. API가이드에서 확인하실 수 있습니다.

BASE_URL = "https://openapi.ebestsec.co.kr:8080"
PATH = "stock/accno"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "APP_KEY, APP_SECRET를 이용하여 발급받은 접근토큰"

다음으로는 header를 구성합니다.

header = {  
    "content-type":"application/json; charset=utf-8", 
    "authorization": f"Bearer {ACCESS_TOKEN}",
    "tr_cd":"CSPAQ12300", 
    "tr_cont":"N",
    "tr_cont_key":"",
}

다음으로 현물계좌 잔고내역 조회(CSPAQ12300)의 입력값을 셋팅합니다.

  1. BalCreTp 잔고생성구분,
  2. CmsnAppTpCode 수수료적용구분,
  3. D2balBaseQryTp D2잔고기준 조회구분,
  4. UprcTpCode 단가구분
body = {
    "CSPAQ12300InBlock1" : 
    {    
        "RecCnt" : 1,    
        "BalCreTp" : "0",    
        "CmsnAppTpCode" : "0",    
        "D2balBaseQryTp" : "0",    
        "UprcTpCode" : "0"  
    }  
}

모든 입력값을 셋팅후 조회 요청을 합니다.

requset = requests.post(URL, headers=header, data=json.dumps(body))
requset.json()

*결과값

CSPAQ12300은 세개의 CSPAQ12300OutBlock1, CSPAQ12300OutBlock2, CSPAQ12300OutBlock3 으로 나누어져 있으며, 결과값 및 메세지코드, 메세지를 을 확인할 수 있습니다.

{
    "rsp_cd": "00136",
    "CSPAQ12300OutBlock2": {
        "BuyAdjstAmtD2": 0,
        "KdqOrdAbleAmt": 0,
        "PrdayKdqMnyMgn": 0,
        "D2CmsnAmt": 0,
        "D1EvrTax": 0,
        "CrdayFrbrdMnyMgn": 0,
        "RepayRqrdAmtD2": 0,
        "D1CmsnAmt": 0,
        "CrdayCrbmkMnyMgn": 0,
        "BrnNm": "",
        "PrdayFrbrdMnyMgn": 0,
        "BalEvalAmt": 0,
        "EvalPnlSum": 0,
        "PrdayFrbrdSubstMgn": 0,
        "CrdayKdqSubstMgn": 0,
        "RepayRqrdAmtD1": 0,
        "CrdayKseCrdtMnyMgn": 0,
        "PrdayKdqSubstMgn": 0,
        "PrdayKseMnyMgn": 0,
        "D2EvrTax": 0,
        "MnyOrdAbleAmt": 0,
        "DpspdgQty": 0,
        "SellAdjstAmtD2": 0,
        "PrcAdjstAmt": 0,
        "EtclndAmt": 0,
        "Evrprc": 0,
        "CrdayKdqCrdtSubstMgn": 0,
        "PrdaySellExecAmt": 0,
        "MnyMgn": 0,
        "MgnRat100pctOrdAbleAmt": 0,
        "PrdayKseSubstMgn": 0,
        "OrdDt": "",
        "CrdayCrbmkSubstMgn": 0,
        "InvstPlAmt": 0,
        "D1SettPrergAmt": 0,
        "D2SettPrergAmt": 0,
        "SeOrdAbleAmt": 0,
        "Dps": 0,
        "DpsastTotamt": 0,
        "PrdayBuyExecAmt": 0,
        "D2Dps": 0,
        "CrdtPldgOrdAmt": 0,
        "CrdayKdqMnyMgn": 0,
        "SubstMgn": 0,
        "LoanAmt": 0,
        "PrdayKdqCrdtSubstMgn": 0,
        "PrdayKdqCrdtMnyMgn": 0,
        "InvstOrgAmt": 0,
        "PchsAmt": 0,
        "CrdayFrbrdSubstMgn": 0,
        "PrdayKseCrdtMnyMgn": 0,
        "CrdayBuyExecAmt": 0,
        "PrdayCrbmkMnyMgn": 0,
        "CrdayKdqCrdtMnyMgn": 0,
        "RcvblAmt": 0,
        "HtsOrdAbleAmt": 0,
        "PrdayCrbmkSubstMgn": 0,
        "CrdayKseCrdtSubstMgn": 0,
        "D1Dps": 0,
        "RecCnt": 1,
        "PnlRat": "0.000000",
        "PrdayKseCrdtSubstMgn": 0,
        "AcntNm": "",
        "MnyoutAbleAmt": 0,
        "CrdaySellExecAmt": 0,
        "CrdayKseMnyMgn": 0,
        "SubstAmt": 0,
        "RuseAmt": 0,
        "CrdayKseSubstMgn": 0
    },
    "CSPAQ12300OutBlock1": {
        "RecCnt": 1,
        "UprcTpCode": "0",
        "AcntNo": "00000000000",
        "D2balBaseQryTp": "0",
        "Pwd": "********",
        "CmsnAppTpCode": "0",
        "BalCreTp": "0"
    },
    "CSPAQ12300OutBlock3": [
        {
            "BuyUnercQty": 0,
            "SecBalPtnNm": "유가KSE",
            "BuyUnsttQty": 0,
            "SellUnercQty": 0,
            "UnercQty": 0,
            "SecBalPtnCode": "00",
            "PrdayBuyExecAmt": 0,
            "LoanDtlClssCode": "",
            "BalEvalAmt": 17892400,
            "BuyPrc": "0.0000",
            "SellOrdQty": 0,
            "AvrUprc": "62081.21",
            "BnsBaseBalQty": 1091,
            "SellUnsttQty": 0,
            "PchsAmt": 67730600,
            "PrdaySellExecPrc": "0.00",
            "PrdayCprc": "16400.00",
            "BalQty": 1091,
            "PrdaySellQty": 0,
            "EvalPnl": -49838200,
            "CrdayBuyExecAmt": 0,
            "PrdayBuyExecPrc": "0.00",
            "SellAbleQty": 1091,
            "OrdAbleAmt": 0,
            "MnyOrdAbleAmt": 0,
            "NowPrc": "16400.00",
            "CrdtAmt": 0,
            "SellPrc": "0.0000",
            "IsuNm": "일동제약",
            "CrdayBuyExecQty": 0,
            "DueDt": "",
            "PnlRat": "-0.735830",
            "PrdaySellExecAmt": 0,
            "IsuNo": "A249420",
            "CrdaySellExecQty": 0,
            "CrdaySellExecAmt": 0,
            "RegMktCode": "10",
            "LoanDt": "",
            "UnsttQty": 0,
            "PrdayBuyQty": 0,
            "SellPnlAmt": -49838200,
            "DpspdgLoanQty": 0
        },
        {
            "BuyUnercQty": 0,
            "SecBalPtnNm": "유가KOSDAQ",
            "BuyUnsttQty": 0,
            "SellUnercQty": 0,
            "UnercQty": 0,
            "SecBalPtnCode": "00",
            "PrdayBuyExecAmt": 0,
            "LoanDtlClssCode": "",
            "BalEvalAmt": 7181460,
            "BuyPrc": "0.0000",
            "SellOrdQty": 0,
            "AvrUprc": "15000.00",
            "BnsBaseBalQty": 891,
            "SellUnsttQty": 0,
            "PchsAmt": 13365000,
            "PrdaySellExecPrc": "0.00",
            "PrdayCprc": "8160.00",
            "BalQty": 891,
            "PrdaySellQty": 0,
            "EvalPnl": -6183540,
            "CrdayBuyExecAmt": 0,
            "PrdayBuyExecPrc": "0.00",
            "SellAbleQty": 891,
            "OrdAbleAmt": 0,
            "MnyOrdAbleAmt": 0,
            "NowPrc": "8060.00",
            "CrdtAmt": 0,
            "SellPrc": "0.0000",
            "IsuNm": "프롬바이오",
            "CrdayBuyExecQty": 0,
            "DueDt": "",
            "PnlRat": "-0.462667",
            "PrdaySellExecAmt": 0,
            "IsuNo": "A377220",
            "CrdaySellExecQty": 0,
            "CrdaySellExecAmt": 0,
            "RegMktCode": "20",
            "LoanDt": "",
            "UnsttQty": 0,
            "PrdayBuyQty": 0,
            "SellPnlAmt": -6183540,
            "DpspdgLoanQty": 0
        },
        {
            "BuyUnercQty": 0,
            "SecBalPtnNm": "",
            "BuyUnsttQty": 0,
            "SellUnercQty": 0,
            "UnercQty": 0,
            "SecBalPtnCode": "",
            "PrdayBuyExecAmt": 0,
            "LoanDtlClssCode": "",
            "BalEvalAmt": 178267900,
            "BuyPrc": "0.0000",
            "SellOrdQty": 0,
            "AvrUprc": "0.00",
            "BnsBaseBalQty": 177218079,
            "SellUnsttQty": 0,
            "PchsAmt": 177218079,
            "PrdaySellExecPrc": "0.00",
            "PrdayCprc": "0.00",
            "BalQty": 177218079,
            "PrdaySellQty": 0,
            "EvalPnl": 1049821,
            "CrdayBuyExecAmt": 0,
            "PrdayBuyExecPrc": "0.00",
            "SellAbleQty": 0,
            "OrdAbleAmt": 0,
            "MnyOrdAbleAmt": 0,
            "NowPrc": "0.00",
            "CrdtAmt": 0,
            "SellPrc": "0.0000",
            "IsuNm": "CMA RP",
            "CrdayBuyExecQty": 0,
            "DueDt": "",
            "PnlRat": "0.005924",
            "PrdaySellExecAmt": 0,
            "IsuNo": "",
            "CrdaySellExecQty": 0,
            "CrdaySellExecAmt": 0,
            "RegMktCode": "",
            "LoanDt": "",
            "UnsttQty": 0,
            "PrdayBuyQty": 0,
            "SellPnlAmt": 1049821,
            "DpspdgLoanQty": 0
        }
    ],
    "rsp_msg": "조회가 완료되었습니다."
}

실시간 데이터 (NWS) 뉴스 제목 패킷 조회

뉴스 제목 패킷 조회 (NWS)를 조회하는 예제입니다.
실시간 데이터의 프로토콜은 https가 아닌 웹소켓의 wss 프로토콜을 사용합니다.
포트는 9443포트 (모의투자 포트 29443)를 사용합니다.

BASE_URL = "wss://openapi.ebestsec.co.kr:9443/websocket"

먼저 웹 소켓 연결 (connect)을 한 후에,
아래와 같이 실시간 데이터의 header와 Body값을 구성하여 json방식으로 전송(send)합니다.

header

  • token : ACCESS_TOKEN
  • tr_type : TR타입 (1:계좌등록, 2계좌해제, 3:실시간 시세등록, 4:실시간 시세해제)

Body

  • tr_cd : 실시간 TR 코드 (계좌등록/해제 일경우 필수값 아님)
  • tr_key : 실시간 TR 코드 값 (계좌등록/해제 일경우 필수값 아님)
{
    "header":{      
        "token":"ZWd1RDVtcXFwYyJ9.SkZaYiVVJEnr4GCVezr_NGusyt7MhK2oaOrsdhkSNp4dlxtr6DUqofyRLjeNw....",
        "tr_type":"3"
    },
    "body":{
        "tr_cd": "NWS",
        "tr_key":"NWS001"
    }
}

모든 입력값을 셋팅후 조회 요청을 합니다.

# 웹 소켓 모듈을 선언한다.
import websockets
async def connect():
# 웹 소켓에 접속을 합니다.
    async with websockets.connect("wss://openapi.ebestsec.co.kr:9443/websocket") as websocket:
        str = '{header":{"token":"ZWd1RDVtcXFwYyJ9.SkZaYiV....","tr_type":"3"},"body":{"tr_cd": "NWS","tr_key":"NWS001"}}'
        # 웹 소켓 서버로 데이터를 전송합니다.
        await websocket.send(str);
        # 웹 소켓 서버로 부터 메시지가 오면 콘솔에 출력합니다.
        data = await websocket.recv();
        print(data);

*결과값

{
    "header": {
        "tr_cd": "NWS",
        "tr_key": "NWS001"
    },
    "body": {
        "date": "20230626",
        "code": "",
        "realkey": "202306261936442300001999",
        "bodysize": "4200",
        "time": "193644",
        "id": "23",
        "title": "삼성·한투증권, PF 신용공여 2조5000억원대… 업계 최대"
    }
}