소스파일은 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-1. 골든 크로스 전략  (0) 2020.11.08
8. 매매 전략에 대해서  (0) 2020.11.08
7. 유틸 함수들  (0) 2020.11.08
6. 메시지 알람 (텔레그램)  (0) 2020.11.08

+ Recent posts