본문 바로가기

Log

주식 분석 툴에 MACD 분석 기능을 추가함.

매일 장마감 후에 주식분석 결과를 올린지 1주일이 넘었다.
아직 백테스팅 로직은 구현하지 않아서, 이평선 골드크로스 분석한 결과들을 랜덤하게 종목 검색해가며 현재 주가가 어떤지를 찾아봤는데, 한눈에도 분석결과가 나온 이후 우상향한 주식은 절반도 되지 않아보였다. 좀 더 장기적으로 보고 특정 기간 이후에 종가를 분석해봐야 하는지는 더 고민해봐야 할 문제이긴 하지만, 골드크로스 전략에 대한 글을 구글링만 해서 찾아봐도 그냥 아무 주식을 같은기간을 보유하는 것에 비해 평균적으로 수익률이 낮다는 통계 결과도 있다.

https://gorakgarak.tistory.com/714

 

골드크로스 전략은 과연 유효한가? 시스템 트레이딩으로 실현시켜본 이평선전략

이동평균선을 이용한 거래전략은 주식거래에 있어서 가장 기본적인 분석 지표중 하나로써 주식에 ‘추세’가 있다고 가정하고 있고, 단기 이동평균선이 장기 이동평균선을 추월하게 될때 주식을 매수하는 전략이다..

gorakgarak.tistory.com

그럼에도 기술적 분석들을 하나씩 구현해가는 이유는 내가 최종목표로 나가는 일부라고 생각하려고 한다. 지금 누군가가 분석 품질이나 도움이 되는 정보인가에 대해 묻는다면 정말 좌절스럽겠지만 조금씩 나아질 것이다. 틈틈히 짬내서 MACD 지표 계산을 추가하고 자동 포스팅이 되게끔 추가하였다. 골드크로스보다는 좀 더 매도, 매수신호를 상승추세나 하락추세 시작 시점에 알려주는 지표라 이전보다는 좀 더 낫지 않을까 싶다.

MACD의 계산 코드는 아래와 같다. python이며 pandas를 이용하였다. MACD 지표를 구하는 일부 코드만 첨부하지만, 코드를 읽으면 앞단에 필요한 데이터가 무엇이 필요한지 유추가 가능하다.

  def calculateMACD(self, code, date, short=12, long=26, signal=9):
    ret = {}
    avg_list = self.session.query(StockDailyChart.date, StockDailyChart.end_price) \
      .filter(StockDailyChart.code == code, StockDailyChart.date <= date)\
      .order_by(StockDailyChart.date.desc()).limit(50).all()

    if len(avg_list) == 0:
      return None

    avg_df = pd.DataFrame(avg_list)
    avg_df = avg_df.sort_values(by='date', ascending=True)

    avg_df['macd'] = avg_df['end_price'].ewm(span= short, min_periods= short-1, adjust=False).mean() \
                  - avg_df['end_price'].ewm(span= long, min_periods= long-1, adjust=False).mean()
    avg_df['macd_sig'] = avg_df['macd'].ewm(span= signal, min_periods= signal-1, adjust=False).mean()
    avg_df['macd_osc'] = avg_df['macd'] - avg_df['macd_sig']

    ret['macd'] = avg_df['macd'].tail(1)[0]
    ret['macd_sig'] = avg_df['macd_sig'].tail(1)[0]
    ret['macd_osc'] = avg_df['macd_osc'].tail(1)[0]

    return ret