본문 바로가기
데이터과학/데이터 분석 실습

실제 강도 지수를 이용한 알고리즘 트레이딩 (feat. 파이썬)

by 경성현 2020. 12. 31.

투자자들이 많이 사용하는 지표는 아니지만,
TSI는 기술 분석에 유용한 지표 중 하나입니다. 」

실제 강도 지수란?

실제 강도 지수(TSI)는 William Blau가 제안한 모멘텀 오실레이터입니다. William은 당시 인기 있었던 Stocks & Commodities Magazine에 TSI 대해 기고했습니다. William의 설명에 따르면 다른 오실레이터와 마찬가지로 TSI는 거래 신호를 식별하는 데 사용할 수 있습니다.

TSI는 잠재적인 과매도 또는 과매수 수준을 식별하는 데 사용합니다. 어떤 투자자는 TSI를 사용하여 중심선 교차점을 찾는 반면, 다른 투자자는 강세 및 약세 다이버전스를 식별하는 데 사용합니다.

TSI를 통해서 총 세 개의 선을 차트에 그릴 수 있습니다. 수평선(Equilibrium)은 제로선이라고하며 다른 두 선은 신호선이라고 합니다.

TSI 계산 방법

지표 계산 방법을 아는 것도 중요하지만, 더욱 중요한 것은 지표를 적용하고 해석하는 방법입니다. 

  1. Price Change (PC) = Current Close Price minus Prior Close Price
  2. PCS = 25-period EMA of PC
  3. PCDS = 13-period EMA of PCS
  4. APC = Absolute Value of Current Close Price minus Prior Close Price
  5. APCS = 25-period EMA of APC
  6. APCDS = 13-period EMA of APCS
  7. TSI = 100 x (PCDS / APCDS)

TSI 활용 방법

이 지표는 주로 자산 가격의 과매수 및 과매도 상태, 스팟 다이버전스를 식별하고, 중앙선을 통해 추세 방향과 변화를 식별하고, 신호선 교차로 단기 가격 모멘텀을 강조하는데 사용됩니다.

TSI는 가격 변동을 기반으로 하기 때문에 과매도 및 과매수 수준은 거래되는 자산에 따라 다릅니다. 일부 종목은 가격 반전을 보기 전에 +30 및 -30에 도달 할 수있는 반면, 다른 주식은 +20 및 -20 근처에서 반전 될 수 있습니다.

보유하고 있는 자산에 대해 극단적인 TSI 수준을 표시하여 과매수 및 과매도 위치를 확인하는 것이 중요합니다. 과매도라고 해서 반드시 구매 할 때가 되는 것은 아니며 자산이 과매수 되었다고 해서 반드시 매도 할 시점을 의미 하는 것은 아닙니다.

투자자는 일반적으로 트레이딩 결정을 트리거하는 다른 신호를 함께 주시는 것이 좋습니다. 예를 들어 과매수 영역에서 매도하기 전에 가격이나 TSI가 하락하기 시작할 때까지 기다리는 것도 좋은 전략입니다. 또는 신호선을 돌파하는 시점을 기다리는 것도 한 가지 방법입니다.

TSI와 신호선(=TSI의 지수이동평균선)의 교차

실제 강도 지수에는 신호선이 있으며, 이는 일반적으로 TSI선을 7-12주기로 지수 이동 평균을 취한 값입니다. 신호선 교차는 TSI선이 신호선을 교차 할 때 발생합니다. TSI선이 신호선을 뚫고 올라가면서 교차하면 매수 타이밍이라고 할 수 있습니다. TSI선이 신호선을 뚫고 아래로 내려가면서 교차하면 매도 타이밍이라고 할 수 있습니다.

신호선 교차는 자주 발생하므로 TSI의 다른 정보와 함께 사용해야 합니다. 예를 들어, TSI가 중심선 위에있을 때 (0 이상) 매수 타이밍이라고 할 수 있습니다. 또는 TSI가 과매수 영역에 있을 때 매도 타이밍이라고 할 수 있습니다.

중심선 크로스 오버

중심선 교차는 TSI가 생성하는 또 다른 신호입니다. 가격 모멘텀은 지표가 0 이상이면 양수이고 0 미만이면 음수입니다. 일부 투자자는 방향성 편향을 위해 중심선을 사용합니다. 예를 들어, 투자자는 지표가 중앙선 위에 있을 경우에만 매수 포지션을 취할 수 있도록 알고리즘화 할 수 있습니다. 반대로, 투자자는 주가가 약세일 것이며 지표의 가치가 0 미만인 경우에만 매도 포지션을 고려할 수 있습니다.

브레이크 아웃과 발산

투자자는 TSI에 의해 생성된 지지 및 저항 수준을 사용하여 돌파 및 가격 모멘텀 변화를 식별 할 수 있습니다. 예를 들어 지표가 추세선 아래로 떨어지면 계속해서 매도 포지션을 잡을 수 있습니다.

Divergence는 TSI가 제공하는 또 다른 도구입니다. 자산 가격이 상승하고 TSI가 하락하는 동안 이를 약세 다이버전스라고하며 가격 하락으로 이어질 수 있습니다. 가격이 하락하는 동안 TSI가 상승하면 더 높은 가격이 올 것이라는 신호일 수 있습니다. 이것을 강세 디버전스라고합니다.

발산은 타이밍이 좋지 않은 신호이므로 TSI 또는 기타 기술 지표에서 생성 된 다른 신호와 함께만 사용해야합니다.

파이썬으로 TSI 계산하기

라이브러리 Import

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

실제 강도 지수(TSI) 계산하는 함수

TSI 계산을 위해서 지수 이동 평균을 이용하여 스무딩을 두번 시행해야 합니다. 첫번째 스무딩에서 25-period를 윈도우로 사용하고, 두번째 스무딩에서는 13-period를 윈도우로 사용하는 것이 일반적입니다. 하지만, 스무딩 윈도우는 변경 가능합니다.

# 지수 이동 평균(Exponentially-weighted Moving Average, EMA)
def EMA(data, period=30):
  return data.ewm(span=period, adjust=False).mean()

# 실제 강도 지수 (s1: 첫번째 스무딩 윈도우, s2: 두번째 스무딩 윈도우, s3: TSI를 스무딩)
def TSI(df, s1=25, s2=13, s3=7):
    # 입력받은 값이 dataframe이라는 것을 정의해줌
    df = pd.DataFrame(df)

    # Price Change (PC)
    PC = df.Close.diff()

    # PC Smoothing (지수 이동 평균)
    PCS = EMA(PC, s1)
    
    # PC Double Smoothing
    PCDS = EMA(PCS, s2)

    # Absolute of PC
    APC = PC.abs()

    # APC Smoothing
    APCS = EMA(APC, s1)

    # APC Double Smoothing
    APCDS = EMA(APCS, s2)

    # True Strength Index (TSI)
    TSI = 100 * (PCDS / APCDS)
    TSI_signal = EMA(TSI, s3)  

    # Equilibrium Line (Zero Line)
    ZL = np.zeros([TSI.shape[0],1])

    # dataframe에 컬럼 추가
    df = df.assign(ZL=ZL, TSI=TSI, TSI_signal=TSI_signal)
    df.rename(columns={'TSI': f'TSI({s1},{s2})', 
                       'TSI_signal': f'TSI({s1},{s2},{s3})'}, inplace=True)

    return df

주가 데이터 로드

야후 파이낸스(yfinance 라이브러리)를 통해서 주가 데이터를 가져오겠습니다. yfinance 라이브러리가 없다면 '!pip install yfinance'를 통해서 설치해 주시면 됩니다.

import yfinance as yf

df = yf.download('NKLA', start="2020-01-01", end="2020-12-31")
df['Date'] = df.index

df.tail()

TSI 기술 지표를 계산하고 DataFrame에 추가하기

df = TSI(df, 25, 13, 10)
df = TSI(df, 40, 20, 10)
df.tail()

주가와 TSI 시각화 하기

start_dt = '2020-05-01'

# 주가 데이터 시각화
cut = df.Date>=start_dt
df[['Close']].loc[cut,:].plot(figsize=(12.2,6.4)) #Plot the data
plt.title(f'Price for AstraZeneca')
plt.ylabel('USD($)')

TSI와 신호선 시각화

TSI는 TSI(25,13)을 참고하면 되고, 신호선은 TSI(25,13)의 10-period EWM를 취한 TSI(25,13,10)을 보면 됩니다. TSI(25,13)_diff선은 TSI와 신호선의 차이값으로, 값이 음수에서 양수로 바뀔때 매수 타이밍으로 볼 수 있지만, false 신호가 많이 잡히긴 합니다. 

일반 TSI와 장기 TSI 시각화

일반 TSI는 TSI(25,13)을 의미하고, 장기 TSI는 조금 더 긴 기간에 대해서 지수 이동 평균을 계산한 TSI(40,20)을 의미합니다. 일반/장기 TSI를 이용해서 매수/매도 포지션을 잡을때는 장기 TSI로 전반적인 트렌드를 파악하고, 단기 TSI로 타이밍을 잡는 방법이 있습니다. 가령, 아래 그래프에서 노란색 지표를 보면 5월초부터 중순까지 노란색선이 상승 추세에 있습니다. 이런 상승 추세에 있을때 TSI값이 50을 넘으면 매도 신호로 볼 수 있습니다. 니콜라 주식을 갖고 있으신 분들은 5월 초에 매도 시점을 놓치셨다면, 5월 초에 한번 더 매도 타이밍이 왔었습니다. 그때 잘 매도를 하셨는지 모르겠네요.

TSI의 한계

TSI에서 제공하는 많은 신호는 잘못된 신호입니다. 즉, TSI 변화와 주가의 변화 양상이 예상과 다를 경우가 많습니다. 예를 들어, 상승 추세 동안 TSI가 중앙선 아래로 여러번 교차 할 수 있지만 TSI가 모멘텀이 하락했음을 나타내더라도 주가는 더욱 올라갈 수 있습니다.

신호선 교차는 또한 너무 자주 발생하기 때문에 많은 경우 투자자에게 좋은 트레이딩 혜택을 제공하지 못할 수 있습니다. 이러한 신호는 지표의 다른 요소를 기반으로 또는 다른 형태의 분석을 통해 선별적으로 활용 되어야 합니다. TSI는 때때로 가격 변경 방향없이 방향을 변경하여 TSI에서는 좋게 보이지만 가격에 따라 계속해서 돈을 잃는 거래 신호를 생성합니다.

발산은 또한 지표를 신뢰할 수없는 경향이 있습니다. 분기는 너무 오래 지속될 수 있으므로 반전이 실제로 발생하는시기에 대한 통찰력을 거의 제공하지 못합니다. 또한 가격 반전이 실제로 발생할 때 다이버전스가 항상 존재하는 것은 아닙니다.

TSI는 가격 행동 분석 및 기타 기술 지표와 같은 다른 형태의 분석과 함께 사용해야합니다.