저는 평소에 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일선을 돌파 후 주가가 어느 쪽으로 방향을 잡을지는 아무도 알 수 없습니다만, 해당 주식에 달라붙어 있는 개미, 기관 및 외국인들의 중장기 평균을 강하게 뚫고 올라가며 거래량이 터지면 아무래도 주가에 힘이 실린 것은 주지의 사실일 것 같습니다. 이 힘이 강력하고 어느 정도 유지가 되면 주가가 탄력을 받을 수 있을 것 같습니다.
'주식분석 > Quant 분석(프로그래밍)' 카테고리의 다른 글
주식 전종목 어떻게 불러올까? 거래소 종목 불러오기 (0) | 2023.04.06 |
---|---|
매수타점 찾기: Spear 시그널 #1 (2) | 2023.04.03 |
valuewhen 함수, 파이썬으로는 어떻게 작성할까? #2 (0) | 2023.03.30 |
valuewhen 함수, 파이썬으로는 어떻게 작성할까? (0) | 2023.03.29 |
급등주 매수 신호 (0) | 2023.03.26 |
댓글