API 적용 예제 (파이썬)
주식시간대별 체결(t1301) 조회
주식시간대별 체결(t1301)를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
t1301의 PATH는 "stock/market-data"입니다. API가이드에서 확인하실 수 있습니다.
BASE_URL = "https://openapi.ls-sec.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(LS증권), 특이거래량 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.ls-sec.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(LS증권), 특이거래량 cvolume는 0이상 조건으로 조회합니다.
body = {
"t1101InBlock" :
{
"shcode" : "078020",
}
}
모든 입력값을 셋팅후 조회 요청을 합니다.
requset = requests.post(URL, headers=header, data=json.dumps(body)) requset.json()
*결과값
t1101은 한개의 t1101OutBlock으로, 결과값 및 메세지코드, 메세지를 을 확인할 수 있습니다.
{
"t1101OutBlock":{
"hname":"LS증권",
"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.ls-sec.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)의 입력값을 셋팅합니다.
- prcgb 단가구분 (1:평균단가,2:BEP단가),
- chegb 체결구분 (0:결제기준잔고,2:체결기준잔고 - 잔고가 0이아 닌 종목만 조회) ,
- dangb 단일가구분 (0:정규장, 1:시간외단일가),
- charge 제비용 포함여부 (0:미포함,1:포함),
- 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.ls-sec.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)의 입력값을 셋팅합니다.
- BalCreTp 잔고생성구분,
- CmsnAppTpCode 수수료적용구분,
- D2balBaseQryTp D2잔고기준 조회구분,
- 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.ls-sec.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.ls-sec.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억원대… 업계 최대"
}
}