본문 바로가기
자동매매 프로그래밍/업비트

[업비트/자동매매] Python으로 쉽게 하는 캔들 정보 불러오기 : 이동평균선(MA)과 RSI 지표를 구해보자

by me_in_sk 2023. 5. 21.
반응형

 

 

이번 포스팅에서는 업비트에서 캔들의 정보를 불러오고, 불러온 캔들 정보를 토대로 이동평균선(MA)과 RSI 지표를 구해보자. 업비트 거래소에서 자동매매를 하기 위해 필요한 Open API는 pyupbit 모듈을 통해 많은 기능을 지원하기 때문에, 오늘 우리가 구하고자 하는 지표들은 pyupbit 모듈을 통해 쉽게 구할 수 있으니 해당 모듈이 설치되어 있지 않다면 아래의 포스팅에 나와 있는 코드를 통해 설치하고 오길 바란다.

 

 

[업비트/자동매매] Python으로 쉽게 하는 매수/매도 : 비트코인 자동매매 프로그램 만들기

 

[업비트/자동매매] Python으로 쉽게 하는 매수/매도 : 비트코인 자동매매 프로그램 만들기

자동매매 프로그램을 만드는 것에 있어 가장 기초 중의 기초는 매수와 매도를 하는 것이다. 이번 포스팅에서는 업비트 거래소에서 제공해주는 Open API를 이용하여 Python을 통해 매수·매도하는 방

me-in-journey.com


 

 

캔들은 봉이라고 부르기도 하며, 캔들은 대부분의 지표를 구하는 것에 있어서 필수적인 요소로써 지표를 형성하는 기준이 캔들이기 때문에 먼저 캔들의 정보를 불러올 수 있어야 한다. 이러한 캔들의 정보는 앞서 길을 개척해준 좋은 분들 덕분에 우리는 코드 한 줄로 쉽게 구할 수 있다.

 

 

캔들 정보를 불러오자

import pyupbit


ticker = "KRW-BTC"
candle_day = pyupbit.get_ohlcv(ticker, interval="day")    # 일봉의 전체 정보

print(candle_day)
print("오늘의 시가 : ", candle_day['open'].iloc[-1])	  # iloc[-2] 는 하루 전의 정보를 불러옴
print("오늘의 종가 : ", candle_day['close'].iloc[-1])      # 오늘의 장이 끝나지 않았기 때문에 현재 시세가 담김



'''
    
    day         : 일 단위
    
    minute1     : 분 단위 (1, 3, 5, 10, 15, 30, 60, 240)
    
    week        : 주 단위
    
    month       : 월 단위
    
    
   ------------------------------------------------------
    ex) 240분 봉을 불러온다
    
    candle_min240 = pyupbit.get_ohlcv(ticker, interval="minute240")
    
'''

 

실행 결과

캔들-정보
캔들 정보

 

위의 출력 결과와 같이 코드 한 줄만으로 원하는 기간의 캔들에 대해 총 6개의 속성을 담은 비트코인의 정보를 받아올 수 있었다. 여기서 각각의 속성을 넘겨주는 것으로 특정 속성만을 불러오는 것 또한 가능하며, 추가로 iloc을 통한 인덱싱을 활용해 원하는 행(날짜)의 정보만을 골라낼 수 있다.

다음으로는 이동평균선이다. 흔히 이동평균선이라 부르는  MA는 일정 기간 동안의 평균 가격을 나타내는 것으로 5MA, 10MA와 같이 나타내곤 하는데, 각각 최근 5개 캔들 종가의 평균, 최근 10개 캔들 종가의 평균을 나타낸다. 따라서 같은 5MA라 하더라도 일봉을 기준으로 하는지, 분봉을 기준으로 하는지에 따라 달라진다.

 

 

이동평균선 값을 구해보자

# 캔들의 종가를 기준으로 ma를 구한다
close = candle_day["close"]
ma5 = close.rolling(5).mean()

print("\n###############################################\n")
print(ma5)
print("\n어제의 ma5 값 :", ma5[-2])

 

실행 결과

이동평균선-지표
이동평균선 정보

 

이동평균선은 캔들의 종가를 기준으로 하기 때문에 위의 코드처럼 최근 5개 캔들의 종가를 통하여 MA 값들을 구할 수 있다. 여기서 구한 이동평균선 값들을 인덱싱해 특정 날짜의 이동평균선 값을 불러올 수 있으며, 월 단위의 MA값이 필요하다면 월봉을 구해 위와 같이 실행하면 된다.

다음으로, RSI 지표를 구해보자. RSI 지표는 MA와 이동평균선과 마찬가지로 캔들의 종가를 기준으로 구할 수 있으며, 일정 기간의 전일 대비 가격의 상승과 하락 변화의 평균을 나타내는 지표로써 상승하면 과매수, 하락하면 과매도로 구분할 수 있다. 우리는 일반적으로 많이 사용되는 14일 RSI 지표를 구해보자.

 

 

RSI14 지표 구하기

def get_rsi(df, period=14):

    # 전일 대비 변동 평균
    df['change'] = df['close'].diff()

    # 상승한 가격과 하락한 가격
    df['up'] = df['change'].apply(lambda x: x if x > 0 else 0)
    df['down'] = df['change'].apply(lambda x: -x if x < 0 else 0)

    # 상승 평균과 하락 평균
    df['avg_up'] = df['up'].ewm(alpha=1/period).mean()
    df['avg_down'] = df['down'].ewm(alpha=1/period).mean()

    # 상대강도지수(RSI) 계산
    df['rs'] = df['avg_up'] / df['avg_down']
    df['rsi'] = 100 - (100 / (1 + df['rs']))
    rsi = df['rsi']

    return rsi


rsi14 = get_rsi(candle_day, 14)

print("\n###############################################\n")
print(rsi14)
print("\n어제의 rsi 값 :", rsi14.iloc[-2])

 

실행 결과

RSI-지표
RSI14 지표

 

RSI 지표를 함수를 통해 구하는 코드를 짜보았다. 이동평균선과 마찬가지로 캔들의 종가를 기준으로 값을 구했으며, 구한 RSI 값들은 인덱싱을 통해 특정 날짜의 RSI 값을 구할 수 있다. 해당 RSI 지표는 매매하는 것에 있어 초보자도 참고할 수 있을 만큼 보기 쉬운 지표이지만, 해당 지표만으로 매매하는 것에는 무리가 있다. 하지만, 다른 전략과 조합해서 사용하기에는 간단하면서도 좋은 지표임이 확실하기에 나도 자주 사용하는 느낌이 든다. 앞으로 더욱 다양한 전략을 구성해서 함께 활용해 보면 좋겠다고 생각하며 포스팅을 마친다.

반응형

댓글