소스파일은 github.com/galaxywiz/StockCrawler_py 에서 확인 가능합니다.
골든 크로스(Golden Cross)는 2개 이상의 이동 평균선이 좋은(Golden)의미 = 매수 신호로 통과하였다 하여 골든 크로스라고 합니다.
단기 이동평균선과, 장기 이동평균을 상향 돌파하면, 매수세가 강하므로 상승추세라 볼 수 있고 이를 골든 크로스라고 합니다.
반대로 장기 이동평균선이 단기 이동평균선을 하향 돌파하면, 데드 크로스(Dead Cross) 라고 하고, 매도 신호로 판단합니다.
[2020-10-30][삼성SDI]
[MaTradeStrategy] long(매수) 신호가 잡혔을 때 차트입니다.
저는 단기를 EMA (지수 가중으로 최근 것에 좀더 평균값을 높게 쳐주는 방식) 5일선, 장기를 EMA20 선으로 설정해서 그어 봤습니다.
매수, 매도 차트를 보니 썩 좋아 보이진 않네요. 이 값은 따로 설정하기로 하고 아래와 같이 코드를 작성해 보도록 합니다.
#//---------------------------------------------------//
class MaTradeStrategy(TradeStrategy):
def __init(self, fast = "ema5", slow = "ema20"):
self.MA_FAST = fast
self.MA_SLOW = slow
def __crossUp(self, timeIdx):
if timeIdx < 1:
return False
chartData = self.stockData_.chartData_
prevCandle = chartData.iloc[timeIdx - 1]
fast = prevCandle[self.MA_FAST]
slow = prevCandle[self.MA_SLOW]
if fast < slow:
nowCandle = chartData.iloc[timeIdx]
fast = nowCandle[self.MA_FAST]
slow = nowCandle[self.MA_SLOW]
if fast > slow:
return True
return False
def __crossDown(self, timeIdx):
if timeIdx < 1:
return False
chartData = self.stockData_.chartData_
prevCandle = chartData.iloc[timeIdx - 1]
fast = prevCandle[self.MA_FAST]
slow = prevCandle[self.MA_SLOW]
if fast > slow:
nowCandle = chartData.iloc[timeIdx]
fast = nowCandle[self.MA_FAST]
slow = nowCandle[self.MA_SLOW]
if fast < slow:
return True
return False
def buy(self, timeIdx):
if self.stockData_.position_ == BuyState.STAY:
if self.__crossUp(timeIdx):
return True
return False
def sell(self, timeIdx):
if self.stockData_.position_ == BuyState.STAY:
if self.__crossDown(timeIdx):
return True
return False
def buyList(self):
signalList = []
signalList.append(np.nan)
chartData = self.stockData_.chartData_
for i in range(1, len(chartData)):
nowCandle = chartData.iloc[i]
if self.__crossUp(i):
signalList.append(nowCandle["close"])
else:
signalList.append(np.nan)
return signalList
def sellList(self):
signalList = []
signalList.append(np.nan)
chartData = self.stockData_.chartData_
for i in range(1, len(chartData)):
nowCandle = chartData.iloc[i]
if self.__crossDown(i):
signalList.append(nowCandle["close"])
else:
signalList.append(np.nan)
return signalList
코드 읽어 보시면 느낌이 오실 거라 생각합니다.
42라인으로 외부에서 buy 함수 호출되면, 내부적으로 __crossUp 이란 함수를 호출하고, __crossUp이 정의된 6라인을 보시면, 지금 캔들과, 전 캔들의 ema 값을 갖고 와서 이들이 크로스 하고 있는지 체크합니다.
buyList /sellList는 이 buy 함수와 sell 함수의 연장선으로 각 캔들 데이터에 buy / sell 시그널을 붙여 주기 위해 사용합니다.
전에 주식 차트를 출력하기 위한 printChart.py 에서 사용하는 [buySignal] [sellSignal]의 데이터를 만들어 줍니다.
'재테크 > 주식 알람 시스템 만들기' 카테고리의 다른 글
8-3. 단기 변동성 돌파 전략 (0) | 2020.11.08 |
---|---|
8-2. MACD 전략 (0) | 2020.11.08 |
8. 매매 전략에 대해서 (0) | 2020.11.08 |
7. 유틸 함수들 (0) | 2020.11.08 |
6. 메시지 알람 (텔레그램) (0) | 2020.11.08 |