RSI기반 자동매매 프로그램 제작 (업비트)

2021. 11. 21. 00:38Hi/Blockchain

2021.08.18 - [Hi/Blockchain] - 자동매매봇 제작기

 

자동매매봇 제작기

예전에 주식도 해보고 코인도 해봤었는데, 정보도 없이 사람의 머리로 생각하고 손으로 거래하다보니 결과적으로 잃는게 더 컸던 것 같다. 이득보면 욕심이 생기고, 손해보면 언젠간 오르겠지

forbetterdays.tistory.com

위의 글 이후로 많은 사람이 관심이 많은 것 같아서 이후에 제작했던 자동매매 봇을 써볼까 합니다.

 

본문에서 올리는 코드는 하락장이던 상승장이던 조금씩만 이득보자는 의미로 만들었던 코드로 큰 순익을 기대하진 않습니다.  아래는 RSI 기반의 자동매매 프로그램을 돌리면서 찍힌 값들 입니다. 크게 벌거나 잃지는 않지만 꾸준하게 조금씩 수익이 올라옵니다. 안정성을 추구하였습니다. 백테스팅을 진행한 후에 투자하세요.

모든 코인 종목을 주시하면서 일정 조건이 만족되는 종목을 주시하다가 떨어질 때 최저점이라 판단되면 매수를 하고,

올라가다가 일정 퍼센트 떨어지거나 조건이 만족되면 매도를 하는 코드입니다.

 

먼저 본 코드는 RSI 기반으로 조건을 따졌으며, 이를 이용한 코드로 작성되어 있습니다.

RSI에 대해서 알아야하는데, 이는 상대강도지수(Relative Strength Index)를 뜻하는 보조 투자 지표입니다.

이 지표는 가격의 상승압력과 하락압력 간의 상대적인 강도를 나타내는 지표입니다.

 


RSI 개념 (위키백과 출처)

- RSI는 일정 기간 동안 주가가 전일 가격에 비해 상승한 변화량과 하락한 변화량의 평균값을 구하여, 상승한 변화량이 크면 과매수로, 하락한 변화량이 크면 과매도로 판단하는 방식이다.

- 계산 방법은 다음과 같다. 주어진 기간의 모든 날의 주가에 대해서


가격이 전일 가격보다 상승한 날의 상승분은 U(up) 값이라고 하고,
가격이 전일 가격보다 하락한 날의 하락분은 D(down) 값이라고 한다.
U값과 D값의 평균값을 구하여 그것을 각각 AU(average ups) AD(average downs)라 한다.
AU를 AD값으로 나눈 것 RS(relative strength) 값이라고 한다. 

RS 값이 크다는 것은 일정 기간 하락한 폭보다 상승한 폭이 크다는 것을 의미한다.

 

- 다음 계산에 의하여 RSI 값을 구한다.

RSI 계산 공식 :
RSI = RS / (1 + RS)
또는, 다음과 같이 구해도 결과는 동일하다.
RSI = AU / (AU + AD)
대체로 이 값은 백분율로 나타낸다.

- 이 지표의 파라미터로는 기간을 며칠 동안으로 할 것인가가 있다. 

Welles Wilder는 14일을 사용할 것을 권유했다. 

대체로 사용되는 값은 9일, 14~15일, 25~28일 등이다.

- RSI 그래프는 이동평균선을 함께 나타내는 것이 보통이며, 이동평균선을 며칠선으로 할 것인가 역시 파라메터로 주어진다. RSI를 15일에 대하여 구하고 5일 이동평균선을 함께 표시하는 경우 그래프에 (15, 5)라고 표시해주는 것이 일반적이다.

출처 : 해시넷 RSI 지표

이런 식으로 RSI 그래프를 보면 과매수 상태인지 과매도 상태인지 판단이 가능해 집니다.

즉, 과매도 상태일때 매수를 하고 과매수 상태일때 매도를 하는 전략을 세울 수 있습니다.


이를 코드로 구현한 것이 아래와 같습니다.

def rsi(ohlc: pd.DataFrame, period: int = 14):
	ohlc["close"] = ohlc["close"]
	delta = ohlc["close"].diff()

	up, down = delta.copy(), delta.copy()
	up[up < 0] = 0
	down[down > 0] = 0

	_gain = up.ewm(com=(period - 1), min_periods=period).mean()
	_loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()

	RS = _gain / _loss
	return pd.Series(100 - (100 / (1 + RS)), name="RSI")

이를 이용하여 조건을 설정하고 순서도에 맞는 알고리즘을 작성하면 됩니다.

 

저같은 경우에는 모든 종목을 전부 순회하며 확인하였습니다.

def searchRSI(settingRSI):
    try :
        tickers = pyupbit.get_tickers(fiat="KRW")
        for symbol in tickers : 
            url = "https://api.upbit.com/v1/candles/minutes/10"

            querystring = {"market":symbol,"count":"500"}

            response = requests.request("GET", url, params=querystring)

            data = response.json()

            df = pd.DataFrame(data)

            df=df.reindex(index=df.index[::-1]).reset_index()

            df['close']=df["trade_price"]


            def rsi(ohlc: pd.DataFrame, period: int = 14):
                ohlc["close"] = ohlc["close"]
                delta = ohlc["close"].diff()

                up, down = delta.copy(), delta.copy()
                up[up < 0] = 0
                down[down > 0] = 0

                _gain = up.ewm(com=(period - 1), min_periods=period).mean()
                _loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()

                RS = _gain / _loss
                return pd.Series(100 - (100 / (1 + RS)), name="RSI")

            rsi = rsi(df, 14).iloc[-1]
            #print(symbol)
            #print('Upbit 10 minute RSI:', rsi)
            #print('')
            if rsi < settingRSI :
                print("!!과매도 현상 발견!!")
                return symbol
                break
            time.sleep(1)
    except :
        #print("찾는중...")
        time.sleep(2)
        searchRSI()

그러고 종목을 발견하면 이 종목을 주시하면서 더 떨어질때 까지 대기하는 코드를 작성하였습니다,

 

떨어지다가 최저점을 찍고 올라가는 것 같으면 그 때 매수를 하였습니다.

 

전체 시나리오는 이런 식으로 진행됩니다.

#메인
while True: 
    try:
        maxRSI = 0
        minRSI = 100
        TF = False
        
        i = searchRSI(25) #과매도현상 코인 찾기 #RSI가 n보다 떨어지면
        krw = upbit.get_balance("KRW")
        #print("구매 타이밍 잡는중...")
        while True :
            firstRSI = search_onetime(i)
            time.sleep(10)
            if buyRSI(i,firstRSI) == True :
                upbit.buy_market_order(i, krw*0.9995)
                time.sleep(1)
                print("<<<< " + str(i) + " 구매완료 >>>>")
                break
            #elif buyRSI(i,firstRSI) == -1 :
             #   TF = True
              #  break
            else :
                time.sleep(1)
                
         
        # 결제 금액 
        firstPrice = pyupbit.get_current_price(i)
        time.sleep(1)
        print("구매금액 : " + str(firstPrice))
        
        while True :
            firstRSI = search_onetime(i)
            #time.sleep(15)
            
            # 판매대기
            if  sellRSI(i, firstRSI, firstPrice)== True:
                useCoin = upbit.get_balance(i)
                upbit.sell_market_order(i, useCoin)
                print("<<<< " + str(i) + " 판매완료 >>>>")
                time.sleep(5)
                print("현재 보유 KRW : " + str(upbit.get_balance("KRW")))
                break
                
            else : time.sleep(1)
        
        print('판매코인 현재가 : ' + str(pyupbit.get_current_price(i)))
        print()
        
        time.sleep(5)
        
    except :
        time.sleep(1)

 

 

RSI를 포함한 여러개의 지표들과 자신만의 판단 및 조건 설정을 통해 매도를 진행하는 코드를 작성하면 좋을 것 같습니다.

 

728x90

'Hi > Blockchain' 카테고리의 다른 글

자동매매봇 제작기  (0) 2021.08.18
블록체인 개념  (0) 2021.03.04