본문 바로가기
웹 프로그래밍/프론트엔드

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (4) : 최고가에 매도를 해보자

by me_in_sk 2023. 6. 7.
반응형

 

자동매매 프로그램을 개선해 보자

이번 포스팅에서는 지난 포스팅에 이어 수익률을 통해 분할 매도 로직을 추가해 보도록 하자. 지난 포스팅과 이어지는 구성이니 아래의 링크를 참고하여 학습하고 오는 것을 추천한다.

 

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (1)

 

[업비트/자동매매] Python으로 RSI 지표를 이용한 자동매매 프로그램 만들기 (1)

자동매매 프로그램 만들기 상대강도지수(RSI)는 투자자가 매수와 매도를 하는 시점에서 과매수 구간인지, 과매도 구간인지를 판단할 수 있게 도와주는 보조 지표이다. 이번 포스팅에서는 해당

me-in-journey.com


 

 

- 조건 설정 -

  1. RSI 지수가 70 이상일 때, 일부만 매도
  2. RSI 지수가 70에서 하락할 때, 전량 매도
  3. 목표 수익률을 달성했을 경우에 매도를 진행 
  4. RSI 지수의 최대값에서 특정 지수 하락시 매도 (최고점에서 매도를 노려보자)

 

 

분할하여 매도하기

target_revenue = 1.0        # 목표 수익률 (1.0 %)
division_amount = 0.3       # 분할 매도 비중


# 매도 조건 충족 (과매수 구간을 탈출할 때)
if rsi14 < 70 and before_rsi14 > 70:
        amount = upbit.get_balance(target_ticker)       # 현재 코인 보유 수량
        upbit.buy_market_order(target_ticker, amount)   # 시장가에 매도 
        balances = upbit.get_balances()                 # 매도했으니 잔고를 최신화!

# 매도 조건 충족 (과매수 구간일 때)
elif rsi14 > 70:
    ticker_rate = get_revenue_rate(balances, target_ticker)     # 수익률 확인

    # 목표 수익률을 만족한다면
    if ticker_rate >= target_revenue:
        amount = upbit.get_balance(target_ticker)           # 현재 코인 보유 수량
        sell_amount = amount * division_amount              # 분할 매도 비중
        upbit.buy_market_order(target_ticker, sell_amount)  # 시장가에 매도 
        balances = upbit.get_balances()                     # 매도했으니 잔고를 최신화!

 

과매수 구간이라고 해서 코인의 가격이 상승하지 않는것은 아니며, 기존의 방식처럼 70에서 낮아지는 순간 매도하는 것은 코인의 가격이 내려가고 있다는 것을 의미한다. 이에 단계적으로 분할매도를 하는 것으로 앞서 말한 문제들의 보완을 할 수 있다.

이때, 분할매도를 하는 것이 항상 이득인 상황은 아니므로, 투자 시기나 본인의 투자 성향에 따라 원하는 방식으로 매도하는 것을 추천한다. 그렇다면, 수익을 최대한 오래 가지고 있는 상황에서 시세가 하락하기 직전, 즉 최고가일 때 매도를 하는 방법은 없는걸까?

여기서 우리는 또다시 RSI를 돌아볼 필요가 있다. 과매수 구간에서 RSI 지수가 떨어지기 시작한다는 것은 사람들이 해당 코인을 매도하는 비율이 증가함과 동시에 해당 코인의 시세가 하락한다는 것을 알 수 있다. 이에 우리는 RSI 지수의 최대값을 기억하고, 해당 최고가에서 일정 수준의 RSI 지수가 떨어지는 순간에 매도를 한다면 나름 최고가에서 하락하기 직전에 매도를 할 수 있다.

 

 

json 파일을 활용해 보자

max_rsi_data = dict()

max_rsi_path = "파일 경로"

# 파일을 불러온다
try:
    # 파일을 읽어서 딕셔너리에 적용 
    with open(max_rsi_path, 'r') as json_file:
        max_rsi_data = json.load(json_file)

except Exception as e:
    print("Init...")
	
    # 0으로 초기화
    max_rsi_data["max_rsi14"] = 0.0
    max_rsi_data["sell_signal"] = False
    
    # 파일에 저장
    with open(max_rsi_path, 'w') as outfile:
        json.dump(max_rsi_data, outfile)

 

최초로 파일을 열 때는, 해당 파일이 생성이 안 된 상태이기 때문에 예외처리를 통해 파일을 생성해 줄 필요가 있다. 이처럼 파일을 생성하여 RSI 지수를 저장할 공간을 만들어 준다.

 

 

최대 RSI 지수 갱신

# 과매수 구간일 때
if now_rsi14 > 70.0:

    # 저장된 최대 RSI 지수보다 현재 RSI 지수가 더 높을 때
    if max_rsi_data["rsi14"] < now_rsi14:
        max_rsi_data["rsi14"] = now_rsi14	# 최대값 갱신

 

매도 지점 설정

# RSI 지수가 최대값에서 5.0 만큼 하락한다면
elif max_rsi_data["rsi14"] + 5.0 < now_rsi14:

    rsi_low_data["sell_signal"] = True	# 매도 신호
    max_rsi_data["rsi14"] = 0.0		# 매도를 했으니 초기화

 

이처럼 계속해서 최대값을 갱신해주는 것으로 코인의 시세가 오를 때는 매도를 하지 않고 있다가, RSI 지수가 최대값에서 일정 수치 이상으로 하락하는 순간 매도를 하는 것이다.

이는 수익을 오래 가져가면서도, 시세가 많이 하락하기 전에 매도를 하여 어느정도 수익을 보장해 줄 수 있는 방법인 동시에 당연하게도 매수를 하는 입장에서도 위의 방법을 적용을 할 수 있다. 위의 코드에서 5.0이라는 수치는 정답이 없는 수치이기 때문에, 본인이 투자하는 코인에 맞춰 본인의 투자 전략에 맞는 값을 찾아 적용해 보길 바라며 이번 포스팅은 여기서 마친다.

 

 


◆ 함께 보면 좋은 글

반응형

댓글