기술적지표3 - RSI(상대강도지수), Stochastic(스토캐스틱)

게으른직장인·2022년 3월 4일
0
post-thumbnail
post-custom-banner

RSI(상대강도지수)

RSI란?

RSI는 가격의 상승 압력과 하락 압력 간의 상대적인 강도를 나타내며, 일정 기간동안 주가가 전일 가격에 비해 상승한 변화량과 하락한 변화량의 평균값을 구하여 상승한 변화량이 크면 과매수로, 하락한 변화량이 크면 과매도로 판단하는 방식이다.

RSI 지표 개발자인 Welles Wilder는 RSI가 70%이상이면 과매수, 30%이하면 과매도 상태로 규정했다.

RSI 지표 공식

  1. 가격이 전보다 높은경우 상승분을 U(Up), 하락한 경우 하락분은 D(Down) 값이라고 한다.
  2. U와 D의 평균값을 각각 AU(Average Ups), AD(Average Downs) 라고 한다.
  3. AU/AD = RS(Relative Strength)
  4. RSI = RS / (1 + RS)

U와 D의 평균값을 구할때 Welles Wilder는 14봉을 사용하길 권장했다. 또한, 이전에 배운 지수이동평균을 계산한것처럼 최근값에 조금더 가중치를 부여해서 계산해 커스토마이징된 RSI를 사용 할 수도 있다.

RSI 그리기

import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np

u = df.diff(1)['close'].apply(lambda v:  v if v > 0 else 0)
d = df.diff(1)['close'].apply(lambda v:  -v if v < 0 else 0)

au = u.ewm(14, adjust=False).mean()
ad = d.ewm(14, adjust=False).mean()

rs = au/ad
df['RSI'] = rs / (1 + rs)

df_draw = df[-500:]

adps = []
adps.append(
    mpf.make_addplot(df_draw['RSI'],panel=1,type='line', ylabel='RSI'))
adps.append(
    mpf.make_addplot(np.ones(len(df_draw)) * 0.3, panel=1,type='line', color='red', linestyle='dotted',secondary_y=False))
adps.append(
    mpf.make_addplot(np.ones(len(df_draw)) * 0.7, panel=1,type='line', color='red', linestyle='dotted',secondary_y=False))


fig, axs = mpf.plot(df_draw, style='charles', figratio=(4,3),figscale=1.5, addplot=adps, returnfig=True)

추세전략을 활용함에 있어서 RSI는 정말 많이 사용되는 지표이다. 과매수, 과매도 구간을 위와 같이 정석대로 표기하였고, 나름 가격 차트와 비교해도 쓸모가 있어보인다. 하지만 실제 전략에 대입했을때는 고정된 파라메터를 사용하는것보다는 본인만의 시장과 연결된 변수를 사용하여 과매수 과매도 구간을 캐치하는것을 추천한다.

Stochastic(스토캐스틱)

스토캐스틱이란?

스토캐스틱은 특정 시장의 추세를 측정하는데 사용되는 지표이다. 자산의 최근 가격 종가를 과거 가격의 시가와 종가의 범위와 비교한 것이다. 이 가정의 기초 이론은 상승 추세에 있는 시장은 그 범위의 최고가 가까이에 장을 마감하고, 하락 추세에 있는 주식은 범위의 최저가 가까이에 장을 마감한다는 것이다.

스토캐스틱에는 Fast Stochastic과 Slow Stochastic이 존재하는데, Fast Stochastic은 그래프의 변화가 너무 잦고 급격하여 노이즈가 많다(가짜 매수, 매도 신호가 많이 발생). 그래서 일반적인 경우 Slow Stochastic을 사용한다.

스토캐스틱 지표 공식

Fast Stochastic

  • K = (현재가 - MIN(n 기간 가격)) / (MAX(n 기간 가격) - MIN(n 기간 가격)) * 100
  • D = K의 m기간 이동평균(SMA)

Slow Stochastic

  • J = D의 t기간 이동평균(SMA)

스토캐스틱 그리기

Slow Stochastic을 사용하기위해서는 n, m, t 3개의 하라메터가 필요하다. 일반적으로 15, 5, 3 을 많이사용한다. 해당방식으로 그래프를 그려보자

import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np

n, m, t = 15, 5, 3

k = (df['close'] - df['low'].rolling(n).min()) / (df['high'].rolling(n).max() - df['low'].rolling(n).min())
d = k.rolling(m).mean()
j = d.rolling(t).mean()

df['F_Stochastic'] = d
df['S_Stochastic'] = j

df_draw = df[-200:]

adps = []
adps.append(
    mpf.make_addplot(df_draw['F_Stochastic'], panel=1,type='line', ylabel='Stochastic'))
adps.append(
    mpf.make_addplot(df_draw['S_Stochastic'], panel=1,type='line', secondary_y=False))
adps.append(
    mpf.make_addplot(np.ones(len(df_draw)) * 0.2, panel=1,type='line', color='red', linestyle='dotted',secondary_y=False))
adps.append(
    mpf.make_addplot(np.ones(len(df_draw)) * 0.8, panel=1,type='line', color='red', linestyle='dotted',secondary_y=False))


fig, axs = mpf.plot(df_draw, style='charles', figratio=(4,3),figscale=1.5, addplot=adps, returnfig=True)

axs[2].legend(['F_Stochastic', 'S_Stochastic'])

일반적으로 오실레이터에 표기할때 과매수, 과매도 선을 80%, 20%로 설정한다. 이 역시 널리 알려진 이론이라 실전에 그대로 사용하기는 힘들다.

profile
취미로 퀀트 투자를 도전하는 직장인
post-custom-banner

0개의 댓글