본문 바로가기

IT Story/SQL Story

특정 기간 주가 하락했다가 회복한 종목의 증감률 구하기

2020년 3월 코로나로 인해 전 세계 주식 시장이 매우 큰 폭으로 하락했다. 코로나가 발생하기 전 1주일 평균 시장 가격과 코로나 도중 시장 가격, 현재 시장 가격을 비교해 보면 얼마나 떨어졌다가 얼마나 회복되었을까?

 

01. 기준 날짜 구간의 데이터 저장하기

기준 날짜 구간의 데이터를 #temp1에 저장한다. symbol  별로 구간별 평균가(AVG)를 계산해 저장하며 GROUP BY에 symbol 을 사용한다.

SELECT

     symbol,

     AVG([close]) AS [close]

     INTO #temp1

FROM stock

WHERE date >= '2021-05-31' AND date <= '2021-06-04'

GROUP BY symbol

SELECT * FROM #temp1 

결과

symbol                   close
^CMC200            999.178482055664
^DJI                      34627.279296875
^FTSE                 7080.47497558594
^GSPC                4208.22509765625

 

02. 주가 하락 종목을 비교/검색할 날짜 구간 데이터 저장하기

날짜 구간의 데이터를 검색한 결과를 #temp2에 저장한다.

SELECT

     symbol,

     AVG([close]) AS [close]

     INTO #temp2

FROM stock

WHERE date >= '2021-06-28' AND date < '2021-07-02'

GROUP BY symbol

SELECT * FROM #temp2

결과

symbol                   close
^CMC200            853.697250366211
^DJI                      34427.900390625
^FTSE                 7080.82507324219
^GSPC               4299.96240234375

     

03. 주가 회복 종목을 비교/검색할 날짜 구간 데이터 저장하기

날짜 구간의 데이터를 검색한 결과를 #temp3에 저장한다.

SELECT

     symbol,

     AVG([close]) AS [close]

     INTO #temp3

FROM stock

WHERE date >= '2021-07-05' AND date < '2021-07-09'

GROUP BY symbol

SELECT * FROM #temp3

결과

symbol                   close

^CMC200            846.916341145833
^DJI                      34560.36328125
^FTSE                  7111.875
^GSPC                 4340.82991536458

 

04. 3개의 임시 테이블을 결합한 기초 데이터 생성하기

INNER JOIN을 이용해  #temp1,  #temp2,  #temp3의 데이터셋을 만들어 #result에 저장한다.

SELECT

      a.symbol,

      a.[close] AS a_close,

      b.[close] As b_close,

     ( b.[close] - a.[close])/ a.[close] * 100 As b_a_ratio,

      c.[close] As c_close,

     ( c.[close] - a.[close])/ a.[close] * 100 As c_a_ratio,

     ( c.[close] - b.[close])/ a.[close] * 100 As c_b_ratio

     INTO #result

FROM #temp1 AS a

     INNER JOIN #temp2 AS b ON a.symbol = b.symbol

     INNER JOIN #temp3 AS c ON b.symbol = c.symbol

 SELECT * FROM #result

결과

symbol         a_close               b_colse              b_a_ratio          c_colse              c_a_ratio          c_b_ratio
^CMC200    999.1785           853.6973           -14.5601           846.9163         -15.2387            -0.67865

^DJI              34627.28           34427.9             -0.57579            34560.36        -0.19325             0.382539

^FTSE         7080.475           7080.825            0.004945          7111.875         0.443473            0.438529

^GSPC       4208.225            4299.962            2.179952          4340.83           3.151087            0.971134

 

05. 기준 날짜 대비 조건에 맞는 종목 검색하기

#result에서 #temp1 평균가 대비  #temp2 평균가가 -20% 이상 하락한 종목 중에  #temp1의 평균가 대비 #temp3 회복 가격이 -20%~-10%인 종목을 검색한다. 상장 폐지된 symbol은 제외. nasdaq_company와 조인해 company_name, sector, industry 정보를 함께 검색한다. #temp1, #temp2 하락률이 큰 순서의 오름차순과 #temp1,#temp3의 회복률 오름차순으로 정렬한다.

SELECT

      b.symbol,

      b.comanay_name

      b.sector,

      b.industry.      

      round(a.a_close, 2) As a_close,
      round(a.b_close, 2) As b_close,
      round(a.c_close, 2)  As c_close,
      round(a.b_a_ratio, 2) As b_a_ratio,
      round(a.c_a_ratio, 2) As c_a_ratio,
      round(a.c_b_ratio, 2) As c_b_ratio
FROM
#reulst AS a

     INNER JOIN nasdaq_company AS b ON a.symbol = b.symbol

WHERE   a.b_a_ratio <= -20

AND a.c_a_ratio >= -20

AND a.c_a_ratio <= -10

AND b.is_deleted is NULL -- 상장 폐지된 회사는 제외

ORDER BY b_a_ratio, c_a_ratio,

결과

symbol company_name sector industry                 a_close  b_close    c_close     b_a_ratio   c_a_ratio    c_b_ratio
ONCS                               Health Care                     3.86        2.95          3.13           -23.41        -18.89          4.52

ARL                                 Consumer Services         12.31       9.62         10.35         -21.9          -15.93          5.98

NG                                                                             10.26       8.02           8.34          -21.77         -18.71         3.06

LINK                              Capital Goods                   10.96       8.62           8.97           -21.37        -18.13        3.24

AU                                 Basic Industries                 23.4        18.53         19.35         -20.82        -17.32         3.5

RFP                               Basic Industries               14.88        11.86        12.06         -20.31         -18.94        1.37

 

06. 모든 임시 테이블 삭제하기

DROP TABLE #temp1

DROP TABLE #temp2

DROP TABLE #temp3

DROP TABLE #result