Open API 샘플코드 (파이썬)
접근토큰 발급
발급받은 Appkey, Appsecret을 통해 접근토큰을 발급받는 예제입니다.
접근토큰 발급 URL은 "https://openapi.dbsec.co.kr:8443/oauth2/token"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, appkey,appsecert 설정
# requests,Json 라이브러리 설치 필요 (pip install requests)
import requests
import json
appkey = '발급받은 appkey'
appsecret = '발급받은 appsecret'
# URL 및 파라미터 세팅
URL = 'https://openapi.dbsec.co.kr:8443/oauth2/token?appkey={0}&appsecretkey={1}&grant_type=client_credentials&scope=oob'.format(appkey,appsecret)
header 설정
headers = {
"content-type":"application/x-www-form-urlencoded",
}
토큰발급 정보 세팅 후 URL로 발급요청
res = requests.post(URL, headers=headers,verify=False)
rescode = res.status_code
# 응답이 정상일 경우 발급받은 엑세스토큰 출력
if rescode == 200:
print('response code : ', str(rescode))
print('액세스토큰이 발급되었습니다.')
print(json.loads(res.text))
# 응답이 비정상일 경우 에러메세지 출력
else:
print("Error Code : " + str(rescode) + " | " + res.text)
응답값
response code : 200
액세스토큰이 발급되었습니다.
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjE4Y2E4ZjNiLWMyYzEtNDE4MC05YjM0LTUwZGY3OTQ0NjA3MyIsIm5iZiI6MTcwODk5NDc5NiwiZ3JhbnRfdHlwZSI6IkNsaWVudCIsImlzcyI6InVub2d3IiwiZXhwIjoxNzA5MDgxMTk2LCJpYXQiOjE3MDg5OTQ3OTYsImp0aSI6IlBTcXpTaTdqOFlZQk94RThQc0p5eUxzeXFMSEZnaHpzaUpLRiJ9.cwMQVW3nQ37IywoVmkjSa_qPM6aoq4FUfWp-cN9z5guf2i22Y_pBmRZbW7F3STuKP7x_dNoGT3sG8HGUhkn5Zw",
"scope": "login",
"token_type": "Bearer",
"expires_in": 86400
}
국내주식 주문 (시장가)
주식종합주문(시장가)를 실행하는 예제입니다. 우선 기본 정보값을 확인합니다.
국내주식주문(CSPAT00600)URL은 "https://openapi.dbsec.co.kr:8443/api/v1/trading/kr-stock/order"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests)
import requests
import json
BASE_URL = "https://openapi.dbsec.co.kr:8443"
PATH = "api/v1/trading/kr-stock/order"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = {
"content-type":"application/json; charset=utf-8",
"authorization": f"Bearer {ACCESS_TOKEN}",
"cont_yn":"",
"cont_key":"",
}
주식주문을 위한 Body 설정 (상세 입력값은 API 가이드 참고 부탁드립니다)
종목코드 (IsuNo) 는 A005930(삼성전자), 주문수량 5주, 시장가 매수주문으로 설정 합니다.
# 시장가 주문 함수 생성 (입력값: 종목코드, 주문수량, 주문가[시장가 주문시 0], 매수/매도구분, 호가유형구분[시장가 주문시 03])
def set_order(IsuNo,OrdQty,OrdPrc,BnsTpCode,OrdprcPtnCode):
body = {
"In": {
"IsuNo": IsuNo,
"OrdQty": OrdQty,
"OrdPrc": OrdPrc,
"BnsTpCode": BnsTpCode,
"OrdprcPtnCode": OrdprcPtnCode,
"OrdCndiTpCode": "0",
"MgntrnCode": "000"
}
}
return json.dumps(body)
모든 입력값을 세팅후 주문 요청.
res = requests.post(URL, headers=header,data=set_order("A005930",5,0,"2","03"),verify=False)
rescode = res.status_code
if rescode == 200:
#print(res.headers)
#print(str(rescode))
print(json.dumps(res.json(), ensure_ascii=False, indent=3))
else:
print("Error Code : " + str(rescode))
print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
주문결과값(주문번호, 주문시각, 종목코드, 현금주문금액,한글종목명) 및 메세지를 확인 가능합니다.
{
"Out": {
"OrdNo": 507,
"OrdTime": "084116877",
"ShtnIsuNo": "A005930",
"SpotOrdQty": 0,
"MnyOrdAmt": 475500,
"IsuNm": "삼성전자"
},
"rsp_cd": "00000",
"rsp_msg": "매수 주문이 완료되었습니다."
}
국내주식 현재가 조회
국내주식 현재가를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
국내주식주문(PRICE)URL은 "https://openapi.dbsec.co.kr:8443/api/v1/quote/kr-stock/inquiry/price"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests)
import requests
import json
BASE_URL = "https://openapi.dbsec.co.kr:8443"
PATH = "api/v1/quote/kr-stock/inquiry/price"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = {
"content-type":"application/json; charset=utf-8",
"authorization": f"Bearer {ACCESS_TOKEN}",
"cont_yn":"",
"cont_key":"",
}
주식현재가조회 위한 Body 설정 (상세 입력값은 API 가이드 참고 부탁드립니다)
시장구분(InputCondMrktDivCode)은 "J"(주식), 종목코드(InputIscd1)는 "A005930" (삼성전자)로설정 합니다.
# 국내주식 현재가 조회 함수 생성 (입력값: 시장구분, 종목코드)
def get_price(InputCondMrktDivCode,InputIscd1):
body = {
"In": {
"InputCondMrktDivCode": InputCondMrktDivCode,
"InputIscd1": InputIscd1
}
}
return json.dumps(body)
모든 입력값을 세팅후 조회 요청.
res = requests.post(URL, headers=header,data=get_price("J","A005930"),verify=False)
rescode = res.status_code
if rescode == 200:
#print(res.headers)
#print(str(rescode))
print(json.dumps(res.json(), ensure_ascii=False, indent=3))
else:
print("Error Code : " + str(rescode))
print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
조회를 요청한 종목의 현재가 정보를 확인 가능합니다.
{
"Out": {
"Sdpr": "73200",
"Prpr": "73200",
"Mxpr": "95100",
"Llam": "51300",
"Oprc": "73200",
"SdprVrssMrktRate": "0.00",
"PrprVrssOprcRate": "-100.00",
"Hprc": "73200",
"SdprVrssHgprRate": "0.00",
"Lprc": "73200",
"SdprVrssLwprRate": "0.00",
"PrprVrssLwprRate": "-100.00"
},
"rsp_cd": "00000",
"rsp_msg": "정상 처리 되었습니다."
}
주식잔고조회
국내주식잔고(CSPAQ03420)조회를 실행하는 예제입니다. 우선 기본 정보값을 확인합니다.
주식잔고조회(CSPAQ03420)URL은 "https://openapi.dbsec.co.kr:8443/api/v1/trading/kr-stock/inquiry/balance"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests)
import requests
import json
BASE_URL = "https://openapi.dbsec.co.kr:8443"
PATH = "api/v1/trading/kr-stock/order"
URL = f"{BASE_URL}/{PATH}"
ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = {
"content-type":"application/json; charset=utf-8",
"authorization": f"Bearer {ACCESS_TOKEN}",
"cont_yn":"",
"cont_key":"",
}
잔고조회 위한 Body 설정 (입력값이 없는 API 입니다.)
# 잔고조회 Body 함수 설정 (입력값이 없어 빈 body 설정)
def set_balance():
body = {
"In": {
}
}
return json.dumps(body)
모든 입력값을 세팅후 조회 요청.
res = requests.post(URL, headers=header,data=set_balance(),verify=False)
rescode = res.status_code
if rescode == 200:
#print(res.headers)
#print(str(rescode))
print(json.dumps(res.json(), ensure_ascii=False, indent=3))
else:
print("Error Code : " + str(rescode))
print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
주식잔고조회 API는 두개의 Out Block 으로 나누어져 있으며, 응답값 상세는 API 명세 참고 부탁드리겠습니다. 본문 데이터 출력 후엔 응답 메세지, 코드를 확인 가능하십니다.
{
"Out": {
"TotBuyAmt": 4065841,
"TotEvalAmt": 4016152,
"TotEvalPnlAmt": -49689,
"TotErnrat": "-0.0122",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0,
"CrdtBnsAmt": 0,
"DpsastAmt": 16761272,
"Dps2": 12745120
},
"Out1": [
{
"IsuNo": "A000270",
"IsuNm": "기아",
"BalQty": 0,
"BalQty0": 0,
"AbleQty": 0,
"ExecPrc": "83700.00",
"EvalAmt": 0,
"EvalPnlAmt": 0,
"Ernrat": "0.00000000",
"MnyAmt": 0,
"CrdtAmt": 0,
"PchsAmt": 0,
"LoanDt": "",
"DueDt": "",
"EvrTax": 0,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "119200.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A000660",
"IsuNm": "SK하이닉스",
"BalQty": 0,
"BalQty0": 0,
"AbleQty": 0,
"ExecPrc": "46450.00",
"EvalAmt": 0,
"EvalPnlAmt": 0,
"Ernrat": "0.00000000",
"MnyAmt": 0,
"CrdtAmt": 0,
"PchsAmt": 0,
"LoanDt": "",
"DueDt": "",
"EvrTax": 0,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "155900.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A000800",
"IsuNm": "경남기업",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "11000.00",
"EvalAmt": 6640,
"EvalPnlAmt": -4360,
"Ernrat": "-0.39630000",
"MnyAmt": 11000,
"CrdtAmt": 0,
"PchsAmt": 11000,
"LoanDt": "",
"DueDt": "",
"EvrTax": 11,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "6640.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A004450",
"IsuNm": "삼화왕관",
"BalQty": 4,
"BalQty0": 4,
"AbleQty": 4,
"ExecPrc": "41950.00",
"EvalAmt": 130000,
"EvalPnlAmt": -37800,
"Ernrat": "-0.22520000",
"MnyAmt": 167800,
"CrdtAmt": 0,
"PchsAmt": 167800,
"LoanDt": "",
"DueDt": "",
"EvrTax": 234,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "32500.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A005930",
"IsuNm": "삼성전자",
"BalQty": 5,
"BalQty0": 5,
"AbleQty": 5,
"ExecPrc": "63403.60",
"EvalAmt": 362000,
"EvalPnlAmt": 44982,
"Ernrat": "0.14180000",
"MnyAmt": 317018,
"CrdtAmt": 0,
"PchsAmt": 317018,
"LoanDt": "",
"DueDt": "",
"EvrTax": 651,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "72400.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A006120",
"IsuNm": "SK디스커버리",
"BalQty": 4,
"BalQty0": 4,
"AbleQty": 4,
"ExecPrc": "62767.75",
"EvalAmt": 178800,
"EvalPnlAmt": -72271,
"Ernrat": "-0.28780000",
"MnyAmt": 251071,
"CrdtAmt": 0,
"PchsAmt": 251071,
"LoanDt": "",
"DueDt": "",
"EvrTax": 321,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "44700.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A012690",
"IsuNm": "모나리자",
"BalQty": 39,
"BalQty0": 39,
"AbleQty": 39,
"ExecPrc": "5420.00",
"EvalAmt": 111540,
"EvalPnlAmt": -99840,
"Ernrat": "-0.47230000",
"MnyAmt": 211380,
"CrdtAmt": 0,
"PchsAmt": 211380,
"LoanDt": "",
"DueDt": "",
"EvrTax": 200,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2860.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A018360",
"IsuNm": "삼성메디슨",
"BalQty": 10,
"BalQty0": 10,
"AbleQty": 10,
"ExecPrc": "8781.80",
"EvalAmt": 70000,
"EvalPnlAmt": -17818,
"Ernrat": "-0.20280000",
"MnyAmt": 87818,
"CrdtAmt": 0,
"PchsAmt": 87818,
"LoanDt": "",
"DueDt": "",
"EvrTax": 126,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "7000.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A024070",
"IsuNm": "WISCOM",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "4110.00",
"EvalAmt": 5130,
"EvalPnlAmt": -3090,
"Ernrat": "-0.37590000",
"MnyAmt": 8220,
"CrdtAmt": 0,
"PchsAmt": 8220,
"LoanDt": "",
"DueDt": "",
"EvrTax": 9,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2565.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A026970",
"IsuNm": "대백저축은행",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "1680.00",
"EvalAmt": 2050,
"EvalPnlAmt": 370,
"Ernrat": "0.22020000",
"MnyAmt": 1680,
"CrdtAmt": 0,
"PchsAmt": 1680,
"LoanDt": "",
"DueDt": "",
"EvrTax": 3,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2050.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A027410",
"IsuNm": "BGF",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "4160.00",
"EvalAmt": 7860,
"EvalPnlAmt": -460,
"Ernrat": "-0.05520000",
"MnyAmt": 8320,
"CrdtAmt": 0,
"PchsAmt": 8320,
"LoanDt": "",
"DueDt": "",
"EvrTax": 14,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "3930.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A042670",
"IsuNm": "HD현대인프라코어",
"BalQty": 39,
"BalQty0": 39,
"AbleQty": 39,
"ExecPrc": "7992.21",
"EvalAmt": 315900,
"EvalPnlAmt": 4204,
"Ernrat": "0.01340000",
"MnyAmt": 311696,
"CrdtAmt": 0,
"PchsAmt": 311696,
"LoanDt": "",
"DueDt": "",
"EvrTax": 568,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "8100.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A047820",
"IsuNm": "초록뱀미디어",
"BalQty": 10,
"BalQty0": 10,
"AbleQty": 10,
"ExecPrc": "22038.50",
"EvalAmt": 54000,
"EvalPnlAmt": -166385,
"Ernrat": "-0.75490000",
"MnyAmt": 220385,
"CrdtAmt": 0,
"PchsAmt": 220385,
"LoanDt": "",
"DueDt": "",
"EvrTax": 97,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "5400.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A049080",
"IsuNm": "기가레인",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "1884.00",
"EvalAmt": 1244,
"EvalPnlAmt": -640,
"Ernrat": "-0.33970000",
"MnyAmt": 1884,
"CrdtAmt": 0,
"PchsAmt": 1884,
"LoanDt": "",
"DueDt": "",
"EvrTax": 2,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "1244.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A051500",
"IsuNm": "CJ프레시웨이",
"BalQty": 3,
"BalQty0": 3,
"AbleQty": 3,
"ExecPrc": "35900.00",
"EvalAmt": 74250,
"EvalPnlAmt": -33450,
"Ernrat": "-0.31050000",
"MnyAmt": 107700,
"CrdtAmt": 0,
"PchsAmt": 107700,
"LoanDt": "",
"DueDt": "",
"EvrTax": 133,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "24750.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A055550",
"IsuNm": "신한지주",
"BalQty": 3,
"BalQty0": 3,
"AbleQty": 3,
"ExecPrc": "34655.67",
"EvalAmt": 129150,
"EvalPnlAmt": 25183,
"Ernrat": "0.24220000",
"MnyAmt": 103967,
"CrdtAmt": 0,
"PchsAmt": 103967,
"LoanDt": "",
"DueDt": "",
"EvrTax": 232,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "43050.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A060310",
"IsuNm": "3S",
"BalQty": 134,
"BalQty0": 134,
"AbleQty": 134,
"ExecPrc": "2472.57",
"EvalAmt": 383240,
"EvalPnlAmt": 51915,
"Ernrat": "0.15660000",
"MnyAmt": 331325,
"CrdtAmt": 0,
"PchsAmt": 331325,
"LoanDt": "",
"DueDt": "",
"EvrTax": 689,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2860.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A069500",
"IsuNm": "KODEX 200",
"BalQty": 22,
"BalQty0": 22,
"AbleQty": 22,
"ExecPrc": "27842.50",
"EvalAmt": 783970,
"EvalPnlAmt": 171435,
"Ernrat": "0.27980000",
"MnyAmt": 612535,
"CrdtAmt": 0,
"PchsAmt": 612535,
"LoanDt": "",
"DueDt": "",
"EvrTax": 1411,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "35635.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A080010",
"IsuNm": "이상네트웍스",
"BalQty": 13,
"BalQty0": 13,
"AbleQty": 13,
"ExecPrc": "7113.08",
"EvalAmt": 70850,
"EvalPnlAmt": -21620,
"Ernrat": "-0.23380000",
"MnyAmt": 92470,
"CrdtAmt": 0,
"PchsAmt": 92470,
"LoanDt": "",
"DueDt": "",
"EvrTax": 127,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "5450.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A091170",
"IsuNm": "KODEX 은행",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "7500.00",
"EvalAmt": 15660,
"EvalPnlAmt": 660,
"Ernrat": "0.04400000",
"MnyAmt": 15000,
"CrdtAmt": 0,
"PchsAmt": 15000,
"LoanDt": "",
"DueDt": "",
"EvrTax": 28,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "7830.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A095570",
"IsuNm": "AJ네트웍스",
"BalQty": 30,
"BalQty0": 30,
"AbleQty": 30,
"ExecPrc": "6111.33",
"EvalAmt": 143400,
"EvalPnlAmt": -39940,
"Ernrat": "-0.21780000",
"MnyAmt": 183340,
"CrdtAmt": 0,
"PchsAmt": 183340,
"LoanDt": "",
"DueDt": "",
"EvrTax": 258,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "4780.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A102280",
"IsuNm": "쌍방울",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "355.00",
"EvalAmt": 269,
"EvalPnlAmt": -86,
"Ernrat": "-0.24220000",
"MnyAmt": 355,
"CrdtAmt": 0,
"PchsAmt": 355,
"LoanDt": "",
"DueDt": "",
"EvrTax": 0,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "269.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A105840",
"IsuNm": "우진",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "8020.00",
"EvalAmt": 8460,
"EvalPnlAmt": 440,
"Ernrat": "0.05480000",
"MnyAmt": 8020,
"CrdtAmt": 0,
"PchsAmt": 8020,
"LoanDt": "",
"DueDt": "",
"EvrTax": 15,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "8460.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A114750",
"IsuNm": "와이디생명과학",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "4590.00",
"EvalAmt": 6280,
"EvalPnlAmt": -2900,
"Ernrat": "-0.31590000",
"MnyAmt": 9180,
"CrdtAmt": 0,
"PchsAmt": 9180,
"LoanDt": "",
"DueDt": "",
"EvrTax": 11,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "3140.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A122630",
"IsuNm": "KODEX 레버리지",
"BalQty": 13,
"BalQty0": 13,
"AbleQty": 13,
"ExecPrc": "12174.15",
"EvalAmt": 233415,
"EvalPnlAmt": 75151,
"Ernrat": "0.47480000",
"MnyAmt": 158264,
"CrdtAmt": 0,
"PchsAmt": 158264,
"LoanDt": "",
"DueDt": "",
"EvrTax": 420,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "17955.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A215100",
"IsuNm": "로보로보",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "7337.50",
"EvalAmt": 10080,
"EvalPnlAmt": -4595,
"Ernrat": "-0.31310000",
"MnyAmt": 14675,
"CrdtAmt": 0,
"PchsAmt": 14675,
"LoanDt": "",
"DueDt": "",
"EvrTax": 18,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "5040.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A244880",
"IsuNm": "나눔테크",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "2568.00",
"EvalAmt": 3065,
"EvalPnlAmt": 497,
"Ernrat": "0.19350000",
"MnyAmt": 2568,
"CrdtAmt": 0,
"PchsAmt": 2568,
"LoanDt": "",
"DueDt": "",
"EvrTax": 5,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "3065.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A267850",
"IsuNm": "아시아나IDT",
"BalQty": 0,
"BalQty0": 0,
"AbleQty": 0,
"ExecPrc": "16100.00",
"EvalAmt": 0,
"EvalPnlAmt": 0,
"Ernrat": "0.00000000",
"MnyAmt": 0,
"CrdtAmt": 0,
"PchsAmt": 0,
"LoanDt": "",
"DueDt": "",
"EvrTax": 0,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "17870.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A269620",
"IsuNm": "시스웍",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "2365.00",
"EvalAmt": 889,
"EvalPnlAmt": -1476,
"Ernrat": "-0.62410000",
"MnyAmt": 2365,
"CrdtAmt": 0,
"PchsAmt": 2365,
"LoanDt": "",
"DueDt": "",
"EvrTax": 1,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "889.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A321370",
"IsuNm": "센서뷰",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "4490.00",
"EvalAmt": 4150,
"EvalPnlAmt": -340,
"Ernrat": "-0.07570000",
"MnyAmt": 4490,
"CrdtAmt": 0,
"PchsAmt": 4490,
"LoanDt": "",
"DueDt": "",
"EvrTax": 7,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "4150.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A326030",
"IsuNm": "SK바이오팜",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "92500.00",
"EvalAmt": 92400,
"EvalPnlAmt": -100,
"Ernrat": "-0.00100000",
"MnyAmt": 92500,
"CrdtAmt": 0,
"PchsAmt": 92500,
"LoanDt": "",
"DueDt": "",
"EvrTax": 166,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "92400.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A344860",
"IsuNm": "이노진",
"BalQty": 5,
"BalQty0": 5,
"AbleQty": 5,
"ExecPrc": "2725.00",
"EvalAmt": 11675,
"EvalPnlAmt": -1950,
"Ernrat": "-0.14310000",
"MnyAmt": 13625,
"CrdtAmt": 0,
"PchsAmt": 13625,
"LoanDt": "",
"DueDt": "",
"EvrTax": 21,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2335.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A361390",
"IsuNm": "제노코",
"BalQty": 30,
"BalQty0": 30,
"AbleQty": 30,
"ExecPrc": "18233.33",
"EvalAmt": 471000,
"EvalPnlAmt": -76000,
"Ernrat": "-0.13890000",
"MnyAmt": 547000,
"CrdtAmt": 0,
"PchsAmt": 547000,
"LoanDt": "",
"DueDt": "",
"EvrTax": 847,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "15700.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A395400",
"IsuNm": "SK리츠",
"BalQty": 1,
"BalQty0": 1,
"AbleQty": 1,
"ExecPrc": "5840.00",
"EvalAmt": 3890,
"EvalPnlAmt": -1950,
"Ernrat": "-0.33390000",
"MnyAmt": 5840,
"CrdtAmt": 0,
"PchsAmt": 5840,
"LoanDt": "",
"DueDt": "",
"EvrTax": 7,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "3890.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
},
{
"IsuNo": "A408920",
"IsuNm": "메쎄이상",
"BalQty": 2,
"BalQty0": 2,
"AbleQty": 2,
"ExecPrc": "0.00",
"EvalAmt": 4770,
"EvalPnlAmt": 0,
"Ernrat": "0.00000000",
"MnyAmt": 0,
"CrdtAmt": 0,
"PchsAmt": 0,
"LoanDt": "",
"DueDt": "",
"EvrTax": 8,
"BnsCmsn": 0,
"SellCmsn": 0,
"ThdayBuyQty": 0,
"ThdaySellQty": 0,
"BuyRat": "0.000000",
"EvalRat": "0.00",
"NowPrc": "2385.00",
"ThdaySellAmt": 0,
"ThdayBuyAmt": 0,
"ThdayRlzPnlAmt": 0
}
],
"rsp_cd": "00000",
"rsp_msg": "조회가 완료되었습니다."
}
실시간 해외주식 체결가 조회
웹소켓을 통해 실시간 해외주식 체결가 (V60)를 조회하는 샘플 코드입니다.
실시간 해외주식 시세를 위해서는 실시간 시세 신청(무료)이 필요합니다. 코드 실행 전 시세신청 부탁드립니다.
실시간 데이터의 통신은 REST API가 아닌 wss (웹소켓)을 사용합니다.
접속포트는 운영-7070, 모의투자-17070 을 사용합니다.
BASE_URL = "wss://openapi.dbsec.co.kr:7070/websocket"
웹소켓을 통한 실시간 데이터 수신을 위해서는
1. 웹소켓 연결
2. 실시간데이터 요청값 전송
두 절차를 거쳐야 합니다.
header
- token : ACCESS_TOKEN
- tr_type : TR타입 (1: 실시간 시세 등록, 2: 실시간 시세 해제, 3: 계좌 등록)
Body
- tr_cd : 실시간 TR 코드
- tr_key : 실시간 TR 코드 값 (계좌등록/해제 TR 요청시 필수입력 X)
요청 Json 예시
{
"header": {
"token": f"{ACCESS_TOKEN}",
"tr_type": "1"
},
"body": {
"tr_cd": "V60",
"tr_key": "FNTSLA"
}
}
실시간 데이터 입력 값 세팅 후 데이터 요청을 합니다.
# 비동기실행, 웹소켓, Json 라이브러리 import
# 라이브러리가 설치되어 있지 않은 경우, pip install {라이브러리명} 으로 설치 하시기 바랍니다.
import asyncio
import websockets
import json
# 데이터 입력값 세팅
def data_set():
body = {
"header": {
"token": f"{ACCESS_TOKEN}",
"tr_type": "1"
},
"body": {
"tr_cd": "V60",
"tr_key": "FNTSLA"
}
}
return json.dumps(body)
# 비동기 웹소켓 접속함수 정의
async def ws_connect():
async with websockets.connect(URL) as websocket:
# 웹소켓 접속을 위한 데이터 전송 (header, body)
await websocket.send(data_set())
# Ctrl c 입력 전까지 반복문을 통해 수신받은 데이터 출력
while True:
await asyncio.sleep(0.5) # 0.5초 대기
data = await websocket.recv()
json_data = json.loads(data)
print(json.dumps(json_data["body"], ensure_ascii=False, indent=3))
try:
# asyncio 이벤트 루프를 가져옵니다.
loop = asyncio.get_event_loop()
# 이벤트 루프를 사용하여 웹소켓 연결 코루틴(비동기 함수)을 실행
loop.run_until_complete(ws_connect())
#예외처리
except KeyboardInterrupt:
print("사용자에 의해 중단됨. 웹소켓 연결을 종료합니다.")
except Exception as e:
print(f"예상치 못한 오류 발생: {e}")
*응답값
{
"tr_key": [
"FNTSLA"
]
}
{
"symbol": "FNTSLA",
"RealYn": "1",
"busidate": "20240228",
"locdate": "20240228",
"loctime": "110736",
"kordate": "20240229",
"kortime": "010736",
"open": "200.3100",
"OpenClr": "+",
"high": "204.5000",
"HighClr": "+",
"low": "198.4600",
"LowClr": "-",
"last": "204.3400",
"LastClr": "+",
"sign": "2",
"diff": "4.6100",
"DiffClr": "+",
"rate": "2.31",
"RateClr": "+",
"bid": "204.3400",
"BidClr": "+",
"bidsize": "168",
"ask": "204.3600",
"AskClr": "+",
"asksize": "78",
"exevol": "169",
"ExevolClr": "-",
"volume": "33461188",
"amount": "6752760869",
"SessionId": "0",
"BidExevolsum": "29195197",
"AskExevolsum": "4266511",
"rltv": "684.29",
"RltvClr": "+",
"clos": "199.7300"
}