-
업비트(Upbit)와 바이낸스(Binance) 재정거래(차익거래, Arbitrage) 파이썬(Python) 프로그램python 2024. 2. 11. 22:49
업비트(Upbit)와 바이낸스(Binance) 재정거래(Arbitrage) 파이썬(Python) 프로그램
업비트와 바이낸스 간에 재정거래를 해주는 파이썬 코드입니다.
큰 흐름은 다음과 같습니다.
1. 업비트 KRW 마켓과 와 바이낸스 USDT 마켓에 공통으로 상장되어 있는 코인 리스트를 얻는다.
2. 실시간 원-달러 환율 정보를 가져온다.(이 코드에서는 원달러 환율을 bithumb 거래소의 usdt-krw 가격을 이용하였음)
3. 바이낸스 A 코인의 USDT 가격을 2에서 구한 환율 정보를 이용해 KRW 가격으로 환산한다.
4. A코인의 업비트 거래소내 KRW 가치와 3에서 환산한 바이낸스 거래소의 KRW 가치를 비교한다.
5. 1에서 구한 코인 리스트를 이용하여 3과 4의 내용을 반복하여 가격차이를 출력한다.
6. 1에서 구한 모든 코인 중에 가격차이가 가장 큰 코인의 정보(코인 명, 가격차이)를 출력해준다.
7. 6의 정보를 본인의 카카오톡 계정에 메세지로 전송해준다.
8. 6에서 구한 코인을 가격이 낮은 거래소에서 매수해서 가격이 높은 거래소로 전송 후 매도해준다.
아래의 파이썬 코드는 1번~ 7번까지의 내용을 포함하였습니다.
7번까지의 기능을 위해서는 바이낸스 api, 업비트 api, 빗썸 api는 모두 공개 api를 사용하므로 본인 계정 api를 신청하지 않아도 됩니다.
다만 6번에서 카카오톡 본인 계정으로 메세지를 보내기 위해서는 https://developers.kakao.com/ 이 웹사이트에서 본인 계정을 만들어서 액세스 토큰, rest_uri, 리프레시 토큰 등을 얻어야 합니다. (자세한 내용은 해당 웹사이트를 참조해주세요.)
import requestsimport timeimport json
# 업비트 KRW 마켓에서 거래되는 코인 목록을 가져옵니다.def get_upbit_krw_tickers():response = requests.get(url)markets = response.json()krw_markets = [market['market'] for market in markets if market['market'].startswith('KRW-')]return krw_markets
# 바이낸스 USDT 마켓에서 거래되는 코인 목록을 가져옵니다.def get_binance_usdt_tickers():response = requests.get(url)prices = response.json()usdt_markets = [price['symbol'] for price in prices if price['symbol'].endswith('USDT')]return usdt_markets
# 업비트와 바이낸스에서 공통으로 거래되는 코인의 프리미엄을 계산합니다.def calculate_premiums():upbit_tickers = get_upbit_krw_tickers()binance_tickers = get_binance_usdt_tickers()
global exchange_rate
max_premium_value = 0.0max_coin_name = ''
# 업비트와 바이낸스에서 공통으로 거래되는 코인을 찾습니다.common_tickers = set([ticker.replace("KRW-", "") for ticker in upbit_tickers]) & set([ticker.replace("USDT", "") for ticker in binance_tickers])
for ticker in common_tickers:# 업비트 가격 조회upbit_price = requests.get(upbit_price_url).json()[0]['trade_price']
# 바이낸스 가격 조회binance_price = requests.get(binance_price_url).json()['price']
# 프리미엄 계산premium = (upbit_price - float(binance_price)*exchange_rate) / (float(binance_price)*exchange_rate) * 100
if premium > max_premium_value and ticker != 'BTG':max_premium_value = premiummax_coin_name = tickerprint(f"{ticker}: 업비트 가격 = {upbit_price}, 바이낸스 가격 = {binance_price}, 프리미엄 = {premium:.2f}%")return {max_coin_name:max_premium_value}
# 사용자 액세스 토큰access_token = '본인 계정의 카카오톡 액세스 토큰'client_id = '본인 계정의 카카오톡 rest_api'refresh_token = '본인 계정의 카카오톡 리프레시 토큰'
def refresh_access_token():global access_token"""리프레시 토큰을 사용하여 새 액세스 토큰을 요청합니다.
:param client_id: 애플리케이션의 클라이언트 ID:param refresh_token: 사용자의 리프레시 토큰:return: 새로 발급된 액세스 토큰"""payload = {'grant_type': 'refresh_token','client_id': client_id,'refresh_token': refresh_token}response = requests.post(url, data=payload)response_data = response.json()
if response.status_code == 200 and 'access_token' in response_data:access_token = response_data['access_token']# 필요한 경우, 새 리프레시 토큰도 저장할 수 있습니다.# new_refresh_token = response_data.get('refresh_token', refresh_token)print("뉴 액세스 토큰 : {}".format(access_token))else:print("액세스 토큰 갱신 실패:", response_data.get("error_description", "Unknown error"))
def send_message_to_kakao(message):headers = {'Authorization': f'Bearer {access_token}','Content-Type': 'application/x-www-form-urlencoded'}
data = {'template_object': json.dumps({'object_type': 'text','text': message,'link': {},'button_title': '웹사이트 방문'})}response = requests.post('https://kapi.kakao.com/v2/api/talk/memo/default/send', headers=headers, data=data)
if response.status_code != 200:print("메시지 전송 실패:", response.json())else:print("메시지가 성공적으로 전송되었습니다.")
def get_usdt_krw_price():import requests
global exchange_rate
try:response = requests.get(url)response_data = response.json()
# 성공적으로 데이터를 받아왔다면 가격 정보 출력if response_data.get("status") == "0000":exchange_rate = (float)(response_data["data"]["closing_price"])else:print("가격 정보를 조회하는 데 실패했습니다.")except Exception as e:print(f"데이터 조회 중 오류가 발생했습니다: {e}")
# 프리미엄 계산 실행while True:exchange_rate = 0get_usdt_krw_price()print(exchange_rate)
a = calculate_premiums()coin_name = list(a.keys())coin_premium = list(a.values())
message1 = "가장 프리미엄이 큰 코인 : {}".format(coin_name)message2 = "프리미엄 : {}%".format(coin_premium)message3 = "환율 : {}".format(exchange_rate)
print(message1, message2, message3)refresh_access_token()
send_message_to_kakao(message1)send_message_to_kakao(message2)send_message_to_kakao(message3)
print("Waiting 60 seconds for the next update...\n")time.sleep(60) # 60초 대기 후 다시 실행'python' 카테고리의 다른 글
chatGPT API를 이용한 웹애플리케이션, 챗페페 chagPepe (26) 2024.03.18 파이썬 import packages 한번에 설치하는법 (10) 2024.03.10 visual studio code로 python 가상환경에서 패키지 import가 안될때(pyenv, pyenv virtualenv) (9) 2024.03.03 코인 재정거래시 김치프리미엄 높은 코인 찾는 쉬운방법 (0) 2024.02.22 ubuntu에서 환경변수 설정하는법 (0) 2024.02.19