요즘 핫한 kakao의 데이터를 가지고 매수/매도 적기를 찾아봤습니다. 지난 데이터지만, 데이터 대로라면 올 3월에 사서 계속 보유했어야 했네요. (저는 3월쯤 팔았.... ㅠㅠ )
데이터는 야후 금융 데이터를 이용했고 pandas datareader를 이용해 불러왔습니다. 저처럼 처음 사용하시면 설치가 필요할 수 있습니다.
$ pip install pandas_datareader
$ pip install yfinance
kakao의 종목코드는 035720(kospi)입니다. 그리고 2017년도 데이터부터 불러왔습니다.
from pandas_datareader import data
import yfinance as yf
# pandas data reader를 재정의(override)합니다
yf.pdr_override()
kakao = data.get_data_yahoo('035720.KS', "2017-01-01")
print(kakao)
Open High Low Close Adj Close Volume
Date
2017-01-02 77400.0 77600.0 76600.0 76700.0 76609.906250 143140
2017-01-03 77200.0 80000.0 77000.0 80000.0 79906.031250 445180
2017-01-04 80400.0 85100.0 80300.0 84300.0 84200.976562 1224395
2017-01-05 85000.0 86000.0 84000.0 84000.0 83901.328125 611713
2017-01-06 84400.0 84500.0 82200.0 83700.0 83601.679688 410880
... ... ... ... ... ... ...
2020-03-09 175500.0 175500.0 175500.0 175500.0 175500.000000 0
2020-03-10 164500.0 174500.0 164000.0 173000.0 173000.000000 950875
2020-03-11 172000.0 174500.0 167000.0 169000.0 169000.000000 550227
2020-03-12 167000.0 169000.0 158500.0 161000.0 161000.000000 1218070
2020-05-25 251000.0 270000.0 249000.0 268000.0 268000.000000 2622089
[776 rows x 6 columns]
출력 결과를 보면 모두 776개의 데이터를 가져왔고 시초가(Open), 고가(High), 저가(Low), 종가(Close), 수정종가(Adj Close), 거래량(Volume) 순으로 표시됩니다. 이중 수정 종가를 사용할 겁니다. ( 수정 종가 : 분할, 배당, 배분, 신주 발생이 된 경우를 고려해 주식 가격을 조정한 것, 데이터의 연속성을 위해서 수정 종가를 분석에 사용하는 경우가 많다고 합니다. )
이제 그래프를 시각화 해보면.
plt.style.use('seaborn')
plt.figure(figsize=(12.5, 4.5))
plt.plot(kakao['Adj Close'], label='kakao')
plt.title("kakao Adj Close Price History")
plt.xlabel("2017 ~ today")
plt.ylabel('Adj Close Price')
plt.legend(loc='upper left')
plt.show()
최근 가파른 주가 상승이 눈에 보이네요. ( 야후 데이터의 문제인지 3월 12일 데이터 이후에 바로 오늘 5월-25일의 데이터가 보입니다. )
이제 매수/매도 시점을 알아보기 위해 20평선과 60평선을 그리고 그 두 개 선이 교차되는 시점을 매수 또는 매도 신호로 판단하려고 합니다.
그래서 먼저 20평선과 60평선의 데이터를 만들고 시각화 해보면.
# 20평선
MA20 = pd.DataFrame()
MA20['Adj Close'] = kakao['Adj Close'].rolling(window=20).mean()
print(MA20)
# 60평선
MA60 = pd.DataFrame()
MA60['Adj Close'] = kakao['Adj Close'].rolling(window=60).mean()
print(MA60)
# 시각화 ( 20, 60 평선 )
plt.figure(figsize=(12.5, 4.5))
plt.plot(kakao['Adj Close'], label='kakao')
plt.plot(MA20['Adj Close'], label="MA20")
plt.plot(MA60['Adj Close'], label="MA60")
plt.title("kakao Adj Close Price History")
plt.xlabel("2017 ~ today")
plt.ylabel('Adj Close Price')
plt.legend(loc='upper left')
plt.show()
녹색이 20평선 빨간색이 60평선입니다. 2017년 12월 경 그리고 2018년 6월 등등에서 교차점이 보이고 2019년 3월 경에 마지막 교차가 이루어진 것을 알 수 있습니다. 지긋지긋한 코로나의 발생 시점인 듯하네요.
이제 20평선과 60 평선의 데이터를 가지고 교차되는 지점의 가격을 저장합니다. 20평선이 60평선 위로 올라가는 교차점을 매수 시기, 반대로 60평선 아래로 내려가는 지점을 매도 지점으로 판단합니다.
def buy_sell(data):
signal_price_buy = []
signal_price_sell = []
flag = -1
for i in range(len(data)):
# 20평선이 60평선 위로 높아지는 구간에서 매수 가격 저장 후 flag 1로 설정.
if data['MA20'][i] > data['MA60'][i]:
if flag != 1:
signal_price_buy.append(data['kakao'][i])
signal_price_sell.append(np.nan)
flag = 1
else:
signal_price_buy.append(np.nan)
signal_price_sell.append(np.nan)
# 20평선이 60평선 아래로 내려가는 구간의 시작을 매도 가격으로 저장후 flag 0으로 설정.
elif data['MA20'][i] < data['MA60'][i]:
if flag != 0:
signal_price_buy.append(np.nan)
signal_price_sell.append(data['kakao'][i])
flag = 0
else:
signal_price_buy.append(np.nan)
signal_price_sell.append(np.nan)
else:
signal_price_buy.append(np.nan)
signal_price_sell.append(np.nan)
return signal_price_buy, signal_price_sell
buy_sell = buy_sell(data)
data['Buy_Signal_Price'] = buy_sell[0]
data['Sell_Signal_Price'] = buy_sell[1]
이제 이렇게 구해진 데이터를 가지고 다시 시각화를 해줍니다. 매수와 매도 시점을 잘 보이게 하기 위해 각 평선은 알파값을 주어 투명하게 합니다.
# 시각화
plt.figure(figsize=(12.5, 4.5))
plt.plot(data['kakao'], label='kakao', alpha=0.3)
plt.plot(data['MA20'], label="MA20", alpha=0.3)
plt.plot(data['MA60'], label="MA60", alpha=0.3)
plt.scatter(data.index, data['Buy_Signal_Price'], label='Buy', marker="^", color='green')
plt.scatter(data.index, data['Sell_Signal_Price'], label='Sell', marker="v", color='red')
plt.title("kakao Adj Close Price History buy and sell")
plt.xlabel("2017 ~ today")
plt.ylabel('Adj Close Price')
plt.legend(loc='upper left')
plt.show()
이제 매수와 매도 시점을 확인할 수 있게 되었습니다. 사실 20평선과 60평선이 교차되는 지점을 구하는 것은 지난 데이터이기 때문에 이것만 가지고는 매수/매도 적기를 판단하기는 어려울 것 같습니다. 예측하기에는 다른 판단 기준이 필요할 것 같습니다.