본문 바로가기
주식분석/Quant 분석(프로그래밍)

막힌벽을 강하게 뚫어보자- 222일선 강하게 돌파하는 전략

by hustler78 2023. 4. 4.
728x90
반응형

 

저는 평소에 222일선을 주목합니다. 단타를 지양하고 중장기 투자를 지향하다 보니, 투자자들이 중장기적으로 평균 어느 정도에서 해당 주식을 거래했는지가 궁급합니다.

 

그러다 보니 1년 주식값의 평균을 생각하게 되었고, 이 평균에 어떤 사람들은 물려 있고, 어떤 사람들은 수익이 나고 있을 거라는 생각이 있습니다. 물려 있는 개미들은 1년 주식값 평균을 주가가 넘어서는 경우 본전으로 탈출이 가능할 것이며, 큰 손들은 이렇게 시장에 던져진 물량을 받아먹으며 주가를 올릴 채비를 할 것 같은 상상에서 나온 전략을 소개합니다

 

1년은 통상 250일 정도로 이루어져 있습니다. 하지만, 여름 휴가 시즌을 보내고 12월 연말에 한 해를 정리하는, 이른바 소강상태의 국면들을 데이터에서 지워보면 한 30여 일 정도가 빠지는 것 같습니다. 따라서 220일 정도의 평균, 여기에 단순히 숫자를 예쁘게 하기 위해 222일 평균선이 각광을 받는 것 같습니다.

 

바다를 강하게 뚫고 나오는 범고래, 원봉은 링크 참조

 

고래가 바다를 뚫고 나오듯이, 강렬한 상승의 힘을 내뿜는 주식을 검색해 볼까요? 먼저 매수 신호를 포착하는 전략입니다.

 

 

 

매수 신호 포착 전략

222일 선을 강하게 뚫고 올라오는 주식은 이렇게 설정했습니다.

1) 캔들이 양봉이고 ( 즉, 시가 < 종가 이고)

2) 시가는 222일선 아래, 종가는 222일선 위에

3) 222일선과 시간의 차이보다, 222일선과 종가의 차이가 더 큼

4) 거래량은 전일대비 3배 이상 

 

그림으로 표현하면 아래와 같습니다.

 

 

 

 

 

위 내용을 HTS 조건 검색에 쓰기 위해 pine script로 우선 작성해 보겠습니다.

 

 

 

Pine Script

 

ma222 = avg(c,222);

c1 = o < ma222;
c2 = c > ma222;
c3 = v > 3* v(1);
c4 = c - ma222 > ma222 - o;

c1 && c2 && c3 && c4

 

 

본 블로그에 처음 등장하는 pine script 문법을 소개합니다.

 

avg(A, n)

A라는 시계열의 n 개의 데이터를 평균합니다. 이동평균선 추출할 때 많이 쓰이겠죠.

이동평균선은 종가의 평균을 의미하므로 pine script에서 종가 시계열을 뜻하는 c를 써서

avg(c, n)

이라 하면 n일 이동평균선이 됩니다.

 

 

v, v(n)

v는 volume의 약어로, 거래량을 의미합니다. 또한 어제의 시고저종을 각각, o(1), h(1), l(1), c(1)이라 쓰듯이, 어제의 거래량을 v(1)로 표현합니다. n 영업일 전의 거래량은 v(n)이 되겠죠.

 

 

 

이를 파이썬으로  구현해 보겠습니다.

 

 

Python Code 

 

 

from mpl_finance import candlestick_ohlc
import matplotlib.dates as mpl_dates
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
import FinanceDataReader as fdr
from matplotlib import gridspec

def load_data(stock_code, start_date, end_date):
    df = fdr.DataReader(stock_code, start_date, end_date)
    return df

def Beat_Ma():
    end_date = datetime.datetime.today()

    start_date = end_date - relativedelta(years=3)

    stk_code = '312610'  # 에이에프더블유

    df = load_data(stk_code, start_date, end_date)
    df.index = df.index.map(mpl_dates.date2num)    # df의 index 를 date -> num 형식으로 바꿈
    df['Date'] = df.index                          # index와 일치하는 column 설정

    volume_multiplier = 3                          # 거래량 증폭 승수
    df['Ma222'] = df.Close.rolling(222).mean()     # 222일 이평선 만듬

    df= df.copy().tail(50)      # 현재를 자세히 보기위해 최근 50영업일로 자름
    cond1 = df.Open < df.Ma222  # 시가는 Ma222 보다 작고
    cond2 = df.Close > df.Ma222 # 종가는 Ma222 보다 크면서
    cond3 = df.Volume > volume_multiplier * df.Volume.shift(1)  # 거래량은 3배 넘게 증가
    cond4 = df.Close - df.Ma222 > df.Ma222 - df.Open            # 종가 - ma222 > ma222 -시가

    df['signal'] = cond1 & cond2 & cond3 & cond4   # 위 조건4개를 동시에 만족하면 signal!!


    df_ohlc = df[['Date', 'Open', 'High', 'Low', 'Close']]

    fig =plt.figure()
    # 2*1 fig를 그리는데 ax크기를 서로 다르게 배치할 때 쓰는 법
    gs =gridspec.GridSpec(nrows=2, ncols=1, height_ratios=[5,2]) # 2*1 axes, 높이비율 5:2  
    ax_ohlc = fig.add_subplot(gs[0])                     # 1st ax에 candle chart 예정
    ax_volume = fig.add_subplot(gs[1], sharex=ax_ohlc)   # 2nd ax에 volume bar chart 예정
                                                         # ax_ohlc와 x축 share

    candlestick_ohlc(ax_ohlc, df_ohlc.values, width=0.6, \
                     colorup='red', colordown='blue', alpha=0.8)
    ax_ohlc.plot(df.index, df.Ma222, label='MA_222days')
    ax_ohlc.plot(df.index, df.Close, label='close')
    ax_volume.bar(df.index, df.Volume,label='volume')
    ax_ohlc.scatter(df[df['signal'] == True].index, df[df['signal'] == True].Close * 1.02,
               marker='2', c='black', label='signal', s=200)   # signal 따로 scattering
                                                               # marker ='2'는 tri-up marker
    date_format = mpl_dates.DateFormatter('%y/%b/%d')          # date format 지정

    ax_volume.xaxis.set_major_formatter(date_format)           # x축 데이터 표시형식

    ax_ohlc.legend(loc ='upper left')
    ax_volume.legend(loc ='upper left')
    plt.suptitle(f'{stk_code}')
    plt.show()

if __name__ == '__main__':
    Beat_Ma()

 

위 코드에 나와있는 에이에프더블유(312610)의 결과를 보시죠.

 

 

 

어떻습니까? tri up marker가 두 군데 표시되어 있습니다. 하늘색 222일 이동평균선을 강하게 돌파하죠!  조금 지나 봐야 알겠지만, 강한 상승을 보여주지 않을까 예상해 봅니다(개인적 바람.)

 

 

지엔원에너지(270520) 한번 보시죠. 22년 11월 경 강하게 222일선을 돌파하며 tri up marker를 찍었습니다. 그리고 엄청난 상승을 보여주네요.

 

 

 

 

222일선을 돌파 후 주가가 어느 쪽으로 방향을 잡을지는 아무도 알 수 없습니다만, 해당 주식에 달라붙어 있는 개미, 기관 및 외국인들의 중장기 평균을 강하게 뚫고 올라가며 거래량이 터지면 아무래도 주가에 힘이 실린 것은 주지의 사실일 것 같습니다. 이 힘이 강력하고 어느 정도 유지가 되면 주가가 탄력을 받을 수 있을 것 같습니다.

728x90
반응형

댓글