본문 바로가기

IT Story/SQL Story

주가가 연속 상승한 종목 분석하기

일정 날짜 동안 주가가 N% 이상 오른 종목 중 특히 연속으로 오른 종목을 검색할 것이다. 

stock 테이블에서 2021년2월17일부터 2021년2월24일까지의 일별 주식 데이터를 비교해 주가가 10% 이상 오른 종목 중 해당 기간 동안 한번도 주가가 떨어지지 않은 종목만 검색한다. 

01. 증감 주가와 증감 주기율 저장하기

첫 날짜와 마지막 날짜의 종가를 검색해 증감 주기와 증감 주기율의 데이터셋을 만든다.

같은 symbol 데이터를 비교하기 위해 FROM  문의 서브 쿼리를 사용해 2021년2월17일의 데이터셋을 만들고, 2021년2월24일의 데이터셋을 만든 다음 조인 조건으로 symbol 열을 비교한다. 검색 결과는 임시 테이블 #temp에 저장한다.

SELECT                                 -- 최종적으로 보고 싶은 컬럼을 선택

     a.symbol,

     a.[close] AS a_close,

     b.[close] AS b_close,

     b.[close] -  a.[close] AS diff_price,

     (b.[close] -  a.[close])/ b.[close]  * 100 AS diff_ratio

     INTO #temp

FROM (

        SELECT

              symbol,

              [close]

         FROM stock

         WHERE date = '2021-02-17'

         ) AS a

         INNER JOIN (

         SELECT 

               symbol,

              [close]

          FROM stock 

         WHERE date = '2021-02-24'

         ) AS b ON a.symbol = b.symbol

--#temp 데이터 검색

SELECT * FROM #temp

결과

symbol  a_close                            b_close                         diff_price                            diff_ratio
AGM     84                                     85.120002746582       1.12000274658203         1.31579265794491
ADTX   4.07000017166138       3.3199999332428      -0.750000238418579      -22.5903690813035
ALDX  13.1999998092651        12.2200002670288    -0.979999542236328      -8.01963601326996
AMER  27.9200000762939        28.7999992370605    0.879999160766602       3.0555527224952

 

02. 주가 증가율이 10% 이상인 일별 데이터 저장하기

diff_ratio >= 10인 일별 데이터셋을 만들기 위해 #temp와 stock을 조인한다.

이때 ROW_NUMBER 함수를 사용해 symbol 단위로 파티션을 생성하고 날짜 순서대로 순위를 부여한다. 

순위를 부여하는 이유는 전일 날짜를 비교할 때 주식 시장이 열리지 않는 주말이나 공휴일이 기간에 포함될 경우 공백이 생기므로 -1일 방식으로 비교할 수 없기 때문이다. 생성한 데이터는 #temp2에 저장한다.

SELECT

     ROW_NUMBER() OVER (PARTITION BY a.symbol ORDER BY date  ASC) As num,

    a.symbol,

    b.date,

    b.[close]

    INTO #temp2

FROM #temp AS a

    INNER JOIN stock as b ON a.symbol = b.symbol

 WHERE a.diff_ratio >= 10 

AND b.date >='2021-02-17'

AND b.date <='2021-02-24'

SELECT FROM #temp2

결과

num   symbol  date                                              close
1          AA       2021-02-17 00:00:00.000         21.9300003051758
2          AA       2021-02-18 00:00:00.000         21.1200008392334
3          AA       2021-02-19 00:00:00.000         23.1299991607666
4          AA       2021-02-22 00:00:00.000         24.7999992370605
5          AA       2021-02-23 00:00:00.000         24.8999996185303

6          AA       2021-02-24 00:00:00.000         27.2000007629395

 

03. SELF JOIN을 사용해 순위 데이터 비교하기

#temp2를 SELF JOIN해서 현재 순위보다 1만큼 높은 데이터를 비교한다. 생성한 데이터는 #temp3에 저장한다.

SELECT

     b.symbol,

     a.[date] AS a_date,

     a.[close] AS a_close,

     b.[date] AS b_date,

     b.[close] AS b_close,

     b.[close] -  a.[close] AS diff_price,

     (b.[close] -  a.[close])/ a.[close]  * 100 AS diff_ratio

     INTO #temp3

FROM #temp2 AS a

     INNER JOIN #temp2 AS b ON a.symbol = b.symbol AND a.num = b.num-1

ORDER BY b.symbol, b.date

SELECT * FROM #temp3

결과

symbol a_date                                    a_close                        b_date                                   b_close
AA        2021-02-17 00:00:00.000   21.9300003051758   2021-02-18 00:00:00.000   21.1200008392334
AA        2021-02-18 00:00:00.000   21.1200008392334   2021-02-19 00:00:00.000   23.1299991607666
AA        2021-02-19 00:00:00.000   23.1299991607666   2021-02-22 00:00:00.000   24.7999992370605
AA        2021-02-22 00:00:00.000   24.7999992370605   2021-02-23 00:00:00.000   24.8999996185303
AA        2021-02-23 00:00:00.000   24.8999996185303   2021-02-24 00:00:00.000   27.2000007629395

            diff_price                                diff_ratio
            -0.809999465942383           -3.6935679647538
            2.0099983215332                 9.51703712908641
            1.67000007629395               7.22006111926982
            0.100000381469727             0.403227357040755
            2.30000114440918               9.23695252869621

 

04. 주가 하락이 한 번도 없는 종목 검색하기

#temp3에서 전일과 비교해 한 번이라도 주가가 하락한 종목이 있으면 제외한 테이블을  #temp4에 저장한다.

WHERE 문에 NOT IN을 사용해 하락한 symbol이 있는지 검사한 다음 조건에 포함되지 않는 항목한 검색한다. 

SELECT

     symbol,

     a_date,

     round(a_close, 2)  AS a_close,

     b_date,

     round(b_close, 2)  AS b_close,

    round(diff_close, 2) As diff_price,

    round(diff_ratio, 2) AS diff_ratio

    INTO #temp4

FROM #temp3

WHERE symbol NOT IN (SELECT symbol FROM #temp3 WHERE diff_ratio <0 GROUP BY symbol)

SELECT * FROM #temp4

결과

symbol a_date                                  a_close  b_date                                    b_close   diff_price    diff_ratio
AAT      2021-02-17 00:00:00.000 29.2        2021-02-18 00:00:00.000    29.26       0.06               0.21
AAT      2021-02-18 00:00:00.000 29.26      2021-02-19 00:00:00.000    29.3         0.04               0.14
AAT      2021-02-19 00:00:00.000 29.3        2021-02-22 00:00:00.000    30.45       1.15               3.92
AAT      2021-02-22 00:00:00.000 30.45      2021-02-23 00:00:00.000   31.62        1.17               3.84

 

05. 모든 임시 테이블과 나스닥 기업 테이블을 조인해 최종 데이터 생성하

SELECT

     a.symbol,

     d.company_name,

     d.industry,

     ROUND(a.a_close, 2) AS a_close,

     ROUND(a.b_close, 2) AS b_close,

     ROUND(a.diff_close, 2) AS diff_price,

     ROUND(a.diff_ratio, 2) AS diff_ratio

FROM #temp AS a

     INNER JOIN (SELECT symbol FROM #temp2 GROUP BY symbol) As b ON a.symbol = b.symbol

     INNER JOIN (SELECT symbol FROM #temp4 GROUP BY symbol) As c ON a.symbol = c.symbol

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

ORDER BY diff_ratio DESC

결과

symbol  company_name                                       industry                                                a_close  b_close  diff_price  diff_ratio
AMPG  Amplitech Group Inc. Common Stock   Industrial Machinery/Components     6.61        9.25        2.64          28.54
BLBD  Blue Bird Corporation Common Stock  Construction/Ag Equipment/Trucks  19.48      26.55      7.07          26.63
CAR    Avis Budget Group Inc. Common Stock  Rental/Leasing Companies              42.82      55.9       13.08        23.4
TRIP    TripAdvisor Inc. Common Stock                                                                            38.05      49.56      11.51       23.22

 

최종적으로 얻은 데이터는 주가가 10% 이상 오르고(#temp2) 하루도 빠지지 않고 상승한 종목들(#temp4)의 symbol, 기업 정보, 시작 날짜의 주가, 마지막 날짜의 주가, 증감액, 증가율을 보여준다.  

 

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

DROP TABLE  #temp

DROP TABLE  #temp2

DROP TABLE  #temp3

DROP TABLE  #temp4