파이썬 프로그래밍

파이썬 업비트 비트코인 자동매매 - 코인 가격 변동성 체크하기

코니코니 2022. 10. 1. 06:00
반응형

파이썬 업비트 비트코인 자동매매 - 코인 가격 변동성 체크하기


지난 포스팅에서 업비트 api를 사용하여 매수, 매도하는 방법에 대해서 알아봤는데요 오늘은 특정 코인 가격의 변동성을 체크하고 정해진 값만큼 코인의 가격에 변화가 왔을 때 메세지를 띄우는 방법에 대해서 알아보도록 하겠습니다.

코인 가격의 대조 작업은 다양한 측면에서 여러 기술적인 부분들도 활용이 되어야 비로소 완벽한 자동매매 프로그램이 완성이 되는 것이기 때문에 단순히 오늘 알아볼 내용만으로 자동매매에 도입을 하는 것은 추천드리지 않습니다. 기존에 단타 매수를 위한 용도로 제작을 했었는데 매수도 매수지만 매도 타이밍도 워낙 중요했던지라 더 많은 연구가 필요했죠.

일단 짧은 시간에서의 코인 가격을 대조하기 위한 전체 코드는 다음과 같습니다.

import requests
import time
 
 
# 마켓명, 코인 정보 가져오기
def MarKets():
    url = "https://api.upbit.com/v1/market/all"
    querystring = {"isDetails": "false"}
    response = requests.request("GET", url, params=querystring)
    # 종목 가져오기
    markets = response.json()
    # KRW 종목만 String 묶기
    markets_box_str = ""
    for market_code in markets:
        if str(market_code['market']).count('KRW'):
            markets_box_str = markets_box_str + f'{market_code["market"],}'
    markets_box_str = markets_box_str.replace('(', "").replace(')', "").replace("'", "")[:-1]
    # KRW 종목 가격 가져오기
    url_2 = f"https://api.upbit.com/v1/ticker?markets={markets_box_str}"
    response_2 = requests.request("GET", url_2, params=querystring)
    # 전체 종목 리스트
    markets_box = response_2.json()
    market_name = {}
    for i_z in markets_box:
        market_name[i_z['market']] = i_z['trade_price']
    return market_name
 
 
# 원하는 코인명을 리스트에 넣습니다
coin_list = ["KRW-BTC",
             "KRW-ETH",
             "KRW-NEO",
             "KRW-MTL",
             "KRW-LTC"]
 
# 최초 코인 가격 저장 변수
coin_box = MarKets()
 
# 특정 값 이상 오른 코인 저장 변수
percent_up_coin_box = {}
 
# 기존 코인 값과 새로운 코인 값 대조
while True:
    tickers = MarKets()
    for i in tickers:
        # 만약 i가 코인 리스트에 있는 코인이라면
        if coin_list.count(i):
            # i 코인 현재가 저장
            ck_coin_price = tickers.get(i)
            # 만약 기존 i 코인 가격이 특정 값 이상 올랐다면
            if coin_box.get(i) + (coin_box.get(i) * 1 / 100) <= ck_coin_price:
                # 딕셔너리 변수에 코인명 및 현재 코인 가격 저장
                percent_up_coin_box[i] = tickers.get(i)
                print(str(f'{i} = {str(round((ck_coin_price - coin_box[i]) / ck_coin_price * 100, 2))}% up'))
            # 반복이 될 때마다 현재 코인 가격으로 업데이트
            coin_box[i] = ck_coin_price
    # 반복 대기시간
    time.sleep(10)
 
 
 
결과
 
KRW-TRX = 0.81% up
KRW-TT = 0.61% up
KRW-AHT = 1.0% up
KRW-LOOM = 0.78% up
KRW-DKA = 0.58% up
KRW-AHT = 0.5% up
KRW-TT = 0.61% up
KRW-VET = 0.61% up

먼저 def MarKets() 함수는 현재 업비트 시장에 있는 한화 코인 리스트를 가져옵니다. 딕셔너리 형태로 코인명과 현재 코인 가격을 가져오게 됩니다.

# 원하는 코인명을 리스트에 넣습니다
coin_list = ["KRW-BTC",
             "KRW-ETH",
             "KRW-NEO",
             "KRW-MTL",
             "KRW-LTC"]

그 다음 코인 리스트에는 대조 작업을 원하는 코인명을 넣어주면 됩니다. 개수 제한은 없으며 현재 업비트 한화에 존재하는 코인이면 됩니다.

# 최초 코인 가격 저장 변수
coin_box = MarKets()

이제 반복적으로 코인 대조작업을 하기 이전에 최초로 업비트 마켓에 있는 한화 코인 리스트를 전부 coin_box에 넣어줍니다.

# 특정 값 이상 오른 코인 저장 변수
percent_up_coin_box = {}

코인 대조작업에서 특정 퍼센트 이상 올라간 코인에 한하여 이 딕셔너리에 들어오게 됩니다. 딕셔너리에 따로 코인을 넣는 이유는 만약 매수를 하게 됐을 때 매도 타이밍을 잡기 위해서 특별 관리 대상 용도라고 볼 수 있겠네요. 그러나 이번 글에서는 매수, 매도를 관리하는 코드는 따로 넣지 않았습니다. 파이썬을 활용한 매수 및 매도는 이전 글 참고해주세요.

# 기존 코인 값과 새로운 코인 값 대조
while True:
    tickers = MarKets()
    for i in tickers:
        # 만약 i가 코인 리스트에 있는 코인이라면
        if coin_list.count(i):
            # i 코인 현재가 저장
            ck_coin_price = tickers.get(i)
            # 만약 기존 i 코인 가격이 특정 값 이상 올랐다면
            if coin_box.get(i) + (coin_box.get(i) * 0.5(원하는 상승 퍼센트 입력) / 100) <= ck_coin_price:
                # 딕셔너리 변수에 코인명 및 현재 코인 가격 저장
                percent_up_coin_box[i] = tickers.get(i)
                print(str(f'{i} = {str(round((ck_coin_price - coin_box[i]) / ck_coin_price * 100, 2))}% up'))
            # 반복이 될 때마다 현재 코인 가격으로 업데이트
            coin_box[i] = ck_coin_price
    # 반복 대기시간
    time.sleep(10)

이제 반복문에 들어오게 되는데요. 이 반복문에서는 기존에 리스트에 넣었던 원하는 코인 리스트만을 대상으로 대조 작업을 진행하게 됩니다. 최초에 def MarKets() 함수를 불러왔던 변수는 그대로 있는 상태에서 다시 새로운 def MarKets() 함수로 새로운 변수를 만들어서 기존 코인 데이터와 새롭게 불러온 코인 데이터를 대조한다고 보면 될것 같습니다.

for 반복문으로 def MarKets()로 불러온 신규 tickers 변수 리스트 요소를 하나씩 불러오면서 현재 코인 요소가 리스트에 있는 코인인지 체크를 한 후 만약 리스트에 존재하는 코인이라면 기존 코인 가격과 현재 코인 가격을 비교하여 시세 변화 체크를 하는 것이죠.

시세 변화의 체크는 백분율 계산하는 방식으로 코드를 작성했습니다. 만약 상승 뿐만 아니라 하락된 수치까지 체크를 하려면 백분율 원리를 활용하여 if문을 추가하거나 수정하면 되겠죠.

가장 중요한 것은 코인이 원하는 상승 및 하락 퍼센트에 도달을 하지 않더라도 coin_box에서 해당 코인 가격은 반복이 될 때마다 업데이트를 해줘야 한다는 것입니다. 애초에 이 코드를 작성했던 이유는 짧은 시간에 큰 변동성이 있는 코인을 체크하기 위한 용도였던지라 업데이트를 지속적으로 해주지 않는다면 최초 코인 데이터를 기준으로만 보기 때문에 순식간에 빠른 변동성을 보이는 코인만을 잡아내기 어렵다는 결론이었죠.

마찬가지로 반복 대기시간을 너무 길게하거나 너무 짧게 한다면 대조작업에도 큰 변화가 생기기 때문에 이 부분은 직접 변경을 해가면서 최적의 대기시간을 찾는 것이 중요합니다.

KRW-TRX = 0.81% up
KRW-TT = 0.61% up
KRW-AHT = 1.0% up
KRW-LOOM = 0.78% up
KRW-DKA = 0.58% up
KRW-AHT = 0.5% up
KRW-TT = 0.61% up
KRW-VET = 0.61% up

결과적으로 해당 코드를 구동시키면 이러한 메세지를 출력하게 됩니다. 지속적으로 현재 코인 가격을 업데이트 하면서 짧은 시간에 특정 수치 이상 만큼 오른 코인이 있다면 해당 수치와 함께 코인 명을 출력하게 됩니다. 여기서 한층 더 나아가 매수와 매도 기능까지 넣는다면 어쨌든 자동매매 프로그램이 되긴 합니다만 지금 기능만을 사용한 단타 자동매매는 안정성이 떨어지기 때문에 재미?로만 즐기는 것을 추천합니다.

반응형