본문 바로가기

투자(기술적분석)

업비트 API를 이용한 실시간 RSI 출력 코드(python)

비트코인 투자를 위해 기술적 분석(CMT)의 지표 중 하나인 RSI를 참고하시는 분들이 많으실 거라고 생각합니다.

RSI는 충분히 검증된 지표이며,  보통은 30, 70을 과매도/과매수 구간으로 판단하여 매수/매도할 수 있습니다.

 

이번에 소개해드릴 것은 실시간으로 RSI가 특정 수치보다 높은/낮은 코인을 출력하는 짧은 코드로 구성된 프로그램 입니다.

저는 RSI수치가 낮은 종목을 매수 후보로 고려하는 경향이 있는데, 매번 수많은 코인을 일일히 확인하면서 RSI수치를 확인하는것이 너무 번거로웠습니다. 그래서 이런 프로그램을 만들어보게 되었습니다.

프로그래밍은 아직 초보라서.. 부족한점이 많지만 지속적으로 업데이트 할 예정입니다.

 

먼저, 소스코드에 대한 설명입니다.

전체 함수는 3개로 구성되어 있습니다.

 

1. RSI계산 함수

 

#RSI계산 함수
def rsi_calculate(l, n, sample_number): #l = price_list, n = rsi_number

 

API를 통해 받은 데이터를 기반으로 RSI 수치를 계산합니다. 가장 많이 쓰는 RSI 14를 기준으로 하였습니다.

계산은 아래 포스팅을 참고해주세요.

 

 

RSI(Relative Strength Index) 계산방법 및 의미

RSI는 30이하/70이상 일 때, 시장이 과매도/과매수인지를 판별함으로서 투자에 활용할 수 있는 유용한 지표입니다. 이번에 다룰 내용은 이것의 구체적인 계산방법입니다. 1. 데이터 추출 시간순서

primestory.tistory.com

 

참고로 업비트의 RSI값과 매우 유사한 값을 얻기 위해서는 지수가중이동평균 (Exponentially weighted moving average)를 이용해야 함을 확인하였습니다. RSI값을 계산할 때, 상승/하락분을 그대로 적용하지 않고, 최근의 데이터에 더 가중치를 부여하여 평균을 구하는 방식입니다. 데이터는 500개 정도의 값을 사용하였습니다. -> upbit api변경으로 200개 값 사용으로 수정

 

2. Market정보 불러오는 함수

 

#마켓코드조회
def market_code():

 

API를 통해 업비트 서버와 통신하여 다양한 시장 정보를 받아들이는 함수입니다.

데이터는 json을 string형태로 변환하여 받게 됩니다. 계산 쉽게 하고 쓸데없는 정보를 최소화하기 위해 약간의 데이터 변형과정을 거칩니다.

 

3. RSI를 출력하는 함수

 

def RSI_analysis(code_list, name_to_code, time_unit, unit, target_up = 70, target_down = 30, option = "multi"): #1분 RSI 분석

 

 

출력은, (전체 코인에 대한 RSI수치 계산 -> 특정 수치보다 높은/낮은 코인 출력)의 단순한 과정으로 이루어져 있습니다.

parameter인 target_up은 특정 수치보다 높은 코인을 추출하기 위한 기준선이며, target_down은 낮은 코인을 추출하기 위한 기준선입니다. option을 통해 낮은 수치만을 출력할 것인지, 높은 수치만을 출력할 것인지 결정할 수 있습니다. 또한 time_unit은 기본적으로 minutes(분) 단위로 설정되었으며, unit parameter를 통해 몇 분 RSI를 구할 것인지 설정할 수 있습니다.

 

option = {"down"| "up"| "multi"}

 

실제 main함수와 실행결과는 아래와 같이 나타나게 됩니다.

 

#Main function

if __name__ == "__main__":

	m = 0
	print("#########Analysis Start##########\n")
	code_list, name_to_code = market_code()
	while(1):
		# 1, 3, 5, 10, 15, 30, 60, 240
		try :
			RSI_analysis(code_list,name_to_code,"minutes", 3)
			if m%5 ==0:
				RSI_analysis(code_list,name_to_code,"minutes", 15)
			if m%20 ==0:
				RSI_analysis(code_list,name_to_code,"minutes", 30)
				RSI_analysis(code_list,name_to_code,"minutes", 60)
			if m%30 ==0:	
				RSI_analysis(code_list,name_to_code,"minutes", 240)
			m += 1
		except:
			print('ERROR 발생')
			time.sleep(300)

 

 

 

 

기본적으로 출력까지 걸리는 running time이 측정되도록 하였습니다. 또한, 현재시간을 출력하도록 하였습니다.

만약, 조건에 만족하는 코인이 없을 경우, 어떠한 것도 출력하지 않게 됩니다.

main함수에서는 출력의 주기를 설정할 수도 있습니다.

 

5. 추가 고려사항

 

1) 업비트 API는 분당, 초당 요청 횟수를 제한하고 있습니다. 그래서 저 같은 경우는 시간을 지속적으로 계산하여, 데이터를 너무 빨리 요청할 때, 약간의 대기시간을 주었습니다. 

2) 계산하여 결과가 나오기까지는 꽤나 긴 30초 내외의 시간이 걸립니다. 따라서, 1분 RSI를 보는 경우에는 다소 부정확한 결과를 낳을 수 있습니다. 이러한 시간의 절반 이상이 요청하여 데이터를 받는데 걸리는 시간인 것으로 확인하였습니다. 또한, 비트코인이 폭락/폭등할 경우, 데이터의 요청 시간이 더욱 길어지는 현상을 확인하였습니다.

3) 원화거래 상품만을 추출합니다.

4) 간혹 RSI가 -1(음수)가 나오는 경우가 있습니다. 이것은 데이터의 요청에 대한 응답이 제대로 이루어지지 않을 경우 빈 리스트를 반환하게 되어 생기는 결과임을 의도적으로 표시하였습니다. 실제 결과에는 이러한 결과는 이상치로 간추하여 출력되지 않습니다.

5) ERROR메시지의 출력은, 인터넷의 연결이 끊기거나 어떠한 오류가 발생할 경우, 출력하도록 하였습니다. 이럴 경우, 프로그램을 종료하고 다시 실행하시면 됩니다.

6) 대장 코인인 비트코인과의 RSI 비교를 위해 비트코인은 수치에 관계없이 함께 출력되도록 하였습니다.

 

첨부된 소스코드는 3분 이상의 RSI를 주기적으로 출력하도록 설정되어있습니다

 

추가) 제가 기존에 사용하였던 방법은 REST API를 이용하여 다소 느리다는 것을 확인하였습니다. 이러한 문제점을 해결하기 위해 web socket기술을 사용해 볼 예정입니다. 또한, 최근에 단순 RSI에 비해 Stochastic RSI가 투자에 있어서 더 유용하게 활용되는 것 같아 코드를 변경하여 추가적인 것을 포스팅할 예정입니다. 감사합니다.

 

 

Upbit_Analysis.py
0.01MB