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
๋ฐ˜์‘ํ˜•
Liky