본문 바로가기

Programming/Python for Stock Analysis

Stochastic Oscillator(스탁캐스틱) 구현하기 using Python | Making Stochastic Oscillator by using Python

The stochastic oscillator is calculated using the following formula:

%K = 100(C - L14)/(H14 - L14)

Where:

C = the most recent closing price

L14 = the low of the 14 previous trading sessions

H14 = the highest price traded during the same 14-day period

%K= the current market rate for the currency pair

%D = 3-period moving average of %K


이 지표의 기초가 되는 일반적인 이론은 상승 추세에 있는 시장에서는 종가가 당일 최고가 근접 가격에 형성될 것이고, 하락 추세에 있는 시장에서는 종가가 당일 최저가 근접 가격에 근접한다는 것입니다. % K가 % D라고하는 3-period 이동 평균을 크로스 할 때 거래 신호가 생성됩니다.


역사

Stochastic Oscillator는  조지 레인 (George Lane)에 의해 1950 년대 후반에 개발되었다. Lane에 의해 설계된 바와 같이, Stochastic Oscillator는 일정 기간 (일반적으로 14 일)에 걸쳐 주가의 최고가와 최저가의 범위와 관련하여 주식의 종가 가격의 위치를 ​​나타냅니다. 레인 (Lane)은 수 많은 인터뷰를 통해 Stochastic Oscillator가 가격이나 거래량 등을 따르지 않는다고 말했습니다. 그는 Stochastic Oscillator가 가격의 속도 또는 모멘텀을 따른다고 하였습니다. 레인은 인터뷰에서 주가가 바뀌기 전에 원칙적으로 주식 가격의 변화 추세 또는 속도가 변한다는 사실을 밝힙니다. 이 방법으로, Stochastic Oscillator는 지표가 상승장 혹은 하락장을 나타낼 때 선행적으로 나타나는 지표의 도구로 사용될 수 있습니다. 이 신호는 레인이 확인한 최초이자 가장 중요한 거래 신호입니다.


과매수(Overbought) vs. 과매도(Oversold)

Lane은 또한 Stochastic Oscillator은 과매도, 과매수를 구분짓는 중요한 역할을 한다고 밝혔습니다. 이 수치는 빠르게 변화든 천천히 변화하든 항상 0 에서 100의 범주에 속하기 때문입니다. 일반적으로 20이하의 범위일 때는 과매도 구간으로, 80 이상일 때는 과매수 구간으로 볼 수 있다고 합니다. 그러나 이 수치는 어느정도 조정이 가능합니다. 80이상의 값에서 거래가 발생할 경우는 고점 부근에서, 20이하의 값에서 거래가 이루어질 경우는 저점 부근에서 거래가 이루어 진다고 볼 수 있습니다.

그럼 이제 Stochastic Oscillator 를 파이썬으로 구현해 보도록 하겠습니다.

아래 코드는 개략적으로 만들어 본 코드입니다.


def get_stochastics(df,dest_path,date_list):
  
    window = 14
    l,h = df['Low'].rolling(window=window,center=False).min() , df['High'].rolling(window=window,center=False).max()
    k = 100 * (df['Close']-l)/(h-l)
    d=k.rolling(window=3,center=False).mean()
    k.plot(label='k')
    d.plot(label='d')
    #print("1")
    #below 20: Oversold
    #above 80: Overbought
    
    for j in range(len(k)):
        #print("2...")
        for d_list in date_list:
            #print(d_list)
            #print(str(k.index[j], str(d_list)))
            if (str(k.index[j]) == str(d_list)) and k[k.index[j]] < 20. and k[k.index[j]] >= d[d.index[j]]:
                print("Found Below 20 STOCHASTICS Signal(s)",str(k.index[j]))
       
                if not os.path.exists(dest_path):
                    try:
                        os.mkdir(dest_path)
                    except OSError as exc: # Guard against race condition
                        if exc.errno != errno.EEXIST:
                            raise
                plt.savefig(dest_path + '/' + str(st[1]) + '-' + str(st[2]) + '-Stochastics.png')
                with open(dest_path + '/' + timestr +'-Stochastics.csv','a') as csvfile:
                    writer = csv.writer(csvfile, delimiter=',')
                    writer.writerow([str(k.index[j]),str(EventCode),str(CompanyNm)])
   
                
                
    #plt.show()
    
    plt.clf()

위 코드를 바탕으로 어느 한 종목의 Stochastic Oscillator를 아래 그림처럼 그려보았습니다. 물론 실제 주식 거래를 하시는 분들은 증권사가 제공하는 HTS(Home Trading System)을 통해 손쉽게 찾아볼 수 있습니다. 그렇지만, 이렇게 코딩을 통해 구현하는데는 자신만의 종목발굴을 여러 보조 도구들을 이용하여 구현하고, 자동으로 해당 종목을 별다른 노력없이 사용자에게 알려주어 인간의 손이 덜 타는 시스템 매매를 할 수 있게 하는데 있습니다.

인간의 욕심이 더해지면, 타이밍을 놓치는 경우를 개인적으로 뿐만 아니라 많은 매매자가 경험을 해 보았을 것이라 봅니다. -_-;;