Open API 샘플코드 (파이썬)

접근토큰 발급

발급받은 Appkey, Appsecret을 통해 접근토큰을 발급받는 예제입니다.
접근토큰 발급 URL은 "https://openapi.db-fi.com: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.db-fi.com: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.db-fi.com:8443/api/v1/trading/kr-stock/order"입니다. 명세는 API가이드에서 확인하실 수 있습니다.

라이브러리 import 및 url, Access Token 설정

# requests 모듈 설치 필요 (pip install requests)
import requests
import json

BASE_URL = "https://openapi.db-fi.com: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.db-fi.com: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.db-fi.com: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.db-fi.com: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.db-fi.com: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.db-fi.com: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"
}