자동매매 프로그램 만들기
상대강도지수(RSI)는 투자자가 매수와 매도를 하는 시점에서 과매수 구간인지, 과매도 구간인지를 판단할 수 있게 도와주는 보조 지표이다. 이번 포스팅에서는 해당 보조 지표를 이용해 정말 단순한 자동매매 프로그램을 만들어 보자.
- 조건 설정 -
- 타깃 코인 : 비트코인
- 기준 캔들 : 일봉
- 매매 조건 : RSI 지수가 30 이하일 때 매수, 70 이상일 때 매도
해당 조건들을 위한 코드 설명은 포스팅 하단의 링크를 참고 바란다.
RSI 지표를 구하기 위한 캔들 정보
import pyupbit
ticker = "KRW-BTC" # 비트코인을 티커로 지정
btc_day = pyupbit.get_ohlcv(ticker, interval="day") # 비트코인의 일봉 정보
RSI 지표를 구하기 위해서는 해당 지표의 기준이 되어 줄 캔들 정보가 필요하며, 우리는 하루를 기준으로 하는 RSI 지표를 구하는 것이 목표이므로 일봉 정보가 필요하다. 다음으로 RSI 지표를 구하는 함수이다.
RSI 지표 함수
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
업비트에서 RSI 보조 지표를 활성화하면 기본적으로 RSI14에 대한 지표가 보인다. 해당 수치를 변경할 수도 있지만, 수치가 낮아질수록 타점의 기회가 많이 찾아오지만, 신뢰도가 다소 하락할 수 있다는 단점이 존재하니 본인의 전략에 맞는 수치를 찾으면 된다.
다음으로 매매 조건에 맞춰 실제 매매 코드를 작성해 보자. 여기서 매매는 모두 시장가로 진행하겠다.
매매를 위한 객체를 생성
access = "개인의 고유 Key값"
secret = "개인의 고유 Key값"
upbit = pyupbit.Upbit(access, secret)
balances = upbit.get_balances()
my_money = float(balances[0]['balance']) # 내 원화
money_rate = 1.0 # 투자 비중
money = my_money * money_rate # 비트코인에 할당할 비용
money = math.floor(money) # 소수점 버림
해당 전략에 내가 가진 원화를 모두 투자하겠다면 money_rate 값을 1.0으로, 반만 투자한다면 0.5로 값을 주면 된다. 해당 방식을 통해 여러 전략에 분산 투자할 경우를 대비할 수 있다.
매매 조건 실현
ticker = "KRW-BTC" # 비트코인을 티커로 지정
btc_day = pyupbit.get_ohlcv(ticker, interval="day") # 비트코인의 일봉 정보
yesterday_rsi = get_rsi(btc_day, 14).iloc[-2] # 하루 전의 RSI14 값을 이용
# today_rsi = get_rsi(btc_day, 14).iloc[-1] # 당일의 RSI14 값을 이용
# 매수 조건 충족
if yesterday_rsi < 30:
upbit.buy_market_order(ticker, money) # 시장가에 비트코인을 매수
balances = upbit.get_balances() # 매수했으니 잔고를 최신화!
# 매도 조건 충족
elif yesterday_rsi > 70:
amount = upbit.get_balance(ticker) # 현재 비트코인 보유 수량
upbit.sell_market_order(ticker, amount) # 시장가에 매도
balances = upbit.get_balances() # 매도했으니 잔고를 최신화!
위의 코드에서는 하루 전의 RSI14 수치가 사용되었다. 이는 수수료가 발생하는 코인의 특성상 무분별한 매수와 매도는 손실로 이어질 수 있기 때문인데, 매매 조건을 수정하거나 코드를 개선한다면 get_rsi(btc-day, 14).iloc[-1]을 통해 당일의 RSI14 수치를 이용할 수 있다.
매수 여부 확인
# 이미 매수한 코인인지 확인
def has_coin(ticker, balances):
result = False
for coin in balances:
coin_ticker = coin['unit_currency'] + "-" + coin['currency']
if ticker == coin_ticker:
result = True
return result
if has_coin(ticker, balances):
# 매도 조건 충족
if yesterday_rsi > 70:
amount = upbit.get_balance(ticker) # 현재 비트코인 보유 수량
upbit.sell_market_order(ticker, amount) # 시장가에 매도
balances = upbit.get_balances() # 매도를 했으니 잔고를 최신화!
else:
# 매수 조건 충족
if yesterday_rsi < 30:
upbit.buy_market_order(ticker, money) # 시장가에 비트코인을 가진 원화만큼 매수
balances = upbit.get_balances() # 매수를 했으니 잔고를 최신화!
이미 매수한 코인은 추가로 매수할 수 없으니 미리 비트코인의 보유 유무를 확인해 주는 것이 좋다. 위와 같이 매수를 할 차례인지, 매도를 할 차례인지를 확인할 수 있다.
이번 포스팅에서는 RSI14 지표의 값에 따라 매수와 매도를 진행하는 자동매매의 기틀을 세워보았다. 다음 포스팅에서 이를 개선해 보기로 하고, 이번 포스팅은 여기서 마치도록 한다.
[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (2)
◆ 함께 보면 좋은 글
'웹 프로그래밍 > 프론트엔드' 카테고리의 다른 글
[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (3) (0) | 2023.06.05 |
---|---|
[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (2) (0) | 2023.05.31 |
[HTML/CSS/JS] mouseenter와 mouseleave : 마우스 이벤트를 사용해 보자 (0) | 2023.05.29 |
[HTML/CSS/JS] JQuery의 addClass와 removeClass : 엘리먼트에 클래스를 추가, 삭제해 보자 (0) | 2023.05.28 |
[업비트/자동매매] Python으로 쉽게 평가금액 확인하기 : 매수금액을 구해보자 (0) | 2023.05.26 |
댓글