본문 바로가기
웹 프로그래밍/프론트엔드

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (1)

by me_in_sk 2023. 5. 31.
반응형

 

자동매매 프로그램 만들기

상대강도지수(RSI)는 투자자가 매수와 매도를 하는 시점에서 과매수 구간인지, 과매도 구간인지를 판단할 수 있게 도와주는 보조 지표이다. 이번 포스팅에서는 해당 보조 지표를 이용해 정말 단순한 자동매매 프로그램을 만들어 보자.

 

 

- 조건 설정 -

  1. 타깃 코인 : 비트코인
  2. 기준 캔들 : 일봉
  3. 매매 조건 : RSI 지수가 30 이하일 때 매수, 70 이상일 때 매도
해당 조건들을 위한 코드 설명은 포스팅 하단의 링크를 참고 바란다.

 

 

 

RSI 지표를 구하기 위한 캔들 정보

import pyupbit


ticker = "KRW-BTC"				       # 비트코인을 티커로 지정
btc_day = pyupbit.get_ohlcv(ticker, interval="day")    # 비트코인의 일봉 정보

 

RSI 지표를 구하기 위해서는 해당 지표의 기준이 되어 줄 캔들 정보가 필요하며, 우리는 하루를 기준으로 하는 RSI 지표를 구하는 것이 목표이므로 일봉 정보가 필요하다. 다음으로 RSI 지표를 구하는 함수이다.

 

 

RSI 지표 함수

def get_rsi(df, period=14):

    # 전일 대비 변동 평균
    df['change'] = df['close'].diff()

    # 상승한 가격과 하락한 가격
    df['up'] = df['change'].apply(lambda x: x if x > 0 else 0)
    df['down'] = df['change'].apply(lambda x: -x if x < 0 else 0)

    # 상승 평균과 하락 평균
    df['avg_up'] = df['up'].ewm(alpha=1/period).mean()
    df['avg_down'] = df['down'].ewm(alpha=1/period).mean()

    # 상대강도지수(RSI) 계산
    df['rs'] = df['avg_up'] / df['avg_down']
    df['rsi'] = 100 - (100 / (1 + df['rs']))
    rsi = df['rsi']

    return rsi

 

업비트에서 RSI 보조 지표를 활성화하면 기본적으로 RSI14에 대한 지표가 보인다. 해당 수치를 변경할 수도 있지만, 수치가 낮아질수록 타점의 기회가 많이 찾아오지만, 신뢰도가 다소 하락할 수 있다는 단점이 존재하니 본인의 전략에 맞는 수치를 찾으면 된다.

다음으로 매매 조건에 맞춰 실제 매매 코드를 작성해 보자. 여기서 매매는 모두 시장가로 진행하겠다.

 

 

매매를 위한 객체를 생성

access = "개인의 고유 Key값"
secret = "개인의 고유 Key값"

upbit = pyupbit.Upbit(access, secret)


balances = upbit.get_balances()

my_money = float(balances[0]['balance'])    # 내 원화
money_rate = 1.0                            # 투자 비중
money = my_money * money_rate               # 비트코인에 할당할 비용
money = math.floor(money)		    # 소수점 버림
해당 전략에 내가 가진 원화를 모두 투자하겠다면 money_rate 값을 1.0으로, 반만 투자한다면 0.5로 값을 주면 된다. 해당 방식을 통해 여러 전략에 분산 투자할 경우를 대비할 수 있다.

 

 

매매 조건 실현

ticker = "KRW-BTC"                                      # 비트코인을 티커로 지정
btc_day = pyupbit.get_ohlcv(ticker, interval="day")     # 비트코인의 일봉 정보


yesterday_rsi = get_rsi(btc_day, 14).iloc[-2]   # 하루 전의 RSI14 값을 이용
# today_rsi = get_rsi(btc_day, 14).iloc[-1] 	# 당일의 RSI14 값을 이용

# 매수 조건 충족
if yesterday_rsi < 30:
    upbit.buy_market_order(ticker, money)   # 시장가에 비트코인을 매수
    balances = upbit.get_balances()         # 매수했으니 잔고를 최신화!

# 매도 조건 충족
elif yesterday_rsi > 70:
    amount = upbit.get_balance(ticker)       # 현재 비트코인 보유 수량	  
    upbit.sell_market_order(ticker, amount)  # 시장가에 매도 
    balances = upbit.get_balances()          # 매도했으니 잔고를 최신화!

 

위의 코드에서는 하루 전의 RSI14 수치가 사용되었다. 이는 수수료가 발생하는 코인의 특성상 무분별한 매수와 매도는 손실로 이어질 수 있기 때문인데, 매매 조건을 수정하거나 코드를 개선한다면 get_rsi(btc-day, 14).iloc[-1]을 통해 당일의 RSI14 수치를 이용할 수 있다.

 

 

매수 여부 확인

# 이미 매수한 코인인지 확인
def has_coin(ticker, balances):
    result = False
    
    for coin in balances:
        coin_ticker = coin['unit_currency'] + "-" + coin['currency']
        
        if ticker == coin_ticker:
            result = True
            
    return result
    
    
if has_coin(ticker, balances):
    # 매도 조건 충족
    if yesterday_rsi > 70:
        amount = upbit.get_balance(ticker)       # 현재 비트코인 보유 수량	  
        upbit.sell_market_order(ticker, amount)  # 시장가에 매도 
        balances = upbit.get_balances()          # 매도를 했으니 잔고를 최신화!

else:
    # 매수 조건 충족
    if yesterday_rsi < 30:
        upbit.buy_market_order(ticker, money)    # 시장가에 비트코인을 가진 원화만큼 매수
        balances = upbit.get_balances()          # 매수를 했으니 잔고를 최신화!

 

이미 매수한 코인은 추가로 매수할 수 없으니 미리 비트코인의 보유 유무를 확인해 주는 것이 좋다. 위와 같이 매수를 할 차례인지, 매도를 할 차례인지를 확인할 수 있다.

이번 포스팅에서는 RSI14 지표의 값에 따라 매수와 매도를 진행하는 자동매매의 기틀을 세워보았다. 다음 포스팅에서 이를 개선해 보기로 하고, 이번 포스팅은 여기서 마치도록 한다.

 

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (2)

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (2)

자동매매 프로그램을 개선하자 이번 포스팅에서는 아래의 링크에서 다루었던 코드를 개선해 보자. 지난 포스팅과 이어지는 내용이니 아래의 링크를 참고하여 학습하고 오는 것을 추천한다. [업

me-in-journey.com


◆ 함께 보면 좋은 글

반응형

댓글