차밍이

[Python] 주식 오버나잇(Overnight) 효과 파악 분석 - 파이썬 주식투자(5) 본문

투자/Quant & BackTest

[Python] 주식 오버나잇(Overnight) 효과 파악 분석 - 파이썬 주식투자(5)

2020. 12. 22. 10:56
반응형

목차

 

 

     

     

    오버나잇 효과

      주식을 단기 전략에 대해서 공부하다 보면 쉽게 들을 수 있는 오버나잇 효과에 대해서 알아보겠습니다.

      오버나잇이란 밤새 주식을 들고있는 경우를 의미합니다. 주식을 매수해서 장이 종료된 후 다음날 시초를 의미합니다.

      흔히 하는 실수 중 하나는 주가가 혹은 주가 지수가 장 중에만 움직인다고 생각하는 것입니다.

      아침에 장이 열려서 장이 끝나는 시간까지 주가가 움직임고, 장이 끝나고 나서는 움직이 않는다고 생각하죠.

      하지만 실제로는 장이 종료된 이후, 여러가지 대내외적인 요소에 의해서 주가는 영향을 받습니다. 단지 움직이지 않고 potential만 가지고 있습니다.

      이후, 다음날 장이 열리는 시점에 Gap 을 통해 거래되지 않은 시세를 분출하곤 합니다.

      저녁 시간이 지난 후, 갭으로 상승 혹은 하락하며, 움직이지 않은 주가를 반영하는 것이지요.

      그렇다면 장 중에 움직이는 주가가 상승 확률이 높을지 or 장이 끝난 후, 다음날 아침이 되는 지점이 주가 상승 확률이 높을지 알아보겠습니다.

      파이썬을 사용해서 데이터 분석을 진행하여 결과를 살펴보겠습니다.

      결론부터 말씀드리면, 오버나잇 한 후의 결과가 더 좋게 나타납니다.

       

      KOSPI 오버나잇 효과 파악

      KOSPI 지수 데이터 준비

      해당 부분에 대한 설명은 이전 글을 참고해주시면 감사하겠습니다.

      [Python] pandas_datareader 코스피 코스닥 지수 데이터 가져오기 // 파이썬 주식투자(1)

      [Python] KOSPI 이동평균선, 주가 이동평균선 구하기 // 파이썬 주식투자(2)

      import matplotlib.ticker as ticker
      import matplotlib.pyplot as plt
      from pandas_datareader import data  
      from datetime import datetime
      import pandas as pd
      import numpy as np
      
      # 데이터를 가져올 날짜 설정
      start_date = datetime(1997,7,1)
      end_date = datetime(2020,12,21)
      
      # 야후에서 코스피 데이터 가져오기
      kospi_df = data.get_data_yahoo("^KS11", start_date, end_date) 
      
      # 코스피 지수 그래프 그리기
      fig = plt.figure(figsize=(20,10))
      ax = fig.add_subplot(111)
      
      ax.plot(kospi_df[['Close']])
      
      ax.set_title('KOSPI Index', fontsize=30)
      ax.set_xlabel('Date', fontsize=20)
      
      plt.grid()
      plt.show()

       

      주가 지수 변화량 비교

      # 당일 시초가 매수 종가 매도
      kospi_df['Open2Close'] = (kospi_df['Close'] - kospi_df['Open'])
      
      # 당일 종가 매수 다음날 시초가 매도
      kospi_df['Close2TmrOpen'] = (kospi_df['Open'] - kospi_df['Close'].shift(1))
      
      overNight = kospi_df[['Open2Close', 'Close2TmrOpen']].fillna(0) # 데이터가 없는 첫날은 0
      
      overNight.cumsum().plot()
      plt.show()

       

      주가 지수의 변화량을 누적 합을 통해 1997년부터 2020년 12월 21일 오늘까지의 합을 구한 것입니다.

      전반적인 추세가 매우 명확하게 보이는 것을 확인할 수 있습니다.

      시초가에서 종가의 변화량보다 종가에서 다음날 시초가의 변화량이 훨씬 크다는 것을 확인할 수 있습니다.

       

      주가 지수 변화율 비교

      # 변화율 계산을 위해 % 로만 바뀜. 위와 수식 유사
      kospi_df['Open2Close'] = (kospi_df['Close'] - kospi_df['Open']) * 100 / kospi_df['Open']
      kospi_df['Close2TmrOpen'] = (kospi_df['Open'] - kospi_df['Close'].shift(1)) * 100 / kospi_df['Close'].shift(1)
      
      overNight = kospi_df[['Open2Close', 'Close2TmrOpen']].fillna(0)
      overNight

      단순 산순평균을 보더라도 오버나잇의 변화율이 훨씬 크게 나타납니다.

       

      오버나잇 복리 수익률 비교

      복리 수익률을 확인하기 위해 기하 평균을 구해보겠습니다.

      백분율로 맞춰 cumprod 메소드를 사용해서 기하 평균을 구하였습니다.

      (overNight/100 + 1).cumprod()

       

      Open To Close VS Close To Next Open : Graph

      fig, axes = plt.subplots(1,2, figsize=(10,5))
      
      axes[0].set_title("Open To Close")
      axes[1].set_title("Close To Next Open")
      
      (overNight/100 + 1).cumprod()['Open2Close'].plot(ax=axes[0], color='b')
      (overNight/100 + 1).cumprod()['Close2TmrOpen'].plot(ax=axes[1], color='r')
      plt.show()

      어느 정도의 굴곡이 있지만 확연하게 차이가 있는 것을 볼 수 있습니다. 장기적으로 우상향 하는 모습은 오버나잇 한 경우에서 확인할 수 있습니다.

       

      KOSDAQ 오버나잇 효과 파악

      코스피에서는 오버나잇을 확실히 먹히는 것을 확인했습니다. 그렇다면, 코스닥에서는 어떤 결과를 가져올까요?

      # 데이터를 가져올 날짜 설정
      start_date = datetime(1990,5,8)
      end_date = datetime(2020,12,21)
      
      # 야후에서 코스닥 데이터 가져오기
      kosdaq_df = data.get_data_yahoo("^KQ11", start_date, end_date) 
      
      # 주간, 오버나잇 수익률
      kosdaq_df['Open2Close'] = (kosdaq_df['Close'] - kosdaq_df['Open']) * 100 / kosdaq_df['Open']
      kosdaq_df['Close2TmrOpen'] = (kosdaq_df['Open'] - kosdaq_df['Close'].shift(1)) * 100 / kosdaq_df['Close'].shift(1)
      
      overNight = kosdaq_df[['Open2Close', 'Close2TmrOpen']].fillna(0)
      
      # 복리 수익률
      geo = (overNight/100 + 1).cumprod()
      
      # 그래프 그리기
      fig, axes = plt.subplots(1,2, figsize=(10,5))
      
      axes[0].set_title("Open To Close")
      axes[1].set_title("Close To Next Open")
      
      geo['Open2Close'].plot(ax=axes[0], color='b')
      geo['Close2TmrOpen'].plot(ax=axes[1], color='r')
      plt.show()

      코스닥에서는 더욱 깔끔한 그래프를 그리며 오버나잇 효과가 강력함을 보여줍니다.

       

      개별 종목 오버나잇 효과 파악

      개별 종목의 오버나잇 효과를 파악해보겠습니다.

      네이버 finance의 상위 인기 종목 중 명신산업을 제외한 5개를 진행하겠습니다.

      명신산업은 상장한지 얼마 되지 않아 데이터가 짧아서 제외하였습니다.

      # 데이터를 가져올 날짜 설정
      start_date = datetime(1990,5,8)
      end_date = datetime(2020,12,21)
      
      # 신풍제약, 대웅제약, 삼성전자, 쌍용차, 셀트리온 5개 종목
      for kr_ticker in ['019170', '069620', '005930', '003620', '068270']:
          # 코스피 코스닥을 직접 확인하기 귀찮아서 try except문을 사용했습니다.
          # 코스피는 뒤에 .KS 코스닥은 .KQ  ticker를 붙여서 검색해야합니다.
      
          try:
              stock_df = data.get_data_yahoo(kr_ticker+".KS", start_date, end_date) 
          except:
              stock_df = data.get_data_yahoo(kr_ticker+".KQ", start_date, end_date) 
      
          # 주간, 오버나잇 수익률
          stock_df['Open2Close'] = (stock_df['Close'] - stock_df['Open']) * 100 / stock_df['Open']
          stock_df['Close2TmrOpen'] = (stock_df['Open'] - stock_df['Close'].shift(1)) * 100 / stock_df['Close'].shift(1)
      
          overNight = stock_df[['Open2Close', 'Close2TmrOpen']].fillna(0)
      
          # 복리 수익률
          geo = (overNight/100 + 1).cumprod()
      
          # 그래프 그리기
          fig, axes = plt.subplots(1,2, figsize=(10,5))
      
          axes[0].set_title("Open To Close")
          axes[1].set_title("Close To Next Open")
      
          geo['Open2Close'].plot(ax=axes[0], color='b')
          geo['Close2TmrOpen'].plot(ax=axes[1], color='r')
          plt.show()

      전반적인 추세는 지수와 비슷한 것 같기도?? 하지만, 완전히 맞다고 하기는 어려울 것 같습니다.

      개별 종목에는 오버나잇이 완전히 들어맞지는 않나봅니다..

      조금 더 분석이 필요할 것 같습니다.

      반응형

      관련된 글 보기

      Comments