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

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

by me_in_sk 2023. 5. 31.
반응형

 

자동매매 프로그램을 개선하자

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

 

 

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

 

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

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

me-in-journey.com


 

 

- 조건 설정 -

  1. 타깃 코인 : 거래대금이 높은 코인 5개
  2. 매매 조건 : RSI 지수가 30을 돌파할 때 매수, 70보다 낮아질 때 매도
해당 조건들을 위한 코드 설명은 포스팅 하단의 링크를 참고 바란다.

 

 

 

거래대금 Top5 코인

def get_transaction_amount(date, num):
    tickers = pyupbit.get_tickers("KRW")	# KRW를 통해 거래되는 코인만 불러오기
    dic_ticker = {}

    for ticker in tickers:
        df = pyupbit.get_ohlcv(ticker, date)	# date 기간의 거래대금을 구해준다
        volume_money = 0.0  
        
        # 순위가 바뀔 수 있으니 당일은 포함 x
        for i in range(2, 9):
            volume_money += df['close'][-i] * df['volume'][-i]  

        dic_ticker[ticker] = volume_money


    # 거래대금 큰 순으로 ticker를 정렬
    sorted_ticker = sorted(dic_ticker.items(), key= lambda x : x[1], reverse= True)

    coin_list = []
    count = 0

    for coin in sorted_ticker:
        count += 1

        # 거래대금이 높은 num 개의 코인만 구한다
        if count <= num:
            coin_list.append(coin[0])
        else:
            break

    return coin_list


tickers = get_transaction_amount("day", 5)	# 거래대금 상위 5개 코인 선정

 

위의 코드를 통해 dic_ticker 안에는 각 코인별 최근 7일간의 거래대금 합이 담겨있다. 우리는 해당 딕셔너리를 거래대금의 크기순으로 정렬하는 것으로 상위 5개의 코인을 선정하여 거래할 코인 리스트(tickers)에 저장해 보았다.

다음으로, 지정한 코인의 개수만큼 자본을 할당하여 투자하도록 코드를 작성해 보자.

 

 

각각 코인에 자본 할당

my_money = float(balances[0]['balance'])    # 내 원화
money_rate = 1.0                            # 투자 비중
money = my_money * money_rate               # 할당할 비용
money = math.floor(money)


count_coin = len(coin_list)	# 목표 코인 개수
money /= count_coin		# 각각의 코인에 공평하게 자본 분배


for target_ticker in tickers:
    df_day = pyupbit.get_ohlcv(target_ticker, interval="day")	# 일봉 정보
    rsi14 = get_rsi(df_day, 14).iloc[-2]                   	# 하루 전의 RSI14 값을 이용

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

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

 

다음으로, 매매 조건을 개선해 보자. 지난 포스팅에서는 RSI 지수가 30 이하가 되는 순간 매수 조건을 충족하게 되었다. 매수를 한 다음 코인의 시세가 오른다면 고맙지만, RSI 지수가 30 이하로 떨어지는 경우가 훨씬 많은 것이 현실이다.

우리는 이를 고려하여, RSI가 30 이하일 때 30 보다 증가하면 매수, 70 이상일 때 70보다 낮아지면 매도를 하는 형식으로 코드를 개선해 보자.

 

매매 조건 개선

for target_ticker in tickers:
    df_day = pyupbit.get_ohlcv(target_ticker, interval="day")     # 일봉 정보
    rsi14 = get_rsi(df_day, 14).iloc[-1]                          # 당일 RSI
    before_rsi14 = get_rsi(df_day, 14).iloc[-2]                   # 작일 RSI

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

    else:
        # 매수 조건 충족
        if rsi14 > 30 and before_rsi14 < 30:
            upbit.buy_market_order(target_ticker, money)    # 시장가에 코인 매수
            balances = upbit.get_balances()         	    # 매수했으니 잔고를 최신화!

 

물론 항상 위의 조건이 더 나은 결과를 부른다고 장담할 수 없기 때문에, 투자자의 투자 전략과 스타일에 맞춰서 원래의 조건을 사용해도 된다.

다음 포스팅에서는 매수한 코인의 수익률을 구해보고, 수익률이 낮을 때 물을 타는 로직을 추가하여 개선하기로 하고, 이번 포스팅은 여기서 마치도록 한다.

 


◆ 함께 보면 좋은 글

반응형

댓글