저번 글에서는 메모리 월별 수출 금액을 간단하게 차트로 그려봤습니다.

  - https://sweetquant.tistory.com/313

 

파이썬과 SQL로 메모리 수출입 차트 만들기

지난 글에서는 메모리 품목 수출입 데이터를 다운로드해서 DB화했습니다. - https://sweetquant.tistory.com/312 메모리 품목 수출입 데이터 DB화하기 안녕하세요. 오늘은 분석에 필요한, 또는 SQL 연습에 필

sweetquant.tistory.com

 

이번에는 메모리 수출과 삼성전자, SK 하이닉스의 주가를 같이 살펴보도록 하겠습니다. 이를 통해 수출금액이 주가에 영향을 미칠까를 고민해 볼 수 있기 때문입니다.


우선, 기존에 구축했던 DB_DTECH.HIST_YM 테이블에는 2019년부터 2021년  8월 25일까지의 월별주가 데이터가 입력되어 있습니다.(아래 글에서 구축했습니다.)

  - https://sweetquant.tistory.com/304

 

2021년 전반기 영업이익 Top과 주가 흐름

지난글에서는 영업이익 증가 Top 종목을 다양하게 추출해봤습니다. https://sweetquant.tistory.com/303 2021년 전반기 영업이익 Top - 종목 추출 DART에 2021년 전반기(1월~6월) 손익계산서가 올라왔습니다.

sweetquant.tistory.com

 

여기서는 메모리 수출금액과 주가를 비교하기 위해 SK 하이닉스와 삼성전자에 대해서만 추가로 월별주가(2010년1월부터 2018년12월까지)를 입력해야 합니다. 아래 파일을 다운 받아서 DB_DTECH DB에서 실행하면 됩니다.

20210903_월별주가_삼성이랑SK하이닉스만가져오기.sql
0.03MB




데이터를 업로드 했으면, 아래와 같은 SQL로 삼성전자와 SK하이닉스의 2010년부터의 월별 종가를 구할 수 있습니다.

SELECT  B.YM
        ,MAX(CASE WHEN A.STK_NM = '삼성전자' THEN B.C_PRC END) Samsung
        ,MAX(CASE WHEN A.STK_NM = 'SK하이닉스' THEN B.C_PRC END) Hynix
FROM    DB_DTECH.STOCK_KRX A
        INNER JOIN DB_DTECH.HIST_YM B
          ON (B.STK_CD = A.STK_CD)
WHERE   A.STK_NM IN ('삼성전자','SK하이닉스')
GROUP BY B.YM
ORDER BY B.YM
[결과]
YM       Samsung     Hynix        
======== =========== ============ 
201001   15680.000   22750.000    
201002   14880.000   21000.000    
201003   16360.000   26700.000   
... 생략 ...



지난 글에서는 월별 메모리품목별 수출금액 데이터를 구했습니다. 
아래 그림을 보면, 좌측은 월별  메모리품목별 수출금액을 구하는 SQL과 결과입니다.(지난 글에서 설명한 SQL입니다.) 우측은 월별 삼성전자와 하이닉스의 주가(월말 종가)를 구하는 SQL과 결과입니다.



위 그림에서 좌측과 우측의 결과를 합쳐서 하나로 보여주기 위해서는 조인을 사용해야 합니다. 두 결과 모두 월별 데이터 집계이기 때문에 월(YM) 컬러을 사용해 조인을 처리하면 됩니다. 아래와 같이 SQL을 구현할 수 있습니다.

SELECT  T2.YM
        ,T2.DRAM ,T2.CHIP ,T2.FLASH
        ,T3.Samsung ,T3.Hynix
FROM    (
		SELECT  T1.YM
		        ,MAX(CASE WHEN T1.HS_NM = '디램' THEN T1.OUT_AMT END) DRAM
		        ,MAX(CASE WHEN T1.HS_NM = '복합구조칩 집적회로' THEN T1.OUT_AMT END) CHIP
		        ,MAX(CASE WHEN T1.HS_NM = '플래시 메모리' THEN T1.OUT_AMT END) FLASH
		FROM    DB_DTECH.TRADE_YM T1
		WHERE   T1.HS_NM IN ('디램','복합구조칩 집적회로','플래시 메모리')
		GROUP BY T1.YM
		ORDER BY T1.YM
		) T2 INNER JOIN (
		SELECT  B.YM
		        ,MAX(CASE WHEN A.STK_NM = '삼성전자' THEN B.C_PRC END) Samsung
		        ,MAX(CASE WHEN A.STK_NM = 'SK하이닉스' THEN B.C_PRC END) Hynix
		FROM    DB_DTECH.STOCK_KRX A
		        INNER JOIN DB_DTECH.HIST_YM B
		          ON (B.STK_CD = A.STK_CD)
        WHERE   A.STK_NM IN ('삼성전자','SK하이닉스')
		GROUP BY B.YM
		ORDER BY B.YM
		) T3 ON (T2.YM = T3.YM)
ORDER BY T2.YM
[결과]
YM       DRAM          CHIP          FLASH        Samsung     Hynix        
======== ============= ============= ============ =========== ============ 
201001   807931.000    322032.000    205735.000   15680.000   22750.000    
201002   768520.000    388025.000    206517.000   14880.000   21000.000    
201003   937606.000    487808.000    242982.000   16360.000   26700.000    
201004   976082.000    543395.000    253916.000   16980.000   28400.000    
... 생략 ...


위에서 HIST_YM, STOCK_KRX, TRADE_YM 은 모두 테이블입니다. 하지만, TRADE_YM을 GROUP BY 처리한 FROM절의 T2는 테이블이라기 보다는 데이터 결과 집합입니다. 마찬가지로 HIST_YM을 GROUP BY 처리한 T3 역시 데이터 결과 집합니다. 이처럼 조인은 테이블과 테이블이 아닌 데이터 결과 집합과 데이터 결과 집합 사이에 이루어질 수 있습니다. 더 나아가서 테이블 역시 데이터 결과 집합이라고 인식하셔도 됩니다.

항상 조인을 할 때는 두 데이터 집합 간의 연결 고리를 잘 찾아야 합니다. 두 데이터 집합 모두 월별로 집계되었기 때문에 월을 이용해 두 데이터 결과 집합을 연결하면 됩니다.

이번에는 위 SQL을 그대로 파이썬에 붙여서 차트를 그려보겠습니다. 삼성전자와 하이닉스 주가는 subplot으로 별도로 그려지도록 처리합니다.

import pymysql
import pandas as pd
import matplotlib.pyplot as plt

# MySQL 연결 처리
myMyConn = pymysql.connect(user='root', password='1qaz2wsx', host='localhost', port=3306, charset='utf8',
                           database='DB_SQLSTK')
myMyCursor = myMyConn.cursor()


sql = """
SELECT  T2.YM
        ,T2.DRAM ,T2.CHIP ,T2.FLASH
        ,T3.Samsung ,T3.Hynix
FROM    (
		SELECT  T1.YM
		        ,MAX(CASE WHEN T1.HS_NM = '디램' THEN T1.OUT_AMT END) DRAM
		        ,MAX(CASE WHEN T1.HS_NM = '복합구조칩 집적회로' THEN T1.OUT_AMT END) CHIP
		        ,MAX(CASE WHEN T1.HS_NM = '플래시 메모리' THEN T1.OUT_AMT END) FLASH
		FROM    DB_DTECH.TRADE_YM T1
		WHERE   T1.HS_NM IN ('디램','복합구조칩 집적회로','플래시 메모리')
		GROUP BY T1.YM
		ORDER BY T1.YM
		) T2 INNER JOIN (
		SELECT  B.YM
		        ,MAX(CASE WHEN A.STK_NM = '삼성전자' THEN B.C_PRC END) Samsung
		        ,MAX(CASE WHEN A.STK_NM = 'SK하이닉스' THEN B.C_PRC END) Hynix
		FROM    DB_DTECH.STOCK_KRX A
		        INNER JOIN DB_DTECH.HIST_YM B
		          ON (B.STK_CD = A.STK_CD)
        WHERE   A.STK_NM IN ('삼성전자','SK하이닉스')
        GROUP BY B.YM
		ORDER BY B.YM
		) T3 ON (T2.YM = T3.YM)
ORDER BY T2.YM
"""


# DataFrame에 SQL 결과 저장
df = pd.read_sql(sql, myMyConn)

# 결과 출력
print(df)

# 차트로 처리할 항목을 Series에 별도로 담는다.
dram = df['DRAM']
chip = df['CHIP']
flash = df['FLASH']
samsung = df['Samsung']
hynix = df['Hynix']
dram.index = df['YM']
samsung.index = df['YM']
hynix.index = df['YM']

plt.figure(figsize=(11, 9))

plt.subplot(311)
dram.plot(label='DRAM', title="Memory Out & Samsung & SK Hynix")
chip.plot(label='Chip')
flash.plot(label='Flash memory')
plt.legend(loc='lower left')

plt.subplot(312)
samsung.plot(label='Samsung')
plt.legend(loc='lower left')

plt.subplot(313)
hynix.plot(label='Hynix')
plt.legend(loc='lower left')

plt.show()
print(df.corr())


위의 파이썬 코드를 실행하면 아래와 같은 차트가 만들어집니다.



차트만 보고서는 수출금액이 삼성전자나 SK하이닉스의 주가에 영향을 주는지 정확히 알아 볼 수가 없습니다. 대충 보기에는 메모리 품목 중에 Chip 부분의 수출금액과 삼성전자와 SK하이닉스의 주가 움직임이 유사한 느낌은 듭니다.

차트가 유사하다는 것은 위 파이썬 코드 중에, 마지막 줄의 df.corr을 통해 확인할 수 있습니다.

df는 파이썬 모듈중에 pandas.dataframe입니다. dataframe의 corr을 수행하면, dataframe에 입력된 데이터들의 상관계수를 구할 수있습니다.
저도 수학적으로는 잘 모르지만, 상관계수가 1에 가까우면 두 계열의 수치 간에 정비례한 상관 관계가 있다고 합니다.

df.corr()의 결과를 보면 아래와 같습니다.

             DRAM      CHIP     FLASH   Samsung     Hynix
DRAM     1.000000  0.763169  0.843413  0.618390  0.698179
CHIP     0.763169  1.000000  0.769157  0.866243  0.858389
FLASH    0.843413  0.769157  1.000000  0.742537  0.810480
Samsung  0.618390  0.866243  0.742537  1.000000  0.959931
Hynix    0.698179  0.858389  0.810480  0.959931  1.000000


결과를 보면 ,Chip과 삼성의 상관계수가 0.866이고 Chip과 하이닉스의 상관계수가 0.85로 높은것을 알 수 있습니다. 그리고 삼성과 하이닉스의 상관관계는 무려 0.95나 됩니다.

이처럼 높은 상관계수를 사용하면 수익을 얻을 수 있는 투자 전략을 만들 수 있지 않을까 생각이 듭니다. 하지만 그렇게 쉽지가 않답니다. 수출 데이터는 매월 15일에 지난달 데이터가 집계가 됩니다. 그러므로 우리가 수출 데이터를 접하기 전에 주가는 올라 버렸을 가능성이 있습니다. 더욱이, 제품의 수출 전에는 '계약'이라는 단계가 필요합니다. '만약에 거대 '계약'이 있다면, 수출까지 발생하기 전에 주가는 이미 다 오르지 않을까 싶습니다. 또한 주가라는 것은 어느 한 요소만으로 결정되지는 않습니다.
그럼에도 불구하고, 조금 더 고민해볼 필요는 있을거 같습니다. 투자 전략을 못 얻더라도 SQL 실력과 데이터를 바라보는 눈을 얻을 수 있으니까요.

오늘은 여기까지입니다. 감사합니다.

 

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 SQL을 공부하고 싶다면 아래 책을 참고해주세요~!

 

※ 책 소개: https://sweetquant.tistory.com/243

※ 책 미리보기: https://sweetquant.tistory.com/257

※ 완전판 E-Book

  ▶ 유페이퍼: https://www.upaper.net/ryu1hwan/1142997

  ▶ 알라딘: https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=273701425

  ▶ Yes24: http://www.yes24.com/Product/Goods/102264444?OzSrank=1

  ▶ 교보문고: https://digital.kyobobook.co.kr/digital/ebook/ebookDetail.ink?selectedLargeCategory=001&barcode=4801167630019&orderClick=LAG&Kc=

 

+ Recent posts