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

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

by me_in_sk 2023. 6. 5.
반응형

 

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

이번 포스팅에서는 지난 포스팅에 이어 수익률을 구하고, 물을 타는 로직을 추가해 보자. 지난 포스팅과 이어지는 구성이니, 아래의 링크를 참고하여 학습하고 오는 것을 추천한다.

 

 

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

 

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

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

me-in-journey.com


 

 

- 조건 설정 -

  1. 최초 매수 시점에 할당된 금액의 50% 매수
  2. 수익률이 -5% 이하일 때, 나머지 50% 추가 매수
  3. 수익률이 -7% 이하일 때, 모두 매도하여 손절
해당 조건들을 위한 코드 설명은 포스팅 하단의 링크를 참고 바란다.

 

 

 

매수 비중 설정

first_buy = 0.5             	# 첫 매수 비중
water_buy = 1.0 - first_buy 	# 물 탈 비중


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

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

 

이후에 매수 비중을 조절할 것을 고려하여, 매수 비중을 미리 변수로 통제하였다. 위처럼 최초로 진행하는 매수는 수익률과 관계없이 진행한다. 다음으로 추가로 매수·매도를 진행하기 위해 수익률을 구해보자.

 

 

수익률 확인

def get_revenue_rate(balances, ticker):
    revenue_rate = 0.0

    for coin in balances:
        # 티커 형태로 전환
        coin_ticker = coin['unit_currency'] + "-" + coin['currency']

        if ticker == coin_ticker:
            # 현재 시세
            now_price = pyupbit.get_current_price(coin_ticker)
             
            # 수익률 계산을 위한 형 변환
            revenue_rate = (now_price - float(coin['avg_buy_price'])) / float(coin['avg_buy_price']) * 100.0

    return revenue_rate


balances = upbit.get_balances()
ticker_rate = get_revenue_rate(balances, target_ticker)

 

수익률은 위의 함수와 같이 해당 티커의 현재 시세에서 평균 매입단가를 뺀 후, 이를 평균 매입단가로 나누는 것으로 수익률을 구할 수 있었다.

해당 수익률을 토대로 매수와 매도를 실행해 보자.

 

 

수익률을 토대로 매수·매도

have_coin = 0.0
for coin in balances:
    coin_ticker = coin['unit_currency'] + "-" + coin['currency']

    if target_ticker == coin_ticker:
        have_coin = float(coin_ticker['avg_buy_price']) * float(coin_ticker['balance'])
        ticker_rate = get_revenue_rate(balances, target_ticker)
        
	# 실제 매수된 금액의 오차 감안
        if (money * 0.99) < have_coin:
            if ticker_rate <= -7.0:
                amount = upbit.get_balance(target_ticker)       # 현재 코인 보유 수량	  
                upbit.buy_market_order(target_ticker, amount)   # 시장가에 매도
		
        # 실제 매수된 금액의 오차 감안
        elif (money * 0.49) < have_coin and (money * 0.51) > have_coin:
            if ticker_rate <= -5.0:
                upbit.buy_market_order(target_ticker, money * first_buy)   # 시장가에 코인 매수

 

실제로 매수를 하다 보면, 단위와 주문 시간의 오차로 인해 주문 금액간에 오차가 발생하는 경우가 있다. 주문한 금액과 실제 주문된 금액의 오차를 감안하기 위해 모수 매수된 상태는 0.99를, 최초 50% 매수된 상태는 0.49를 곱하는 것으로 확인하였다.

만약 코인에 할당된 금액이 모두 매수 되었을 때는 수익률이 -7% 이하일 때 매도를 진행하고, 최초로 매수한 코인만 존재할 때는 수익률이 -5% 이하일 때 물을 타주도록 하였다.

본인이 원하는 비중으로 값을 조정하고, 조건문을 수정해 주는 것으로 본인에게 맞는 투자 전략을 찾아 나가는 것을 추천한다. 다음 포스팅에서는 수익이 발생했을 때, 조건에 따라 분할매도를 하는 로직을 추가해 보도록 하고 이번 포스팅은 여기서 마치도록 한다.

 

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (4) : 최고가에 매도를 해보자

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (4) : 최고가에 매도를

자동매매 프로그램을 개선해 보자 이번 포스팅에서는 지난 포스팅에 이어 수익률을 통해 분할 매도 로직을 추가해 보도록 하자. 지난 포스팅과 이어지는 구성이니 아래의 링크를 참고하여 학습

me-in-journey.com


◆ 함께 보면 좋은 글

반응형

댓글