본문 바로가기
코인자동매매/업비트

업비트로 현재 수익률 확인하기(파이썬)

by 영혼의 길 2022. 3. 1.
반응형

안녕하세요

현재 업비트에서 여태까지 수익률이 표현이 되지 않아서 한번 만들어 봤습니다.

 

나중에 코딩 실력이 늘게 되면 연도별, 혹은 월별 수익률을 만들어 보겠습니다.

 

만들었는데 사실 왜 이렇게 되는지 잘 모르고 만들었어요(특히 쿼리 부분..)

 

제가 이론적인 지식이 있는 게 아니라 맨땅에 헤딩하는 식으로 만든 거라 고수분이 보시기에는 허접할 수도..ㅎㅎ

 

일단 OPEN API키가 있어야 합니다.

비트코인 자동매매하기 2편(Open API받기)

 

기본적인 내용은 업비트 개발자 센터에서 입금 및 출금 내용을 이용하였습니다.

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com

 

여러 번 제가 원하는 프로그램을 만들어본 결과 차례차례 만드는 것이 제일 중요하더라고요.

 

단계를 하나하나씩 설정하고 하면 조금씩 풀리는데 많은 것을 하려고 하면 절 때 안 되더라고요.

 

그래서 단계를 생각했습니다.

 

1. 출금한 돈 불러오기

2. 입금한 돈 불러오기

3. 위 두 가지로 수익률 구하기로 했습니다.

 

 

1. 출금한 돈 불러오기

 

위에 업비트 개발자 센터를 들어갑니다.

여기 보면 입금 리스트 조회에서 오른쪽에 검은 부분에 코딩이 나와있습니다.

 

기본적으로 여길 이용했고 이상하게 제가 query부분에  'currency' : krw 이런 쿼리를 넣으면 실행이 안 되더라고요ㅡㅡ(분명 홈페이지에는 되는데)

 

그래서 쿼리 부분을 비워두니 결과 값이 나왔고 위에 OS. environ 부분도 이걸 넣으니까 왜 안되는지 모르겠지만 안돼서 뺐습니다.(보안 문제 생기나??ㅠㅠ)

 

txid 부분도 안돼서 제거했고요.(맨 아래 최종 있어요.)

 

그렇게 결과가 나오면 [{'currnecy' : 'krw', 'state' = 'done'......}, {'currnecy' : 'krw', 'state' = 'done'...}, ] 이런 식으로 나옵니다.

제가 이리저리 블로그& 구글링을 해본 결과 dictinoary 구조인데 list안에 dictionary가 있는 구조였습니다.(딕셔너리 구조 위에 사진에서 첫 번째  type : withdraw처럼 type을 찾으면 withdraw가 출력되는 식의 key : value형태)

이러한 정보에서 내가 원하는 정보를 찾아야 합니다.

 

여기서 포기하고 만들지 않을 뻔했는데 아까 위에서 말한 대로 천천히 단계를 찾아서 하기로 했습니다.

 

1. list 0일 때 1일 때 2일 때 3일 때 각각의 딕션 어리가 나온다(거래 한 번에 하나씩 생성되는 것 같아 보임)

->그럼 0일 때 하나의 딕션어리에서 조건에 맞으면 넣고 아니면 제외해야 한다.

->조건 : 상태가 done인 것을 찾고, currency가 krw인 것의 정보가 필요.

 

2. 반복문을 모르니 반복문을 공부하고 만들어보자!ㅠㅠ

 

i = 0
w = 0
e = 0
while i < len(wid.json())  :
    wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
    if wid2['state'] == 'DONE' :
        if wid2['currency']=='KRW' :
            w = float(wid2['amount'])
            e = e + w
    i = i +1

초기 i=0이고 i가 len(wid.json())이라는 리스트 숫자(개수) 보다 적다.

list 0을 넣고 만약에 state가 done이고 wid2 currency가 krw이면

 

w에 amount 값을 실수(수학에서 실수)로 저장해라 라는 뜻입니다.

 

e는 W 값을 저장하기 위해 새로 만들어 주었고요. i는 1씩 증가해야 하니까 i +1을 넣었습니다.

 

그럼 i가 0 , 1, 2.... 등등 리스트에 있는 숫자만큼 반복을 하게 됩니다. 

 

만약에 state와 currency 조건에 맞지 않을 경우 값이 저장되지 않습니다.

 

이렇게 해서 입금된 값을 구했습니다.

-> 나중에 월별, 연도별로 보고 싶으면 조건에서 연도별로 자르면 될 것 같습니다.

 

2. 입금한 돈 불러오기

거의 마찬가지입니다. 

 

 

여기서 두 개를 합쳐야 하는데 두 개가 코딩이 거의 똑같고 

 

res = requests.get(server_url + "/v1/deposits",params=query_string, headers=headers )

 

마지막에 요거만 다릅니다. 변수를 같은 것 넣는 것은 좀 그래서 res 대신 wid라고 이름을 붙였고요

 

출금 정보는 vi/withdraws에 있고 입금정보는 vi/deposits에 있습니다.

 

그래서 나머지는 공통이니까 한 줄만 추가해서 결과를 보는데 아래 있는 출금 정보가 안 나오더라고요.

 

뭐 에러 메시지도 조건에 걸러져서 출금 = 0 이렇게 나오더군요

 

중간에 어디서 잘못된 건지 찾아보니까 메시지에 뭔가 겹친다고 나와서 그냥 처음부터 끝까지 복사했습니다. 

 

3. 현재 가지고 있는 돈은 간단히 pyupbit로 해결이 가능합니다.

 

현금 + 가지고 있는 비트코인 수량 * 현재 가격.... 요런식으로요.

 

그래서 입금한 돈에서 출금한 돈을 빼고 현재 가지고 있는 코인의 가치로 나눠서 구했습니다.

 

사실 생각해보니 이것도 내가 가지고 있는 코인의 정보를 받고 그 코인의 현재 시가를 받으면 될 것 같은데 일단은 수동으로 하겠습니다.

 

완성본(더 아래 수정본있음)

 

import pyupbit
import jwt    # PyJWT 
import uuid
import hashlib
from urllib.parse import urlencode
import requests


# query는 dict 타입입니다.
access_key = '개인 OPEN API 키'
secret_key = '개인 OPEN API 키'
server_url = 'https://api.upbit.com/'

upbit = pyupbit.Upbit(access_key, secret_key)

aa = upbit.get_balance("KRW")
bb = upbit.get_balance("KRW-BTC") * pyupbit.get_current_price("KRW-BTC")
cc = upbit.get_balance("KRW-XRP") * pyupbit.get_current_price("KRW-XRP")
dd = upbit.get_balance("KRW-DOGE") * pyupbit.get_current_price("KRW-DOGE")
f = upbit.get_balance("KRW-ETH") * pyupbit.get_current_price("KRW-ETH")
ee = aa + bb + cc+ dd + f

#--------------------------------------------------------------------
query ={
}
query_string = urlencode(query).encode()

m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()

payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash_alg': 'SHA512',
}
    
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}


res = requests.get(server_url + "/v1/deposits",params=query_string, headers=headers )

#print(res.json()[0])

#print(len(res.json()))

#딕셔너리가 리스트 안에 있다. 이게 내 결론.

k = 0
d = 0
a = 0
while k < len(res.json())  :
    res2 = res.json()[k] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
    if res2['state'] == 'ACCEPTED' :
        if res2['currency']=='KRW' :
            a = float(res2['amount'])
            d = d + a
    k = k +1
    
#----------------------------------------------------------------------------------------------


query ={
}
query_string = urlencode(query).encode()

m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()

payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash_alg': 'SHA512',
}
    
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}


wid = requests.get(server_url + "/v1/withdraws",params=query_string, headers=headers )

i = 0
w = 0
e = 0
while i < len(wid.json())  :
    wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
    if wid2['state'] == 'DONE' :
        if wid2['currency']=='KRW' :
            w = float(wid2['amount'])
            e = e + w
    i = i +1




print("입급한 돈 =",d)
print("출금한 돈 =", e)
print("net =",d-e )
print("업비트 =", ee)

kkk = round(ee/(d-e)*100-100, 1)
print(kkk, '%')
 

완성했습니다.

 

이걸 완성하는데 걸린시간은 약 6시간..ㅋㅋㅋㅋㅋ 으 두시간이면 만들 줄 알았는데..

이걸로 코딩실력이 늘었다고 생각해야겠네요.ㅎㅎ

 

요것도 메시지에 넣을까 생각중입니다.

비트코인 및 김프 시세 메신저로 받기 (1)

 

비트코인 및 김프 시세 메신저로 받기 (1)

안녕하세요 오늘은 비트코인 시세 및 김치 프리미엄 시세를 받는 방법에 대하여 포스팅하려고 합니다. 맨날 들어가서 확인하기 귀찮으셨죠? 저는 그래서 아침마다 저한테 메시지가 오도록 만들

young0823.tistory.com

비트코인 및 김프 시세 메신저로 받기 (2)

 

비트코인 및 김프 시세 메신저로 받기 (2)

안녕하세요 비트코인 및 김프시세 받기 2탄입니다. 어후 한편에 끝내려고 했는데 slack메신저와 저거하면 한세월 걸릴 것 같아 2편으로 만들었습니다. 필요한 정보가 3개 있었습니다 1. 환율정보 2

young0823.tistory.com

 

+ 수정

 

추가했습니다. 위에 것은 수동적으로 자신이 가지고 있는 것으로 수정을 해야 한다면 지금은 아애 리스트를 뽑아서 그에 해당하는 가격을 곱하도록 만들었습니다.

 

수정본

# 입금 리스트 조회 
# https://docs.upbit.com/reference/%EC%9E%85%EA%B8%88-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C


import pyupbit
import jwt    # PyJWT 
import uuid
import hashlib
from urllib.parse import urlencode
import requests


# query는 dict 타입입니다.
access_key = '' 본인 값
secret_key = '' 본인 값
server_url = 'https://api.upbit.com/'



upbit = pyupbit.Upbit(access_key, secret_key)

k="0"
kk = "KRW-"

qwe = 0

d=0
ddd =  upbit.get_balances()

while qwe < len(ddd) :
    a = ddd[qwe]['currency']
    qer = ddd[qwe]['avg_buy_price']
    ok = 0
    if qer == k :
        pass
    else :
        cc = kk + a
        ok = upbit.get_balance(cc)*pyupbit.get_current_price(cc)
    d = d + ok
    qwe = qwe +1

total = d + upbit.get_balance()



#--------------------------------------------------------------------
query ={
}
query_string = urlencode(query).encode()

m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()

payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash_alg': 'SHA512',
}
    
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}


res = requests.get(server_url + "/v1/deposits",params=query_string, headers=headers )

#print(res.json()[0])

#print(len(res.json()))

#딕셔너리가 리스트 안에 있다. 이게 내 결론.

k = 0
d = 0
a = 0
while k < len(res.json())  :
    res2 = res.json()[k] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
    if res2['state'] == 'ACCEPTED' :
        if res2['currency']=='KRW' :
            a = float(res2['amount'])
    d = d + a
    k = k +1
    
#----------------------------------------------------------------------------------------------


query ={
}
query_string = urlencode(query).encode()

m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()

payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash_alg': 'SHA512',
}
    
jwt_token = jwt.encode(payload, secret_key)
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}


wid = requests.get(server_url + "/v1/withdraws",params=query_string, headers=headers )

i = 0
w = 0
e = 0
while i < len(wid.json())  :
    wid2 = wid.json()[i] #그래서 이게 0번이 들어간다고 치고 저장하면 이건 딕셔너리로 생각해야됨.
    if wid2['state'] == 'DONE' :
        if wid2['currency']=='KRW' :
            w = float(wid2['amount'])
    e = e + w
    i = i +1




print("입급한 돈 =",d)
print("출금한 돈 =", e)
print("net =",d-e )
print("업비트 =", total)

kkk = round(total/(d-e)*100-100, 1)
print('수익률 =', kkk, '%')
    


#원하는 것
#일단 전체에서 value가 KRW인 것과, ACCEPTED 인것은 분류하고 그중에 key가 amount의 value를 출력한다.
#단 반복문 사용.
반응형

댓글