시스템트레이딩

업비트 시스템 트레이딩 시작

joggerin 2024. 5. 9. 16:58
728x90

0. Summary

1. 업비트 시스템트레이딩 첫 시도
2. 디버깅이 무척 힘들었음. 특히 jwt...
3. 업비트 예제 참고사이트로 우선 테스트 완료

 

1. 업비트 Open API 신청

● 업비트 Open API 신청

업비트를 가입한 후에 사이트에 들어가서 key값을 생성하여 프로그램에 넣어줘야 한다.https://www.upbit.com/service_center/open_api_guide

 

Open API 안내 | 업비트(UPbit)

업비트에서는 개발자와 사용자를 위해 Open API를 제공하고 있습니다. 업비트 API를 통해 마켓정보, 잔고 조회, 주문, 출금 등 다양한 기능을 활용해보세요.

upbit.com

 

"Open API 사용하기"를 클릭해서 key값을 생성하면 된다. 이때 주의할 점은 IP주소를 요구하는데, 이건 네이버에 아이피 주소 조회라고 하면 현재 내 IP가 나오니깐 이걸 넣어주면 된다.

업비트 open API 사용신청
업비트 open API 사용신청

 

2. 절대 주의 사항

Key 값은 2개가 있는데, 하나는 Secret Key, 또 다른 하나는 Access Key이다. 이 2개 Key는 절대 외부로 노출되서는 안되고, 누군가와 공유해서도 안된다. 잘 관리가 필요하여 별도로 적어놓는다.

 

3. 업비트 예제대로 해보기

● 업비트 예제 참고 사이트

아래 사이트를 들어가보면 몇가지 예제가 있어서 나와있는대로 진행을 해봤다. 

https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EA%B3%84%EC%A2%8C-%EC%A1%B0%ED%9A%8C

 

Open API | 업비트 개발자 센터

 

docs.upbit.com

● 업비트 예제  동작

아래는 해당 내용을 캡쳐한 그림이다. 간단히 설명하면 필요한 라이브러리들을 import하고 (없으면 pip로 설치) 미리 가입해서 받아놓은 access key와 secret key를 이용하여 해당 서버에 정보를 요청하는 것이다. 모든 프로그램이 그렇듯이 한번에 되는 경우는 없는데, 과연 이번에 잘 되는지 한번 복사해서 넣어봤다.

 

당연하게도 잘 되지 않았다. 우선 os.environ 에서 환경변수를 읽어와야 되는데, 그냥 돌렸다. 그 부분을 수정하고 진행을 했고, key값을 잘못넣어서 발생한 에러도 있었다. 그 중에 제일 힘들게 했던 에러는 "import jwt"에서 나왔다.

업비트 자산조회 예제(출처: 업비트)
업비트 자산조회 예제(출처: 업비트)

 

4. 디버깅

● 1차시도: DLL importing 실패 메세지 (_rust) 

"import jwt"로 인해서 한참 고생하였다.

위 라이브러리를 import시 아래와 같은 메세지 나왔다

ImportError                               Traceback (most recent call last)
Cell In[7], line 3
      1 import os
      2 import cryptography
----> 3 import jwt

File c:\Users\ksmhome\AppData\Local\Programs\Python\Python39\lib\site-packages\jwt\__init__.py:1
----> 1 from .api_jws import (
      2     PyJWS,
      3     get_unverified_header,
      4     register_algorithm,
      5     unregister_algorithm,
      6 )
      7 from .api_jwt import PyJWT, decode, encode
      8 from .exceptions import (
      9     DecodeError,
     10     ExpiredSignatureError,
   (...)
     22     PyJWTError,
     23 )

File c:\Users\ksmhome\AppData\Local\Programs\Python\Python39\lib\site-packages\jwt\api_jws.py:6
      3 from collections.abc import Mapping
      4 from typing import Any, Dict, List, Optional, Type
...
      9 )
     10 from cryptography.hazmat.primitives import hashes
     13 class ExtensionOID:

 

첨에는 구글 검색을 통해서 해결하려고 했으나, 최근에는 chatGPT로 디버깅을 많이 한다고 해서, 최신 트렌드를 따라가보기 위해 AI를 이용하여 디버깅을 시도해보았고 그 결과는 아래와 같다.

이 문제는 cryptography 패키지에서 발생하는 것으로 보입니다. jwt 패키지가 cryptography를 사용하고 있는데, 해당 패키지의 Rust 바인딩인 _rust를 로드하는 과정에서 DLL을 찾을 수 없다는 오류가 발생했습니다.

해결 방법으로는 다음을 시도해 볼 수 있습니다:

  1. cryptography 패키지 재설치: 가끔씩 패키지가 손상되어있거나 설치가 올바르게 이루어지지 않았을 수 있습니다. cryptography 패키지를 제거한 후에 다시 설치해 보세요.
  2.  
    pip uninstall cryptography pip install cryptography
  3. Copy code
  4. cryptography 및 관련 의존성 재설치: 다른 의존성과 함께 cryptography를 다시 설치하고, 필요한 DLL 파일을 시스템에 추가해 보세요.
  5. cryptography 버전 다운그레이드: 경우에 따라 특정 버전의 cryptography가 문제를 일으키는 것이 있습니다. 다른 버전의 cryptography를 설치하여 문제를 해결해 보세요.
  6. Copy code
    pip install cryptography=={버전}
  7. Python 환경 재설정: 가끔씩 Python 환경을 완전히 초기화하고 새로운 가상 환경을 만들어 문제를 해결할 수 있습니다.
  8. 시스템 업데이트: 운영 체제 및 관련 패키지를 최신 상태로 업데이트하여 문제가 해결되었는지 확인해 보세요.

이러한 단계를 시도한 후에도 문제가 지속된다면, 패키지의 이슈 트래커나 공식 지원 채널을 통해 도움을 요청할 수 있습니

다.

(그대로 붙이니깐 뭔가 이상하게 복붙이 되었다)

 

1. 순서대로 cryptography 재설치를 해보았으나 실패를 했다.

2. 다운버전 그레이드도 실패했다.

3. 파이썬 환경 재설정도 실패했다.

 

우선 1차시도는 모두 동일하게 실패한 결과를 얻었다.

 

● 2차시도: DLL importing 실패 메세지 (_rust) 

우선 1차적으로 chatGPT에서 제시한 디버깅은 모두 실패했다. 그래서 jwt에 대해서 좀 더 알려달라고 하면서 질문을 추가했더니 아래와 같은 답변을 받았다

jwt 패키지에는 encode라는 속성이 없는 것 같습니다. 보통 encode와 decode 함수는 PyJWT 클래스 내에서 사용됩니다. 따라서 올바르게 PyJWT를 임포트하고 사용해야 합니다.

 

1. PyJWT를 설치했으나 제대로 동작하지 않았다.결

2. 혹시나 싶어서 jwt를 uninstall했다.

3. PyJWT도 uninstall 후 재설치 했다.

4. 성공!! 

 

결국엔 재설치가 답이었고, jwt 대신에 PyJWT를 이용하니깐 해당 부분이 넘어갔다.

 

 

5. 비트코인 매수해보기

● 비트코인 매수해보기

실제 잘 동작하는지 확인해보기 위해서 비트코인을 매수해봤다. 시장가로 설정하면 바로 매수가 되기에 퀵 테스트하기에는 이게 적합해보였다. 아래 코드도 업비트 개발자 센터에 가이드로 나와있고 order type만 price로 선택하여 진행했다. 아래와 같이 설정하고 run을 하니깐 앱 알람으로 비트코인 체결 메세지가 발생했다. 

 

기본적으로 잘 동작하는 것을 확인했고, 

params = {
  'market': 'KRW-BTC',
  'side': 'bid',
  'ord_type': 'price',
  'price': '5001',
}
query_string = unquote(urlencode(params, doseq=True)).encode("utf-8")

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

payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash': query_hash,
    'query_hash_alg': 'SHA512',
}

jwt_token = jwt.encode(payload, secret_key)
authorization = 'Bearer {}'.format(jwt_token)
headers = {
  'Authorization': authorization,
}

res = requests.post(server_url + '/v1/orders', json=params, headers=headers)
res.json()

 

 

* 투자는 항상 본인의 선택이고 그에 따른 결과도 책임을 져야 한다.

* 해당 포스트 뿐만 아니라 이 블로그의 모든 글은 개인적인 의견일 뿐이니 조심해야 한다.

728x90