지난 글에서는 메모리 품목 수출입 데이터를 다운로드해서 DB화했습니다.

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

 

메모리 품목 수출입 데이터 DB화하기

안녕하세요. 오늘은 분석에 필요한, 또는 SQL 연습에 필요한 새로운 데이터를 추가해보겠습니다. 바로, 수출입 통계 데이터입니다. ​ 수출 데이터를 분석하면, 수출이 증가한 업종에 대해 투자

sweetquant.tistory.com

 

메모리 품목 관련해서 다양한 품목이 있는데, 그 중에 수출금액이 가장큰 품목 세 개만 조회해보겠습니다. 아래와 같이 SQL을 실행합니다.

MySQL에서 Top-N을 추출하기 위해 가장 쉽게 사용할 수 있는 것이 바로 LIMIT입니다. 아래와 같습니다.

SELECT  HS_NM
        ,ROUND(SUM(OUT_AMT)) SUM_OUT_AMT
        ,MIN(YM) MIN_YM
        ,MAX(YM) MAX_YM
        ,ROUND(AVG(OUT_AMT)) AVG_OUT_AMT
FROM    DB_DTECH.TRADE_YM
GROUP BY HS_NM
ORDER BY 2 DESC
LIMIT 3;
[결과]
HS_NM                          SUM_OUT_AMT   MIN_YM   MAX_YM   AVG_OUT_AMT   
============================== ============= ======== ======== ============= 
디램                           189563001     201001   202107   1363763       
복합구조칩 집적회로              170826060     201001   202107   1228964       
플래시 메모리                   49402623      201001   202107   355415

위 SQL을 통해 메모리 관련 세부 품목 중에, 디램, 복합구조칩 집적회로, 플래시 메모리가 가장 수출이 많은것을 알 수 있습니다. 디램의 경우, 2010년 1월부터 2021년 7월까지 총 189,563,001 천USD 수출을 했고, 월평균 1,363,763 천USD 만큼 수출했습니다. 현재 환율로 계산하면 월평균 1.5조원 정도 되는거 같습니다. 어마어마한 금액이네요.

이번에는 위에서 찾은 세 개 품목에 대해 월별 수출금액을 구해봅니다. 품목명을 컬럼으로 처리하기 위해 아래와 같이 GROUP BY와 CASE를 사용합니다. 분석 SQL에서 PIVOT을 구혆려면 GROUP BY 와 MAX 또는 SUM이 필수죠.

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
[결과]
YM       DRAM          CHIP          FLASH        
======== ============= ============= ============ 
201001   807931.000    322032.000    205735.000   
201002   768520.000    388025.000    206517.000   
201003   937606.000    487808.000    242982.000   
... 생략 ...

끝으로, 위의 SQL을 파이썬에서 실행해 결과를 차트로 그려보는겁니다. 간단합니다.

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 생성
sql = """
        SELECT  T1.YM
                ,SUM(CASE WHEN T1.HS_NM = '디램' THEN T1.OUT_AMT END) DRAM
                ,SUM(CASE WHEN T1.HS_NM = '복합구조칩 집적회로' THEN T1.OUT_AMT END) CHIP
                ,SUM(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
        """

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

# 결과 출력
print(df)

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

plt.figure(figsize=(11,9))
dram.plot(label='DRAM', title= "Memory Out Amt, Unit=1,000USD")
chip.plot(label='Chip')
flash.plot(label='Flash memory')
plt.legend(loc='lower left')
plt.grid(True)
plt.show()

아래와 같이 세부 품목별 수출금액을 차트로 볼 수 있습니다.

오늘은 여기까지입니다.~!

감사합니다.

 

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 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=

안녕하세요.

오늘은 분석에 필요한, 또는 SQL 연습에 필요한 새로운 데이터를 추가해보겠습니다.

바로, 수출입 통계 데이터입니다.

수출 데이터를 분석하면, 수출이 증가한 업종에 대해 투자 전략을 세워볼 수 있겠죠.

수출입 무역 통계는 아래 사이트에서 다운로드 할 수 있습니다. 아래 사이트 외에도 KITA.NET에서도 비슷한 정보를 얻을 수 있습니다. (저희 주변에는 생각보다 무료로 얻을 수 있는 데이터가 많습니다.)

 

  - https://unipass.customs.go.kr/ets/

 

수출입 무역통계

구분 전월(누계) 당월 (8.1~8.31) 년간 누계 금액 증감율 금액 증감율 금액 증감율 수출 358,652 26.6 53,229 34.9 411,880 27.6 수입 338,903 26.1 51,561 44.0 390,464 28.2 증감율 : 전년동기대비증감율 조업일수[(’20)

unipass.customs.go.kr

 

해당 사이트의 상단 메뉴에서 아래 메뉴를 찾아 들어갑니다.

- 무역통계조회 > 수출입통계 > 품목별 수출입실적

여기서는 메모리 품목 관련 수출입 데이터만 다운로드해서 DB화할 예정입니다. 아래와 같이 조건을 설정해 조회를 합니다.

- 조회기간 : 2018.01~2021.07

- 품목코드: 85, 42, 32 까지 입력

- 조회 버튼으로 조회한 후에 다운로드 버튼 클릭

위와 같은 과정을 반복해 2010년부터 현재 2021년 7월까지의 데이터를 엑셀로 다운로드합니다.

다운로드한 세 개의 파일을 DB로 한 번에 업로드 처리하기 위해 다운로드한 엑셀 파일 세 개를 하나로 합칩니다.아래와 같이 불필요한 내용은 정리하고 세 개 엑셀을 하나의 엑셀 파일로 만들어야 합니다.

다운로드한 파일의 '기간'의 값은 원래 '2010.01'과 같이 년과 월 사이에 '.'이 붙어 있습니다. 엑셀의 SUBSTITUTE 함수를 사용해 '.'을 제거해서 '201001'과 같이 만들어 놓아주세요.

마지막으로 합쳐진 하나의 엑셀 파일을 CSV 형태 파일로 저장합니다. DBeaver에서는 CSV파일을 올릴 수 있기 때문입니다.

위 데이터를 업로드할 테이블을 만듭니다. 원래는 업로드용 임시 테이블에 올린 후에 실제 사용할 테이블에 적용하는게 일반적이지만 여기서는 바로 실제 사용할 테이블을 만드록 업로드하도록 하겠습니다.

아래와 같이 설계를 먼저 진행합니다.

위 내용은 아래의 ERD CLOUD에 접속하면 볼 수 있습니다.

  - https://www.erdcloud.com/d/uLkbGXNcGu7HkvJXa

 

DB_DTECH

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

이제 설계된대로 테이블을 생성합니다. 아래 스크립트를 사용합니다.

CREATE TABLE DB_DTECH.TRADE_YM
(
	YM              VARCHAR(6) NOT NULL COMMENT '연월'
	,HS_CD          VARCHAR(40) NOT NULL COMMENT '품목코드'
	,HS_NM          VARCHAR(200) NOT NULL COMMENT '품목명'
	,OUT_WT         DECIMAL(18,3) NULL COMMENT '수출중량(톤)'
	,IN_WT          DECIMAL(18,3) NULL COMMENT '수입중량(톤)'
	,OUT_AMT        DECIMAL(18,3) NULL COMMENT '수출금액(천USD)'
	,IN_AMT         DECIMAL(18,3) NULL COMMENT '수입금액(천USD)'
	,DIF_IN_OUT     DECIMAL(18,3) NULL COMMENT '무역수지(천USD)'
	,PRIMARY KEY(YM ,HS_CD)
) COMMENT '수출입정보';

주의할 점은 엑셀 파일은 기간, 품목명, 품목코드 순서이지만 생성한 테이블은 기간, 품목코드, 품목명 순서입니다.

이제, DBeaver의 데이터 가져오기 기능을 사용해 위에서 저장한 CSV 파일을 TRADE_YM으로 업로드합니다.

DBeaver의 데이터 가져오기 기능은 이전 글을 참고해주세요.

  - https://sweetquant.tistory.com/263?category=1163308 

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다. 이후에는 데

sweetquant.tistory.com

 

메모리 수출 정보를 업로드할때는 아래와 같이 컬럼을 매핑하면 됩니다.

업로드가 완료되면 아래와 같이 간단히 조회를 해봅니다. 메모리 세부 품목별로 수출금액을 조회합니다.

SELECT  HS_NM, SUM(OUT_AMT) OUT_AMT
FROM    DB_DTECH.TRADE_YM
GROUP BY HS_NM
ORDER BY 2 DESC;
[결과]
HS_NM                                                                       OUT_AMT         
=========================================================================== =============== 
디램                                                                        189563001.000   
복합구조칩 집적회로                                                         170826060.000   
플래시 메모리                                                               49402623.000    
제8517호의 기기에 전용되거나 주로 사용되는 것                               42578781.000    
기타                                                                        2167554.000     
에스램                                                                      313599.000      
제8425호ㆍ제8426호ㆍ제8428호ㆍ제8429호ㆍ제8430호ㆍ제8443.99호ㆍ8470호ㆍ제   30226.000       
제9031호의 기기에 전용되거나 주로 사용되는 것(반도체 제조용으로 한정한다)   133.000         
제9032호의 기기에 전용되거나 주로 사용되는 것(항공기용으로 한정한다)        36.000          
제9301호ㆍ제9306호의 물품에 전용되거나 주로 사용되는 것                     10.000          
제8528.42호ㆍ제8528.52호ㆍ제8528.62호ㆍ제8531.20호의 기기에 전용되거나 주   2.000

오늘은 여기까지입니다.~! 이어서는 수출 정보를 사용해 간다난 차트도 그려보고 주가 정보와 연계해서 분석하는 과정도 설명할 예정입니다.

감사합니다.

 

위와 같이 데이터를 마음대로 분석해볼 수 있는 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=

 

지난 글에서는 무역 통계 사이트를 통해 수출이 증가한 품목을 찾는 과정을 살펴봤습니다.

https://sweetquant.tistory.com/310

 

수출 통계로 투자 업종 찾기

오늘은 무역 통계 사이트(KITA.NET)를 이용해 투자할 업종을 찾는 과정을 설명하겠습니다. ​ 개인적으로 누군가의 도움을 받지 않고 종목을 선정하는데 아주 유용한 정보가 아닐까 생각합니다.

sweetquant.tistory.com

이 과정에서, 아래와 같이 300215 품목의 수출이 증가한 것을 발견했습니다.

해당 품목의 작년 1년 동안 수출 금액이 2,360,871천불이었는데, 올해는 7개월 만에 해당 금액을 돌파한 것을 알 수 있습니다. 이 추세를 이어간다면 올 연말에는 더 많은 수출이 있지 않을까 생각이 듭니다.

그래서, 300215와 직접적으로 관련된 회사는 어디일까? 라는 궁금증이 떠나질 않더군요.

그래서 열심히 검색을 해봤습니다. 먼저 아래와 같은 기사를 찾아냈습니다.

기사를 보면, 300215 품목은 완제의약품이라고 나옵니다. KITA에서는 '일정한 투여량으로 한 것, 소매용 모양이나 포장'이라고 되어 있습니다. 이를 통해 마스크나 진단키트는 아닌거 같다는 생각이 듭니다.

https://www.monews.co.kr/news/articleView.html?idxno=302021 

 

K-바이오의약품 독일 내 수요 급증 이유는? - 메디칼업저버

[메디칼업저버 정윤식 기자] 독일이 한국산 바이오의약품의 매력에 푹 빠졌다. 2020년 바이오 면역 물품과 관련해 미국, 일본, 터키를 제치고 한국산 제품을 가장 많이 구매한 국가가 된 것.한국

www.monews.co.kr

 

 

 

구글을 열심히 더 뒤져봤습니다. 아래와 같은 옛날 글을 찾을 수 있었습니다.

아래 글에 따르면, '셀트리온'의 수출 품목은 대부분 300214나 300215로 잡힌다고 되어 있습니다. 물론 오래된 글이고 토론장에 올라온 글이므로 사실인지는 알 수 없습니다.

https://m.thinkpool.com/bbs/itemanalBest/read/stock_bbs.do?code=068270&sn=10676631 

 

빅데이터와 AI 기반의 금융투자 플랫폼 :: 씽크풀

관세청의 무역통계를 기반으로 인천 연수구에 잡히는 셀트리온의 수출물량을 알아보았습니다. 셀트리온은 종전부터 수출물량이 인천 연수구에서 잡히고 있습니다. 다들 아시겠지만, 2017년 무

m.thinkpool.com

마지막으로 지난글에서 300215 품목의 수출 대부분이 '청주'에서 발생된것도 살펴봤습니다.

그래서, 청주에 셀트리온이 있나도 찾아봤습니다. 열심히 찾아보니 '셀트리온 제약' 본사가 청주에 있네요.

추리한 내용은 여기까지입니다. '300215' 품목이 어느 회사에서 수출한건지는 직접적으로 알 수 없지만, 의심은 되네요.

어쨌든, 어디까지나 '추리'입니다. 읽어주셔서 감사합니다.~!

절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

오늘은 무역 통계 사이트(KITA.NET)를 이용해 투자할 업종을 찾는 과정을 설명하겠습니다.

개인적으로 누군가의 도움을 받지 않고 종목을 선정하는데 아주 유용한 정보가 아닐까 생각합니다.

그리고, 더불어 개인적으로 궁금한 내용도 올립니다. 혹시라도 아시는 분은 댓글 부탁드립니다. 먼저 감사드립니다.~!

글의 전체 내용을 먼저 정리해보면 아래와 같습니다.

- 설명할 내용: Kita.net을 통해 특정 품목(HS코드:300215)의 수출이 증가한 것을 찾아냅니다.

- 개인적인 궁금증: 300215는 실제로는 어떤 품목이 대표적일까요? 또는 어느 회사가 관련이 깊을까요?

(HS코드:300215: 면역물품, 일정한 투여량으로 한 것, 소매용 모양이나 포장을 한 것에 한정한다.)

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

Kita.net을 통해 품목별로 수출입 통계를 손쉽게 얻을 수 있습니다.

먼어 아래 사이트에 접속합니다.

https://www.kita.net/ 

 

한국무역협회-KITA.NET

한국무역협회 무역 통상정보, 회원/업무지원, 무역통계, 협회안내 등 서비스 안내.

www.kita.net

 

1. 상단의 무역통계 메뉴를 선택합니다.

2. 국내통계 중에 품목 수출입을 선택합니다.

3. 아래와 같이 조회 조건을 선택한 후 조회합니다.

- 당월/누계: 당월을 선택합니다.

- 100개씩 보기를 선택합니다.

- 조회버튼을 누릅니다.

4. 결과를 확인합니다.

- 어떤 품목의 수출이 많이 증가했는지 확인합니다.

- '수출증감률'을 보면 됩니다. 전년 동월대비 현재 얼마나 증가했는지를 알 수 있습니다.

- 많은 품목들이 있지만, 개인적으로 증감율이 136%인 '300215'코드가 눈에 뜁니다.

(각자 원하는 품목을 보시면 되겠죠.)

- 해당 품목 코드를 클릭합니다.

5. 위에서 품목코드를 클릭하면, 아래와 같이 품목별 기간별 상세한 수출내역이 나옵니다.

- 300215 품목의 경우, 2021년이 7개월밖에 안지났는데 벌써 작년만큼 수출을 한 것을 알 수 있습니다.

- 올해말까지라면 작년보다 더 많이 수출하겠죠.

6. 300215는 대체 무엇일까요? (개인적인 궁금증입니다.)

설명에는 "면역물품, 일정한 투여량으로 한 것, 소매용 모양이나 포장을 한 것에 한정한다."라고 되어 있습니다. 이 설명만 봐서는 알 수 없습니다.

300215를 좀 더 알아보기 위해, 지자체 수출입 메뉴로 들어갑니다.

7. 지자체 수출입 확인

- 아래와 같이, 지역구분은 '기초자치별'로, HSK에 300215를 넣고 조회를 합니다.

- 결과를 보면 충북 청주시가 압도적으로 수출한 것을 알 수 있습니다.

- 충북 청주시에 있는 면역물품 수출 업체는 과연 어디일까요???!!!!!!! 아시는 분은 댓글 부탁드립니다.^^ 미리 감사합니다.

설명은 여기까지입니다. 제 개인적인 질문도 있지만, 이처럼 무역 통계를 활용하시면, 자신이 투자할 종목을 선정하는데 큰 도움이 될거 같습니다.

이처럼, 데이터를 분석하는 과정을 공부해보고 싶으신 분은 아래의 '평생 필요한 데이터 분석'의 교육 과정을 추천합니다. 교육을 통해 SQL을 배운다면, 위 내용을 좀 더 보강할 수도 있고, 자신만의 스타일로 분석을 할 수 있습니다. SQL을 완전히 자신의 것으로 만들 수 있는 교육이니 관심 가져보시기 바랍니다. 감사합니다.~!

https://cafe.naver.com/dbian/5259

 

「평생 필요한 데이터 분석(MySQL 과정)」 수강자 모집

MySQL 사용자를 위한 SQL 교육 과정을 모집합니다. 2021년 4월에 첫 강의를 성공리에 잘 마친 이후, 강사님의 프로젝트 일정이 너무 바쁜 탓에, 그리고 코로나 탓에 ...

cafe.naver.com

 

오늘 기준으로 종목별 최적의 골든크로스 돌파 종목을 찾아봤습니다.

확률에 기초한것이기 때문에, 당연히... 맞을수도 있고, 안 맞을수도 있고 재미로 봐주시기 바랍니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

SQL + 파이썬 조합으로 찾은 결과입니다.

1. 뉴지랩파마

- 43일이 108일이 돌파했을때, 모두 10일후 3% 이상 상승했습니다.

- 오늘도 43일이 108일 돌파했습니다. 과연 이어질까요?

2. 메지온

- 42일이 99일선 돌파했을때, 10번 중에 9번 10일후 3% 이상 상승했습니다.

- 오늘도 42일이 99일선 돌파했습니다. 과연 이어질까요?

3. 포인트엔지니어링

- 4일선이 99일선 돌파했을때, 6번 중에 5번 10일후 3% 이상 상승했습니다.

- 오늘도 돌파했습니다. 과연 이어질까요?

4. 하림지주

- 3일선이 118일선 돌파했을때, 8번 중에 7번 10일후 3% 이상 상승했습니다.

- 오늘도 돌파했습니다.

- 차트는 생략합니다.

확률이 높다고해서 이번에도 확률이 맞을리는 없겠죠. 단지 참고로 보시면 될거 같습니다. 무엇보다도 기업의 본질과 실적, 미래도 보면서 기본적인 분석을 한 후, 이와 같은 매매 시그널을 참고하는게 효과가 높지 않을까 생각합니다.

 

 

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 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=

 

골든크로스는 주식을 시작하면 가장 먼저 접하게 되는 기술적 매매 신호입니다.

아마도 모르는 분들이 거의 없지 않을까 생각합니다. 많은 사람들이 아는만큼, 효과가 있다고 보기는 어려운 매매 신호입니다. 주식을 오래 해보신 분들은 아시겠지만, 골든크로스라는 아주 기초적인 기술만 가지고 매매를 했다가는 거의 실패하고 맙니다.

효과가 없다면서, 여기서 골든크로스를 언급하는 이유는 좀 더 다르게 확률적으로 접근해보기 위해서입니다.

 

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

 

골든크로스는 단기이평선과 중장기이평선을 사용해 단기이평선이 중장기이평선을 아래에서 위로 치고 올라가는 형태를 뜻합니다. 이때 단기이평선과 중장기이평선의 일수는 각자가 선호하는 값을 사용합니다.

여기서는, 데이터 분석을 통해 특정 종목에 대해 가장 좋은 단기이평선과 중장기이평선의 일수를 찾아봤습니다. 오늘은 SK하이닉스에 대해 계산을 해봤습니다.

 

결과를 살펴보면 아래와 같습니다.

 

사진 설명을 입력하세요.

항목별로 설명해보면 아래와 같습니다.

  1. 단기이평선 : 단기이평선 일수

  2. 중장기이평선: 중장기이평선 일수

  3. 골든크로스돌파횟수: 2000년부터 지금(2021.08.26)까지 골든크로스 돌파가 일어난 횟수

     : 1번과 2번의 단기이평선과 중장기이평선을 사용한 골든크로스 돌파 횟수

  4. 승리횟수: 골든크로스 돌파 후, 10일후 3% 이상 상승한 경우 승리로 카운트

  5. 승리확률: 승리횟수 / 골든크로스돌파횟수

  6. 평균등락률: 10일후의 평균 등락률

 

결과를 살펴보면, 10일선과 118일선 간에 골든크로스 돌파가 2000년부터 지금까지 33번 발생했으며 그중에 23번은 10일후에 3% 이상 상승했습니다. 확률로 계산해보면 69.7%가 됩니다.

 

이번에는 SK하이닉스를 대상으로 가장 나쁜 경우를 살펴보겠습니다. 아래와 같습니다.

 

결과를 보면, 26일선과 89일선을 사용해 골든크로스 매매를 하면, 35번 중에 단지 6번만 10일후에 3%이상 상승한 것을 알 수 있습니다.

 

이를 통해서, SK하이닉스 매매는 10일선과 118일선을 사용해서 참고하는 것이 좀더 좋을 수 있겠다라고 생각할 수 있습니다.

그러면, 실제로도 그런지 차트를 훑어볼 필요가 있습니다. 2000년 이후로 지금까지 10일선과 118일선의 골든크로스가 발생한 차트를 다 올려보면 아래와 같습니다. 33개 차트라 좀 많습니다.(글 마지막에 일괄 붙여 드립니다.)

 

여기서 중요한건!!! 골든크로스를 무조건 믿어서는 안된다는 겁니다.

우선 기본적 분석을 통해 종목을 잘 선정하고, 해당 종목의 미래 현황도 충분히 검토한 후에.. 매매 시점에 이러한 부분을 참고한다면 좀 더 도움이 되리라고 생각합니다. 또한, 아래 차트들을 보시면 아시겠지만, 해당 매매신호를 사용해도 크게 손실을 보는 경우가 있습니다.

SK하이닉스는 가장 좋은 승리확률이 69.7%로 그나마 높은 편입니다. 삼성전자의 경우는 56%가 가장 좋은 케이스입니다. 또 한가지, 기준을 어떻게 정하느냐에 따라 결과는 매우 다양해집니다. 예를 들어 승리조건을 10일후가 아니라 3일후, 20일후 이와 같이 변경하면 전혀 다른 결과가 나올 수 있습니다.

주식이 항상 확률대로 움직이지 않는다는걸 너무나 잘 아실겁니다. 좋은 기업을 고른후에 확률을 약간 가미한다면 남보다 조금 좋은 결과가 있지 않을까 개인적으로 생각합니다.

 

끝으로 제가 이 글을 올리는 이유는, 데이터 분석이라는 것이 주식에 한정되는 것이 아니고, 자신의 업무와 자신의 일에 큰 도움을 주므로, 여러분들도 관심을 가지고 공부해보셨으면 하는 마음에서 입니다.

데이터 분석을 위해서는 데이터베이스, SQL과 파이썬을 공부해보시기 바랍니다.

 

SQL 공부는 아래책을 참고해주세요~!

 

https://blog.naver.com/ryu1hwan/222384152094

 

평생 필요한 데이터 분석 - 책 소개

※ 책 미리보기: https://blog.naver.com/ryu1hwan/222399009863 ※ 완전판 E-Book ▶ 유페이퍼: https:/...

blog.naver.com

아래는 차트 그림을 압축한 파일입니다.

20210827_SK하이닉스.zip
7.60MB

 

 

 

지난글에서는 영업이익 증가 Top 종목을 다양하게 추출해봤습니다.

 

https://sweetquant.tistory.com/303

 

2021년 전반기 영업이익 Top - 종목 추출

DART에 2021년 전반기(1월~6월) 손익계산서가 올라왔습니다. 해당 데이터를 이용해 다양한 기준으로 영업이익이 많이 개선된 종목을 찾아보도록 하겠습니다. ​ DART 데이터를 어떻게 받아서 올리는

sweetquant.tistory.com

여기서는 영업이익 증가 Top 종목에 주가 흐름도 추가해 보도록 하겠습니다.

여기서는 주가 흐름을 추가하기 위해서 월별 주가 데이터를 사용합니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

아래 첨부 파일은 2019년부터 2021년 8월까지의 월별 종목별 주가 데이터를 담고 있습니다.

(21년 8월은 21년 8월 25일까지 데이터입니다.)

YM_STK_20210825.zip
1.23MB

 

월별 주가를 DB화 하는 과정은 아래 글을 참고해주세요.

https://sweetquant.tistory.com/276

 

월별 주가 DB화하기(2019~2021.06)

안녕하세요. 오늘은 월별 주가를 DB화해보겠습니다. 앞에서는 DART의 재무 제표 데이터를 올렸는데요, 월별 주가를 올려서 월별 주가도 같이 분석한다면 좀 더 좋은 종목을 찾는데 도움이 되기 때

sweetquant.tistory.com

 

위의 링크된 글을 따라하면 MySQL DB에 HIST_YM 테이블을 생성하고 21년 6월까지의 월별 주가 데이터가 만들어집니다. 우리는 21년 8월까지의 월별주가가 필요하기 때문에 HIST_YM을 TRUNCATE 한 후에, 본 글에 첨부된 데이터로 다시 업로드를 해주세요.



데이터를 올렸다면 분석은 간단합니다. 아래와 같은 SQL을 사용하도록 하겠습니다.



1. 반기별 영업이익 증가 Top과 주가 흐름

SELECT  T1.*
        ,T_2003.C_PRC `종가(20년3월)`
        ,T_2101.C_PRC `종가(21년1월)`
        ,T_2108.C_PRC `종가(21년8월25일)`
        
        ,(SELECT MAX(A.H_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2020%') `고가(20년)`
        ,(SELECT MIN(A.L_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2020%') `저가(20년)`
        ,(SELECT MAX(A.H_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2021%') `고가(21년)`
        ,(SELECT MIN(A.L_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2021%') `저가(21년)`
FROM    (
		SELECT  T1.회사명 
		        ,REPLACE(REPLACE(T1.종목코드,'[',''),']','') STK_CD
		        ,'1-반기별 영업이익증가액 Top' 구분
				,ROUND(T1.당기_반기_누적/1e8,1) 당년반기
		        ,ROUND(T1.전기_반기_누적/1e8,1) 전년반기
		        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) - ROUND(T1.전기_반기_누적/1e8,1),1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(ROUND(T1.당기_반기_누적/1e8,1) - ROUND(T1.전기_반기_누적/1e8,1),1) DESC) 구분별순위
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.당기_반기_누적 > 0
		AND     T1.통화 = 'KRW'
		UNION ALL
		SELECT  T1.회사명 
		        ,REPLACE(REPLACE(T1.종목코드,'[',''),']','') STK_CD
		        ,'2-반기별 영업이익증가율 Top' 구분
				,ROUND(T1.당기_반기_누적/1e8,1) 당년반기
		        ,ROUND(T1.전기_반기_누적/1e8,1) 전년반기
		        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) DESC) 구분별순위
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.당기_반기_누적 > 0
		AND     T1.전기_반기_누적 > 0
		AND     T1.통화 = 'KRW'
		UNION ALL
		SELECT  T1.회사명
		        ,REPLACE(REPLACE(T1.종목코드,'[',''),']','') STK_CD
		        ,'3-반기별 영업이익증가율 Top(500억이상만)' 구분
				,ROUND(T1.당기_반기_누적/1e8,1) 당년반기
		        ,ROUND(T1.전기_반기_누적/1e8,1) 전년반기
		        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) DESC) 구분별순위
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.당기_반기_누적/1e8 > 500
		AND     T1.전기_반기_누적 > 0
		AND     T1.통화 = 'KRW'
		) T1
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2003 ON (T_2003.STK_CD = T1.STK_CD AND T_2003.YM = '202003')
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2101 ON (T_2101.STK_CD = T1.STK_CD AND T_2101.YM = '202101')
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2108 ON (T_2108.STK_CD = T1.STK_CD AND T_2108.YM = '202108')
WHERE   T1.구분별순위 <= 10
ORDER BY T1.구분, T1.구분별순위;


결과는 아래와 같습니다.






2. 분기별 영업이익 증가 Top과 주가 흐름

WITH RES01 AS(
		SELECT  T1.회사명 
		        ,REPLACE(REPLACE(T1.종목코드,'[',''),']','') STK_CD
		        ,ROUND(T1.당기_반기_3개월/1e8,1) `2분기`
		        ,ROUND((T1.당기_반기_누적 - T1.당기_반기_3개월)/1e8,1) `1분기`
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.통화 = 'KRW'
        )
SELECT  T1.*
        ,T_2003.C_PRC `종가(20년3월)`
        ,T_2101.C_PRC `종가(21년1월)`
        ,T_2108.C_PRC `종가(21년8월25일)`
        ,(SELECT MAX(A.H_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2020%') `고가(20년)`
        ,(SELECT MIN(A.L_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2020%') `저가(20년)`
        ,(SELECT MAX(A.H_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2021%') `고가(21년)`
        ,(SELECT MIN(A.L_PRC) FROM DB_DTECH.HIST_YM A WHERE A.STK_CD = T1.STK_CD AND A.YM LIKE '2021%') `저가(21년)`
FROM    (
		SELECT  T1.회사명 
		        ,T1.STK_CD
		        ,'4-분기별 영업이익증가액 Top' 구분
				,T1.`2분기`
		        ,T1.`1분기`
		        ,ROUND(T1.`2분기` - T1.`1분기`,1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(T1.`2분기` - T1.`1분기`,1) DESC) 구분별순위
		FROM    RES01 T1
		WHERE   T1.`2분기` > 0
		UNION ALL
		SELECT  T1.회사명 
		        ,T1.STK_CD
		        ,'5-분기별 영업이익증가율 Top' 구분
				,T1.`2분기`
		        ,T1.`1분기`
		        ,ROUND(T1.`2분기`/T1.`1분기`,1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(T1.`2분기`/T1.`1분기`,1) DESC) 구분별순위
		FROM    RES01 T1
		WHERE   T1.`2분기` > 0
		AND     T1.`1분기` > 0
		UNION ALL
		SELECT  T1.회사명 
		        ,T1.STK_CD
		        ,'6-분기별 영업이익증가율 Top(500억이상만)' 구분
				,T1.`2분기`
		        ,T1.`1분기`
		        ,ROUND(T1.`2분기`/T1.`1분기`,1) 구분값
				,ROW_NUMBER() OVER(ORDER BY ROUND(T1.`2분기`/T1.`1분기`,1) DESC) 구분별순위
		FROM    RES01 T1
		WHERE   T1.`2분기` > 500
		AND     T1.`1분기` > 0
		) T1
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2003 ON (T_2003.STK_CD = T1.STK_CD AND T_2003.YM = '202003')
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2101 ON (T_2101.STK_CD = T1.STK_CD AND T_2101.YM = '202101')
		LEFT OUTER JOIN DB_DTECH.HIST_YM T_2108 ON (T_2108.STK_CD = T1.STK_CD AND T_2108.YM = '202108')
WHERE   T1.구분별순위 <= 10
ORDER BY T1.구분, T1.구분별순위
;



결과가 잘 안 보일 수 있으니 엑셀로 결과 첨부해드립니다.

2021년전반기_영업이익증가와주가흐름.xlsx
0.02MB



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

DART에 2021년 전반기(1월~6월) 손익계산서가 올라왔습니다.

해당 데이터를 이용해 다양한 기준으로 영업이익이 많이 개선된 종목을 찾아보도록 하겠습니다.

DART 데이터를 어떻게 받아서 올리는지는 이전 글들을 참고해주세요.

1. 2021년 1분기 DART 재무제표 데이터베이스화하기

  - https://blog.naver.com/ryu1hwan/222407085233

2. 2021년 1분기 영업이익 증가 종목 찾기

  - https://blog.naver.com/ryu1hwan/222409475680

오늘 사용하는 데이터는 DART의 반기보고서입니다. 아래 경로에서 다운로드 할 수 있습니다.

  - https://opendart.fss.or.kr/disclosureinfo/fnltt/dwld/main.do

아래와 같이 반기 보고서의 손익계산서를 다운로드해주세요.

다운로드한 파일 압축을 풀어보면 네 개의 파일이 있습니다. 여기서는 아래 파일만 DB화 해서 분석합니다.

- 2021_반기보고서_03_포괄손익계산서_연결_20210821

우리나라 기업의 경우 어떤 기업은 포괄손익계산서를, 어떤기업은 그냥 손익계산서로 사업보고를 합니다. 그러므로 여기서는 포괄손익계산서 연결로 보고한 기업들만 분석 대상이 됩니다.

위 파일을 DB에 밀어넣기 위해 테이블 먼저 생성합니다. 아래 SQL로 테이블을 생성합니다.

CREATE TABLE DB_DTECH.UP_손익계산서_20211H
(
	재무제표종류		VARCHAR(100) NOT NULL
	,종목코드			VARCHAR(40) NOT NULL
	,회사명				VARCHAR(100)
	,시장구분			VARCHAR(40)
	,업종				VARCHAR(100)
	,업종명				VARCHAR(100)
	,결산월				VARCHAR(40)
	,결산기준일			VARCHAR(40) NOT NULL
	,보고서종류			VARCHAR(100)
	,통화				VARCHAR(40)
	,항목코드			VARCHAR(1000) NOT NULL
	,항목명				VARCHAR(1000)
	,당기_반기_3개월	    NUMERIC(28,6)
	,당기_반기_누적		NUMERIC(28,6)
	,전기_반기_3개월	    NUMERIC(28,6)
	,전기_반기_누적		NUMERIC(28,6)
	,전기				NUMERIC(28,6)
	,전전기				NUMERIC(28,6)
);

 

업로드용 임시 테이블이므로 PK를 설정하지 않았습니다. (실제 분석을 위해서는 위의 데이터를 정규화된 테이블로 구조화해야 합니다. 이는 좀 더 많은 공수가 추가되므로 오늘은 다루지 않습니다. 언제가 다룰 예정입니다.)

위 테이블에 데이터를 올리는 과정은 위에 링크 드린 이전 글들을 참고해주세요. 저 같은 경우 DBeaver를 사용했습니다. 아래와 같이 Mapping을 잘 해야 에러 없이 데이터를 올릴 수 있습니다. 데이터 Import 과정에서 컬럼의 Mapping 값이 Existing 이 되도록 해야 합니다. 새로 컬럼을 추가할 경우 길이 문제로 업로드가 잘 안될 수도 있습니다. (만약에 업로드 실패 후 다시 올려야 한다면, 위에서 만들었던 테이브를 DROP후 다시 만들고 시도해주세요.)

데이터를 모두 업로드했다면, 이젠 손쉽게 데이터를 분석할 수 있습니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

1. 전년 반기 대비 올해 반기, 영업이익 증가액 Top-10 종목

SELECT  T1.회사명 
        ,ROUND(T1.당기_반기_누적/1e8,1) 당기_반기
        ,ROUND(T1.전기_반기_누적/1e8,1) 전기_반기
        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) - ROUND(T1.전기_반기_누적/1e8,1),1) 영업이익증가액
FROM    DB_DTECH.UP_손익계산서_20211H T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     T1.당기_반기_누적 > 0
AND     T1.통화 = 'KRW'
ORDER BY 영업이익증가액 DESC
LIMIT 10;
[결과]
회사명           당기_반기       전기_반기       영업이익증가액 
================ =============== =============== ===============
SK               27622.3         -7909.4         35531.7        
SK이노베이션     10090.3         -22717.0        32807.3        
포스코           37530.3         8729.7          28800.6        
S-Oil            12002.4         -11715.7        23718.1        
HMM              24082.3         1367.0          22715.3        
LG디스플레이     12240.9         -8789.4         21030.3        
롯데케미칼       12178.1         -530.7          12708.8        
SK하이닉스       40190.0         27518.2         12671.8        
현대중공업지주   7189.2          -3829.1         11018.3        
에스디바이오센서 9666.7          814.8           8851.9

 

2. 올해 1분기 대비 올해 2분기, 영업이익 증가액 Top-10 종목

   - 2분기의 영업이익은 '당기_반기_3개월'입니다.

   - 1분기의 영업이익은 '당기_반기_누적 - 당기_반기_3개월' 입니다.

SELECT  T2.*
        ,ROUND(T2.`2분기` - T2.`1분기`,1) 영업이익증가액
FROM    (
		SELECT  T1.회사명 
		        ,ROUND(T1.당기_반기_3개월/1e8,1) `2분기`
		        ,ROUND((T1.당기_반기_누적 - T1.당기_반기_3개월)/1e8,1) `1분기`
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.통화 = 'KRW'
		) T2
WHERE   T2.`2분기` > 0
ORDER BY 영업이익증가액 DESC
LIMIT 10;
[결과]
회사명              2분기     1분기     영업이익증가액            
=================== ========= ========= ================== 
SK하이닉스          26945.7   13244.2   13701.5            
포스코              22005.9   15524.4   6481.5             
HMM                 13889.4   10192.9   3696.5             
현대제철            5453.0    3039.0    2414.0             
LG디스플레이        7010.6    5230.3    1780.3             
삼성SDI             2952.0    1331.7    1620.3             
아시아나항공        559.0     -872.6    1431.6             
삼성물산            4251.9    3025.8    1226.1             
삼성바이오로직스    1667.6    743.0     924.6              
대한항공            1935.5    1015.8    919.7

 

 

3. 전년 반기 대비 올해 반기, 영업이익 증가율 기준 Top-10 종목

   - 영업이익 금액이 아니라, 증가율을 사용합니다.

   - 증가율은 '올해 반기 / 전년 반기' 입니다.

SELECT  T1.회사명 
        ,ROUND(T1.당기_반기_누적/1e8,1) 당기_반기
        ,ROUND(T1.전기_반기_누적/1e8,1) 전기_반기
        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) 영업이익증가율
FROM    DB_DTECH.UP_손익계산서_20211H T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     T1.당기_반기_누적 > 0
AND     T1.전기_반기_누적 > 0
AND     T1.통화 = 'KRW'
ORDER BY 영업이익증가율 DESC
LIMIT 10;
[결과]
회사명               당기_반기       전기_반기       영업이익증가율        
==================== =============== =============== =================
엔피디               46.2            0.1             462.0            
솔본                 177.8           2.0             88.9             
이상네트웍스         40.4            0.6             67.3             
SGC이테크건설        323.7           5.9             54.9             
효성중공업           578.3           13.4            43.2             
엠에스오토텍         431.4           12.0            35.9             
CNH                  530.5           15.0            35.4             
미래아이앤지         11.6            0.4             29.0             
아비코전자           22.8            0.8             28.5             
아이즈비전           67.1            2.6             25.8

 

 

4. 전년 반기 대비 올해 반기, 영업이익 증가율 기준 Top-10 종목 (500억 이상만)

   - 증가율을 사용할 경우, 영업이익이 매우 작은 기업도 포함됩니다.

   - 여기서는 500억 이상 이익이 난 기업만 대상으로 추출합니다.

SELECT  T1.회사명 
        ,ROUND(T1.당기_반기_누적/1e8,1) 당기_반기
        ,ROUND(T1.전기_반기_누적/1e8,1) 전기_반기
        ,ROUND(ROUND(T1.당기_반기_누적/1e8,1) / ROUND(T1.전기_반기_누적/1e8,1),1) 영업이익증가율
FROM    DB_DTECH.UP_손익계산서_20211H T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     T1.당기_반기_누적/1e8 > 500
AND     T1.전기_반기_누적 > 0
AND     T1.통화 = 'KRW'
ORDER BY 영업이익증가율 DESC
LIMIT 10;
[결과]
회사명              당기_반기       전기_반기       영업이익증가율           
=================== =============== =============== ================= 
효성중공업          578.3           13.4            43.2              
CNH                 530.5           15.0            35.4              
HMM                 24082.3         1367.0          17.6              
KG ETS              1575.5          108.0           14.6              
대한항공            2951.4          233.1           12.7              
에스디바이오센서    9666.7          814.8           11.9              
풍산                1689.2          193.6           8.7               
포스코강판          577.6           67.9            8.5               
SK케미칼            1591.0          256.7           6.2               
대한유화            1622.9          266.4           6.1

 

 

5. 올해 1분기 대비 올해 2분기, 영업이익 증가율 Top-10 종목

   - 1분기와 2분기 영업이익 증가율로 Top-10을 추립니다.

SELECT  T2.*
        ,ROUND(T2.`2분기` / T2.`1분기`,1) 영업이익증가율
FROM    (
		SELECT  T1.회사명 
		        ,ROUND(T1.당기_반기_3개월/1e8,1) `2분기`
		        ,ROUND((T1.당기_반기_누적 - T1.당기_반기_3개월)/1e8,1) `1분기`
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.통화 = 'KRW'
		) T2
WHERE   T2.`2분기` > 0
AND     T2.`1분기` > 0
ORDER BY 영업이익증가율 DESC
LIMIT 10;
[결과]
회사명          2분기     1분기     영업이익증가율         
=============== ========= ========= =============== 
홈센타홀딩스    32.7      0.2       163.5           
케이엔더블유    11.7      0.1       117.0           
세종공업        165.0     1.6       103.1           
대화제약        15.3      0.2       76.5            
KC그린홀딩스    75.5      1.2       62.9            
한컴위드        12.3      0.2       61.5            
RFHIC           28.4      0.7       40.6            
EG              29.7      1.0       29.7            
금호타이어      113.9     4.5       25.3            
휴스틸          138.8     6.3       22.0

 

 

6. 올해 1분기 대비 올해 2분기, 영업이익 증가율 Top-10 종목 (500억 이상만)

   - 1분기와 2분기 영업이익 증가율로 Top-10을 추립니다.

   - 500억 이상 이익 기업만 대상으로 합니다.

SELECT  T2.*
        ,ROUND(T2.`2분기` / T2.`1분기`,1) 영업이익증가율
FROM    (
		SELECT  T1.회사명 
		        ,ROUND(T1.당기_반기_3개월/1e8,1) `2분기`
		        ,ROUND((T1.당기_반기_누적 - T1.당기_반기_3개월)/1e8,1) `1분기`
		FROM    DB_DTECH.UP_손익계산서_20211H T1
		WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
		AND     T1.통화 = 'KRW'
		) T2
WHERE   T2.`2분기` > 500
AND     T2.`1분기` > 0
ORDER BY 영업이익증가율 DESC
LIMIT 10;
[결과]
회사명               2분기     1분기     영업이익증가율                 
==================== ========= ========= =================
한국항공우주         599.9     84.0      7.1                     
KISCO홀딩스          706.8     128.5     5.5                     
대한제강             673.8     132.2     5.1                     
원익IPS              1007.5    242.6     4.2                     
상상인               511.0     167.0     3.1                     
국도화학             780.8     263.4     3.0                     
세아제강지주         1080.1    369.4     2.9                     
BGF리테일            586.5     216.3     2.7                     
세아홀딩스           1216.2    467.7     2.6                     
세아베스틸           938.7     375.2     2.5

 

기준에 따라 다양한 종목이 나왔습니다. 그런데, 이번 분기(또는 반기)에 영업이익이 증가했다고 앞으로 주가도 오를까요? 그건 아무도 알 수 없겠죠. 다양한 관점으로 고민이 필요하다고 생각합니다.

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

 

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 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=

 

이전 글에서는 LEAD 분석함수를 사용해 삼성전자의 등락률을 구했습니다.

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

 

LEAD와 LAG - 삼성전자 등락률 구하기

지난글에서는 삼성전자 주가를 가져와서 DB에 담아봤습니다.(이후에는 다른 종목의 주가 정보도 모두 가져올 계획입니다.) - https://sweetquant.tistory.com/298 파이썬 - 주가 이력 데이터 받아

sweetquant.tistory.com

오늘은 등락률 컬럼을 추가해 미리 계산해 넣으려고 합니다. 이 과정중에서 말씀드리고 싶은 내용은 다음과 같습니다.

  - 미리 계산된 컬럼을 추가할 때 주의할 점

  - 테이블 구조 변경시 항상 ERD를 먼저 변경할 것

​​

등락률은 주가 분석에 빈번하게 사용됩니다. 분석에 자주 사용되는 정보를 분석함수를 사용해서 처리해야 한다면 SQL이 길어지고 복잡해집니다. 그러므로 데이터가 변할 가능성이 지극히 적고, 자주 사용된다면 컬럼을 추가해 미리 값을 계산해서 놓는 것이, SQL 작성에도 유리하며 성능상에서도 큰 이득이 있습니다.

이처럼 컬럼을 추가해 미리 값을 계산해 놓을때는 아래와 같은 사항이 중요합니다.

  1. 데이터가 변할 가능성이 지극히 적어야 한다.

  2. 데이터가 변경되면 미리 계산된 값도 같이 처리해야 한다는 점을 데이터 관리자가 잘 알고 있어야 한다.

무엇보다도 2번의 사항이 중요합니다. 데이터 변경이 발생했는데, 미리 계산된 값을 변경하지 않는다면 이는 데이터 불일치로 인해 사용자로 하여금 시스템의 불신을 만들 수 있게 됩니다. 실제 현장에서도 미리 계산된 값을 컬럼으로 추가해야 한다면 이 부분에 주의를 기울이시기 바랍니다.

등락률 컬럼을 추가하는 일은 어렵지 않습니다. 테이블에 ALTER문만 사용하면 됩니다. 하지만, 여기서 프로세스상 중요한 것은 반드시 ERD를 먼저 수정하는 것입니다. 현장에서 오래 일하다 보면, 다양한 이유로 ERD 변경 없이 테이블을 직접 변경하는 경우가 생깁니다. (귀찮거나, 바쁘거나, 또는... 귀찮거나.. 귀찮아서... 귀찮아서...) 이처럼 작업을 진행하다 보면 ERD와 실제 테이블간에 차이점이 생기기 시작하고 나중에 손대기 복잡해질 수 있습니다.

또한, ERD를 먼저 열어서 변경하다 보면, 혹시나 비슷한 작업을 한 적이 있는지도 알 수 있으며, 변경할 작업이 다른 테이블에 영향을 주는지도 살펴볼 수 있습니다. 반드시 ERD를 먼저 변경하는 습관을 갖고 테이블 작업을 진행하시기 바랍니다.

여기서도 ERD CLOUD에 아래와 같이 등락률 컬럼을 먼저 추가했습니다.

  - DB_DTECH (erdcloud.com)

 

DB_DTECH

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

위의 그림과 같이 등락률을 테이블의 마지막 컬럼에 추가한 후에, 다음과 같이 ALTER문을 이용해 PRICE_DT에 컬럼을 추가합니다.

ALTER TABLE DB_DTECH.PRICE_DT ADD CHG_RT DECIMAL(18,3) NULL COMMENT '등락률';

여기서 한 가지 더, 컬럼을 추가한 후에 컬럼의 순서를 변경하는 경우가 종종 있습니다. 불가능한 것은 아니지만, 데이터가 많아지면 데이터베이스에 큰 무리를 주는 작업입니다. 그러므로 나중에 추가되는 컬럼은 가능하면 순서를 위로 올리지 않고 마지막 컬럼으로 그대로 두는 것이 좋습니다.

마지막으로 추가한 CHG_RT 컬럼에 등락률을 업데이트합니다. 저번글에서 LEAD를 사용해 등락률을 구한 로직을 응용하면 됩니다. 아래와 같습니다.

UPDATE DB_DTECH.PRICE_DT A
       INNER JOIN (
			SELECT  T3.STK_CD
			        ,T3.DT
			        ,ROUND((T3.CLSE_PRC - T3.BFOR_CLSE_PRC) / T3.BFOR_CLSE_PRC * 100,2) CHG_RT # 등락률
			FROM    (
					SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
					        ,LEAD(T2.CLSE_PRC,1) OVER(ORDER BY T2.DT DESC) BFOR_CLSE_PRC
					FROM    DB_DTECH.STOCK_KRX T1
					        INNER JOIN DB_DTECH.PRICE_DT T2
					           ON (T2.STK_CD = T1.STK_CD)
					WHERE   T1.STK_NM = '삼성전자'
					ORDER BY T2.DT ASC
					) T3
			) B
			ON (A.STK_CD = B.STK_CD
			    AND A.DT = B.DT)
SET    A.CHG_RT = B.CHG_RT;

오늘은 여기까지입니다.~!^^

지난글에서는 삼성전자 주가를 가져와서 DB에 담아봤습니다.(이후에는 다른 종목의 주가 정보도 모두 가져올 계획입니다.)

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

 

파이썬 - 주가 이력 데이터 받아오기

저번 글에서는 파이썬을 이용해 KRX에서 주식 마스터 정보를 가져와 데이터를 구성하는 방법을 설명했습니다. - https://sweetquant.tistory.com/295?category=1163308 ​ 오늘은 파이썬을 이용해 주가 이력 데

sweetquant.tistory.com


오늘은 삼성전자 주가를 이용해 분석함수 중에 하나인 LEAD와 LAG를 간단히 살펴보겠습니다. 

'평생 필요한 데이터 분석'에서는 분석함수를 매우 길게 설명하지만 LEAD와 LAG에 대한 설명은 없습니다. 책에서는 RANK와 같은 순위 분석함수를 통해 분석대상에 대해 집중 설명합니다. 분석대상을 잘 이해한다면 다른 분석함수를 응용하는 것은 어렵지 않기 때문입니다.

LEAD와 LAG는 조회 결과 중에 몇 건 이전의 값 또는 몇 건 이후의 값을 가져오는 역할을 합니다. 이전 또는 이후의 값을 가져오므로 이전과 이후를 판단할 수 있는 ORDER BY를 OVER절에 적어주어야 합니다.

그런데.!!! 그런데!!! MySQL의 경우는 OVER절에 ORDER BY를 생략해도 LEAD와 LAG가 정상 동작합니다. 오라클에서는 반드시 OVER절에 ORDER BY를 적어주어야 합니다. 가능하면 OVER절의 ORDER BY를 적어주는 것이 좋습니다. LEAD와 LAG를 통해 가져오는 값을 명확히 알 수 있기 때문입니다.

LEAD와 LAG를 익히기 위해서는 아래 내용을 먼저 외웁니다.
 - LEAD: 다음값
 - LAG: 이전값

다시 한번, LEAD는 다음값, LAG는 이전값입니다. 그런데 다음이나 이전이라는 것은 어떤 기준으로 정렬된 데이터에서만 판단 가능합니다. 정렬된 데이터에서 다음값은 다음(아래)에 출력된 값이고, 이전값은 이전(위쪽)에 출력된 값을 뜻합니다. 저는 보통 'LEAD = 다음값'만 외워서 사용합니다. LEAD와 ORDER BY만 적절히 조합하면 LAG와 같은 결과를 만들수 있기 때문입니다.

먼저, LEAD의 개념을 잡기 위해 아래 SQL을 실행해봅니다.

[SQL-1]
SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
        ,LEAD(T2.DT,1) OVER(ORDER BY T2.DT ASC) NEXT_DT
FROM    DB_DTECH.STOCK_KRX T1
        INNER JOIN DB_DTECH.PRICE_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_NM = '삼성전자'
AND     T2.DT <= STR_TO_DATE('20210813','%Y%m%d')
AND     T2.DT >= STR_TO_DATE('20210807','%Y%m%d')
ORDER BY T2.DT ASC;
[결과]
STK_CD   STK_NM         DT           CLSE_PRC    NEXT_DT      
======== ============== ============ =========== ============ 
005930   삼성전자       2021-08-09   81500.000   2021-08-10   
005930   삼성전자       2021-08-10   80200.000   2021-08-11   
005930   삼성전자       2021-08-11   78500.000   2021-08-12   
005930   삼성전자       2021-08-12   77000.000   2021-08-13   
005930   삼성전자       2021-08-13   74400.000   NULL



위 SQL의 이해를 돕기 위해 결과를 그려보면 아래 [그림-1]과 같습니다. 

[그림-1]


[그림-1]에서 1번 부분에 해당하는 좌측의 결과는 분석함수인 LEAD를 제외한 SQL의 결과입니다. 이처럼 분석함수가 사용될때는, 분석함수를 제회한 결과가 먼저 만들어지고, 이에 대해 분석함수가 처리된다고 이해하는 것이 중요합니다.

2번 부분은 분석함수가 처리된 컬럼입니다. LEAD를 사용했으므로 다음값을 가져옵니다. '다음값'이라는 것은 LEAD의 OVER절 안의 ORDER BY에 따라 결정됩니다. 다시 한번 !! "LEAD의 다음값은 OVER절 안의 ORDER BY에 따라 결정된다." 외워놓으시면 됩니다. LEAD(T2.DT,1)을 사용했으므로 실제 가져와서 보여주는 값는 다음 데이터의 DT값이 됩니다. 그러므로 다음 데이터의 DT 값이 NEXT_DT에 표시가 되는 것입니다.
이때, LEAD(T2.DT,2)를 사용했다면 다음, 다음 값이 출력이 되었을 것입니다. LEAD(T2.DT, 3)이라면 아시겠죠? 세 건 다음 값인, 다음, 다음, 다음 값이 출력이 됩니다.
[그림-1]에서 마지막 로우의 DT는 '2021-08-13'입니다. 조회된 데이터 중에 '2021-08-13'보다 큰 데이터가 없으므로 LEAD의 결과는 NULL이 됩니다.

[SQL-1]에서는 LEAD를 사용해 다음 일자(DT) 값을 가져왔습니다. 이번에는 LEAD를 사용해 이전 일자 값도 가져와 보도록 하겠습니다. 아래 [SQL-2]의 BFOR_DT에 해당하는 부분입니다.

[SQL-2]
SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
        ,LEAD(T2.DT,1) OVER(ORDER BY T2.DT ASC) NEXT_DT
        ,LEAD(T2.DT,1) OVER(ORDER BY T2.DT DESC) BFOR_DT
FROM    DB_DTECH.STOCK_KRX T1
        INNER JOIN DB_DTECH.PRICE_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_NM = '삼성전자'
AND     T2.DT <= STR_TO_DATE('20210813','%Y%m%d')
AND     T2.DT >= STR_TO_DATE('20210807','%Y%m%d')
ORDER BY T2.DT ASC;
[결과]
STK_CD   STK_NM         DT           CLSE_PRC    NEXT_DT      BFOR_DT       
======== ============== ============ =========== ============ ============ 
005930   삼성전자        2021-08-09   81500.000   2021-08-10   NULL         
005930   삼성전자        2021-08-10   80200.000   2021-08-11   2021-08-09   
005930   삼성전자        2021-08-11   78500.000   2021-08-12   2021-08-10   
005930   삼성전자        2021-08-12   77000.000   2021-08-13   2021-08-11   
005930   삼성전자        2021-08-13   74400.000   NULL         2021-08-12


위 SQL에서, NEXT_DT와 BFOR_DT 모두 LEAD를 사용하고 있지만, OVER절의 ORDER BY를 다르게 사용하므로 나오는 결괏값이 다른 것을 알 수 있습니다.
NEXT_DT는 DT를 ASC(오름차순)했으므로 현재 로우보다 DT값이 큰 값이 다음값이 됩니다. 반면에 BFOR_DT는 DT를 DESC(내림차순) 했으므로 현재 로우보다 DT값이 작은 값이 다음값이 됩니다.
이처럼 LEAD는 조회 결과의 정렬 순서에 따라 다음값이 판단되는 것이 아니라, OVER절의 ORDER BY에 따라 판단된다는 점을 잘 기억하시기 바랍니다.

이번에는 LAG를 사용해 [SQL-2]의 LEAD와 완전히 같은 결과를 만들어보겠습니다. 아래 [SQL-3]과 같이 OVER절의 ORDER BY만 역으로 사용하면 됩니다.

[SQL-3]
SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
        ,LEAD(T2.DT,1) OVER(ORDER BY T2.DT ASC) NEXT_DT
        ,LEAD(T2.DT,1) OVER(ORDER BY T2.DT DESC) BFOR_DT
        ,LAG(T2.DT,1) OVER(ORDER BY T2.DT DESC) NEXT_DT_2
        ,LAG(T2.DT,1) OVER(ORDER BY T2.DT ASC) BFOR_DT_2
FROM    DB_DTECH.STOCK_KRX T1
        INNER JOIN DB_DTECH.PRICE_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_NM = '삼성전자'
AND     T2.DT <= STR_TO_DATE('20210813','%Y%m%d')
AND     T2.DT >= STR_TO_DATE('20210807','%Y%m%d')
ORDER BY T2.DT ASC;
[결과]
STK_CD   STK_NM         DT           CLSE_PRC    NEXT_DT      BFOR_DT       NEXT_DT_2    BFOR_DT_2     
======== ============== ============ =========== ============ ============ ============ ============ 
005930   삼성전자        2021-08-09   81500.000   2021-08-10   NULL         2021-08-10   NULL         
005930   삼성전자        2021-08-10   80200.000   2021-08-11   2021-08-09   2021-08-11   2021-08-09   
005930   삼성전자        2021-08-11   78500.000   2021-08-12   2021-08-10   2021-08-12   2021-08-10   
005930   삼성전자        2021-08-12   77000.000   2021-08-13   2021-08-11   2021-08-13   2021-08-11   
005930   삼성전자        2021-08-13   74400.000   NULL         2021-08-12   NULL         2021-08-12


LEAD와 LAG에 대해서는 이해했을 것이라 생각합니다. 이제 LEAD를 이용해 삼성전자의 일별 등락률을 구해보도록 하겠습니다. 일별 등락률의 계산 공식은 아래와 같습니다.
 - 일별 등락률 = (오늘 종가 - 어제 종가) / 어제 종가 * 100

일별 등락률을 구하기 위해서는 조회된 일별 주가에 어제 종가도 같이 추가를 해야 합니다. 아래와 같이 LEAD를 사용하면 간단히 처리할 수 있겠죠.

[SQL-4]
SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
        ,LEAD(T2.CLSE_PRC,1) OVER(ORDER BY T2.DT DESC) BFOR_CLSE_PRC
FROM    DB_DTECH.STOCK_KRX T1
        INNER JOIN DB_DTECH.PRICE_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_NM = '삼성전자'
AND     T2.DT <= STR_TO_DATE('20210813','%Y%m%d')
AND     T2.DT >= STR_TO_DATE('20210807','%Y%m%d')
ORDER BY T2.DT ASC;
[결과]
STK_CD   STK_NM         DT           CLSE_PRC    BFOR_CLSE_PRC   
======== ============== ============ =========== =============== 
005930   삼성전자        2021-08-09   81500.000   NULL            
005930   삼성전자        2021-08-10   80200.000   81500.000       
005930   삼성전자        2021-08-11   78500.000   80200.000       
005930   삼성전자        2021-08-12   77000.000   78500.000       
005930   삼성전자        2021-08-13   74400.000   77000.000

 

 

LEAD를 사용해 조회된 데이터 로우별로 어제 종가(BFOR_CLSE_PRC)를 가져온 것을 알 수 있습니다.
이제 이 값을 사용해 등락률을 계산하면 됩니다. 바로 계산하면 SQL이 좀 지저분해지므로, [SQL-4]의 결과를 인라인 뷰로 처리합니다.

[SQL-5]
SELECT  T3.*
        ,ROUND((T3.CLSE_PRC - T3.BFOR_CLSE_PRC) / T3.BFOR_CLSE_PRC * 100,2) CHG_RT # 등락률
FROM    (
SELECT  T1.STK_CD ,T1.STK_NM ,T2.DT ,T2.CLSE_PRC
        ,LEAD(T2.CLSE_PRC,1) OVER(ORDER BY T2.DT DESC) BFOR_CLSE_PRC
FROM    DB_DTECH.STOCK_KRX T1
        INNER JOIN DB_DTECH.PRICE_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_NM = '삼성전자'
AND     T2.DT <= STR_TO_DATE('20210813','%Y%m%d')
AND     T2.DT >= STR_TO_DATE('20210807','%Y%m%d')
ORDER BY T2.DT ASC
) T3;
[결과]
STK_CD   STK_NM         DT           CLSE_PRC    BFOR_CLSE_PRC   CHG_RT   
======== ============== ============ =========== =============== ======== 
005930   삼성전자        2021-08-09   81500.000   NULL            NULL     
005930   삼성전자        2021-08-10   80200.000   81500.000       -1.60    
005930   삼성전자        2021-08-11   78500.000   80200.000       -2.12    
005930   삼성전자        2021-08-12   77000.000   78500.000       -1.91    
005930   삼성전자        2021-08-13   74400.000   77000.000       -3.38

 

오늘은 여기까지입니다. 생각한 내용은 훨씬 더 있는데... 내용이 너무 길어져서 여기까지 정리하고 다음에 이어서 쓰도록 하겠습니다. 감사합니다.

 

저번 글에서는 파이썬을 이용해 KRX에서 주식 마스터 정보를 가져와 데이터를 구성하는 방법을 설명했습니다.

  - https://sweetquant.tistory.com/295?category=1163308


오늘은 파이썬을 이용해 주가 이력 데이터를 가져와서 쌓는 방법을 살펴보겠습니다.
종목마스터와 주가 이력 데이터만으로 우리는 많은 SQL 연습과 데이터 분석을 해볼 수 있습니다.

여기서는 파이썬과 야후 파이낸스를 이용해 주가 데이터를 가져옵니다. 해당 기능을 사용하기 pip를 사용해 yfinance와 pandas-datareader 모듈이 설치되어 있어야 합니다. 설치 방법은 anaconda prompt나 파이썬 prompt 창에서 pip install을 사용하면 됩니다. (아나콘다를 사용하시는 경우 이무 설치되어 있을수도 있습니다.)

야후 파이낸스에서 삼성전자의 주가를 가져오는 파이썬 코드는 아래와 같이 매우 간단합니다. 실제 야후파이낵스에서 주가를 가져와 데이터를 담는 과정은 pdr.get_data_yahoo 단 하나의 모듈만 호출하면 됩니다.

from pandas_datareader import data as pdr
import yfinance as yf

yf.pdr_override()

stk_hist = pdr.get_data_yahoo('005930.KS',start='2000-01-01')

print(stk_hist)
stk_hist.to_excel('005930.xlsx',sheet_name = '005930')


삼성전자의 종목코드는 005930입니다. 야후에서 삼성전자의 주가를 가져오기 위해서는 위와 같이 005930 뒤에 .KS를 추가해서 넘겨야 합니다. 위 코드의 마지막 줄은 가져온 삼성전자 주가를 엑셀 파일로 저장하는 것입니다. 이처럼 파이썬의 pandas를 사용하면 데이터를 엑셀로 저장하는 것도 단 한줄이면 해결됩니다. 참 쉽죠?


저희는 가져온 데이터를 DB에 담아야 하니까요. 먼저 주가 데이터를 담을 테이블 구조를 설계해봅니다. 아래와 같이 설계를 하도록 하겠습니다. (평생 필요한 데이터 분석에서 동일한 기능을 하는 테이블의 이름은 HISTORY_DT입니다. 혼선이 없도록 여기서는 PRICE_DT라는 테이블 명을 사용했습니다.)




위 ERD는 아래 ERD CLOUD에서 확인할 수 있습니다.

  - https://www.erdcloud.com/d/uLkbGXNcGu7HkvJXa


시가, 고가, 저가, 종가의 의미가 궁금하신분은 아래 글을 참고해주세요.

  - https://blog.naver.com/ryu1hwan/222399839219



별도의 SQL 툴로 MySQL에 접속해 아래 SQL을 이용해 위 테이블을 생성합니다.

CREATE TABLE DB_DTECH.PRICE_DT
(
  STK_CD          VARCHAR(40)   NOT NULL COMMENT '종목코드'
  ,DT             DATE          NOT NULL COMMENT '일자'
  ,OPEN_PRC       DECIMAL(18,3) NULL     COMMENT '시가'
  ,HIGH_PRC       DECIMAL(18,3) NULL     COMMENT '고가'
  ,LOW_PRC        DECIMAL(18,3) NULL     COMMENT '저가'
  ,CLSE_PRC       DECIMAL(18,3) NULL     COMMENT '종가'
  ,ADJ_CLSE_PRC   DECIMAL(18,3) NULL     COMMENT '수정종가'
  ,VOL            DECIMAL(18,3) NULL     COMMENT '거래량'
  ,FRST_INP_DTM   DATETIME      NULL     COMMENT '최초입력일시'
  ,LAST_CHG_DTM   DATETIME      NULL     COMMENT '최종변경일시'
  ,PRIMARY KEY(STK_CD, DT)
) COMMENT = '일별주가';


테이블을 생성했다면, 다시 파이썬으로 돌아와서 아래와 같은 최종 코드를 입력합니다. 아래는 2000년부터 지금까지의 삼성전자 주가를 가져와 PRICE_DT 테이블에 입력하는 코드입니다.

INSERT 처리 부분이 복잡해보이지만, 코딩 량이 약간 길뿐 전혀 복잡하지 않습니다.

# pip install yfinance
# pip install pandas-datareader

from pandas_datareader import data as pdr
import yfinance as yf
import pymysql
# MySQL 연결 처리
myMyConn = pymysql.connect(user='root', password='1qaz2wsx', host='localhost', port=3306,charset='utf8', database='DB_SQLSTK')
myMyCursor = myMyConn.cursor()

def InsertStockPriceHsitory(_df,_stk_cd):
    for row in _df.itertuples():
        print(row)
        STK_CD = _stk_cd
        DT = str(row[0])
        OPEN_PRC = str(row[1])
        HIGH_PRC = str(row[2])
        LOW_PRC = str(row[3])
        CLSE_PRC = str(row[4])
        ADJ_CLSE_PRC = str(row[5])
        VOL = str(row[6])

        sql = "INSERT INTO DB_DTECH.PRICE_DT(STK_CD ,DT ,OPEN_PRC ,HIGH_PRC ,LOW_PRC ,CLSE_PRC ,ADJ_CLSE_PRC ,VOL ,FRST_INP_DTM)" + "\n"
        sql = sql + "VALUES("
        sql = sql + "'" + STK_CD + "'"
        sql = sql + ",'" + DT + "'"
        sql = sql + "," + OPEN_PRC
        sql = sql + "," + HIGH_PRC
        sql = sql + "," + LOW_PRC
        sql = sql + "," + CLSE_PRC
        sql = sql + "," + ADJ_CLSE_PRC
        sql = sql + "," + VOL
        sql = sql + ",NOW())" + "\n"
        sql = sql + "ON DUPLICATE KEY UPDATE" + "\n"
        sql = sql + "DT = '" + DT +  "'\n"
        sql = sql + ",OPEN_PRC = " + OPEN_PRC +  "\n"
        sql = sql + ",HIGH_PRC = " + HIGH_PRC +  "\n"
        sql = sql + ",LOW_PRC = " + LOW_PRC +  "\n"
        sql = sql + ",CLSE_PRC = " + CLSE_PRC +  "\n"
        sql = sql + ",ADJ_CLSE_PRC = " + ADJ_CLSE_PRC +  "\n"
        sql = sql + ",VOL = " + VOL +  "\n"
        sql = sql + ",LAST_CHG_DTM = NOW()"
        print(sql)
        myMyCursor.execute(sql)
        myMyCursor.execute('commit')


yf.pdr_override()

stk_hist = pdr.get_data_yahoo('005930.KS',start='2000-01-01')
print(stk_hist.columns)
InsertStockPriceHsitory(stk_hist,'005930')


위 파이썬 모듈을 실행한 후에, MySQL에 접속해 아래와 같은 SQL을 실행해보면, PRICE_DT 테이블에 삼성전자의 주가가 입력된 것을 확인할 수 있습니다.

SELECT  T1.*
FROM    DB_DTECH.PRICE_DT T1
ORDER BY T1.DT DESC;




오늘은 여기까지입니다.~!

 

오늘은 파이썬을 이용해, KRX에서 주식 종목 마스터를 가져와서 DB화해보도록 해보겠습니다.

먼저, 아래 KRX 사이트를 가보면 주식 종목 마스터 정보를 제공하는 것을 알 수 있습니다.

https://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage

 

대한민국 대표 기업공시채널 KIND

업종 전체 농업, 임업 및 어업 광업 제조업 - 식료품 제조업 - 음료 제조업 - 담배 제조업 - 섬유제품 제조업; 의복제외 - 의복, 의복액세서리 및 모피제품 제조업 - 가죽, 가방 및 신발 제조업 - 목

kind.krx.co.kr

파이썬을 이용해, krx의 상장 종목을 가져오기 위해서는 아래와 같이 파이썬 코드를 작성합니다.

# [PyCode-1]
import pandas as pd

url = 'https://kind.krx.co.kr/corpgeneral/corpList.do' # KRX의 종목리스트 URL
KD = pd.read_html(url+"?method=download&marketType=kosdaqMkt")[0] #코스닥
KP = pd.read_html(url+"?method=download&marketType=stockMkt")[0] #코스피

print(KD) # 코스닥 종목 리스트 출력
print(KP) # 코스피 종목 리스트 출력
print(KD.columns) #종목 리스트를 구성하는 컬럼 확인

종목 리스트를 가져올 때, 코스피와 코스닥을 분리해서 가져오고 있습니다. KD에는 코스닥 종목 리스트가, KP에는 코스피 종목 리스트가 들어가 있습니다. 마지막 줄에 KD.columns를 print해보면, 어떤 항목들이 있는지 확인할 수 있습니다. 아래와 같습니다.

Index(['회사명', '종목코드', '업종', '주요제품', '상장일', '결산월', '대표자명', '홈페이지', '지역'], dtype='object')

이제, 가져온 정보를 데이터베이스에 담기 위해서 테이블(KRX종목마스터)을 만들 차례입니다. 여기서는 MySQL에 구성한 DB_DTECH 데이터베이스에 신규 테이블을 생성할 예정입니다.


DB_DTECH DB 생성은 아래 글의 3번, 4번을 참고해주세요.

https://blog.naver.com/ryu1hwan/222407085233

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2...

blog.naver.com

KRX종목마스터 테이블을 만들기 전에 설계를 먼저 진행합니다. 앞에서 살펴본 KD.Columns의 결과 중에서 필요한 내용만 추려서 테이블을 설계합니다. 아래와 같습니다.



여기서는 ERD 클라우드로 테이블 설계를 진행했습니다. 아래 URL에 접속하시면 직접 확인하실 수 있습니다.

  - https://www.erdcloud.com/d/uLkbGXNcGu7HkvJXa

 

DB_DTECH

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

항상 테이블 생성 전에 설계를 먼저 하는 습관을 갖는 것이 좋습니다. (물론, 저는 개인 용도로 쓰기 때문에, 그냥 휘리릭 만들지만요.^^;; 시간 관계상...)

아래와 같은 SQL로 위에서 설계한 테이블을 생성합니다. 파이썬이 아닌 DBeaver나 MySQL Workbench와 같은 툴로 DB에 접속해서 실행해야겠죠.

# [SQL-1]
CREATE TABLE DB_DTECH.STOCK_KRX
(
	STK_CD    VARCHAR(40)   NOT NULL COMMENT '종목코드'
	,STK_NM   VARCHAR(200)  NOT NULL COMMENT '종목명'
	,SEC_NM   VARCHAR(500)  NULL     COMMENT '업종(섹터명)'
	,MAIN_PRD VARCHAR(1000) NULL     COMMENT '주요제품'
	,PUB_DT   DATE          NULL     COMMENT '상장일자'
	,EX_CD    VARCHAR(40)   NOT NULL COMMENT '거래소코드'
	,FRST_INP_DTM DATETIME  NULL     COMMENT '최초입력일시'
	,LAST_CHG_DTM DATETIME  NULL     COMMENT '최종변경일시'
	,PRIMARY KEY (STK_CD)
) COMMENT 'KRX종목마스터';

 

테이블을 만들었으면, 다시 파이썬으로 돌아와서 가져온 종목 리스트를 저장하도록 코딩할 차례입니다. 우선은 코스닥 종목 리스트만 DB에 저장하도록 하겠습니다. 앞에서 작성한 # [PyCode-1] 에 이어서 아래 코드를 작성합니다. 가져온 코스닥 종목 리스트를 한 건씩 읽으면서 STOCK_KRX 테이블에 한 건씩 INSERT 처리하고 있습니다.

# [PyCode-1]
# ... 생략 ....

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

# KOSDAQ 종목 입력(위에 내용과 동일)
for row in KD.itertuples():
    STK_CD = str(row.종목코드).zfill(6)
    STK_NM = str(row.회사명)
    SEC_NM = str(row.업종).replace("'", ",")
    MAIN_PRD = str(row.주요제품).replace("'", ",")
    PUB_DT = str(row.상장일)
    EX_CD = 'KD' # KOSDAQ

    sql = "INSERT INTO DB_DTECH.STOCK_KRX(STK_CD ,STK_NM ,SEC_NM ,MAIN_PRD ,PUB_DT ,EX_CD ,FRST_INP_DTM)"
    sql = sql + "VALUES("
    sql = sql + "'" + STK_CD + "'"
    sql = sql + ",'" + STK_NM + "'"
    sql = sql + ",'" + SEC_NM + "'"
    sql = sql + ",'" + MAIN_PRD + "'"
    sql = sql + ",DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')"
    sql = sql + ",'" + EX_CD + "'"
    sql = sql + ",NOW())"
    print(sql)
    myMyCursor.execute(sql)
    myMyCursor.execute('commit')

 

위의 코드를 실행한 후에, 다시 DBeaver와 같은 툴로 MySQL에 접속해 테이블을 조회해보면 저장된 종목 데이터를 확인할 수 있습니다.

# [SQL-2]
SELECT  *
FROM    DB_DTECH.STOCK_KRX;

지금까지, 종목 리스트를 KRX에서 어떻게 가져오는지, 저장은 어떻게 처리하는지 살펴봤습니다. 지금까지의 코드를 정리해서 아래와 같은 최종 파이썬 코드를 작성합니다. 데이터 저장하는 과정을 모듈(함수)화 해서 코스피와 코스닥을 같이 처리할 수 있도록 했습니다. 그리고, 기존에 데이터가 존재하면 업데이트하도록 INSERT ON DUPLICATE 구문을 사용했습니다.
(INSERT ON DUPLICATE는 한 테이블에 Key가 여러개 일 때는 사용하면 안되는 구문이라는 걸 참고해주세요.)

import pandas as pd

url = 'https://kind.krx.co.kr/corpgeneral/corpList.do' # KRX의 종목리스트 URL
KD = pd.read_html(url+"?method=download&marketType=kosdaqMkt")[0] #코스닥
KP = pd.read_html(url+"?method=download&marketType=stockMkt")[0] #코스피

print(KD) # 코스닥 종목 리스트 출력
print(KP) # 코스피 종목 리스트 출력
print(KD.columns) #종목 리스트를 구성하는 컬럼 확인

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

def InsertStockList(_df,_ex_cd):
    for row in _df.itertuples():
        STK_CD = str(row.종목코드).zfill(6)
        STK_NM = str(row.회사명)
        SEC_NM = str(row.업종).replace("'", ",")
        MAIN_PRD = str(row.주요제품).replace("'", ",")
        PUB_DT = str(row.상장일)
        EX_CD = _ex_cd

        sql = "INSERT INTO DB_DTECH.STOCK_KRX(STK_CD ,STK_NM ,SEC_NM ,MAIN_PRD ,PUB_DT ,EX_CD ,FRST_INP_DTM)" + "\n"
        sql = sql + "VALUES("
        sql = sql + "'" + STK_CD + "'"
        sql = sql + ",'" + STK_NM + "'"
        sql = sql + ",'" + SEC_NM + "'"
        sql = sql + ",'" + MAIN_PRD + "'"
        sql = sql + ",DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')"
        sql = sql + ",'" + EX_CD + "'"
        sql = sql + ",NOW())" + "\n"
        sql = sql + "ON DUPLICATE KEY UPDATE" + "\n"
        sql = sql + "STK_NM = '" + STK_NM + "'" + "\n"
        sql = sql + ",SEC_NM = '" + SEC_NM + "'" + "\n"
        sql = sql + ",MAIN_PRD = '" + MAIN_PRD + "'" + "\n"
        sql = sql + ",PUB_DT = DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')" + "\n"
        sql = sql + ",EX_CD = '" + EX_CD + "'"

        print(sql)
        myMyCursor.execute(sql)
        myMyCursor.execute('commit')

InsertStockList(KD,'KD') # 코스닥 종목 INSERT 처리
InsertStockList(KP,'KP') # 코스피 종목 INSERT 처리

위의 코드를 모두 작성한 후 실행하면 아래와 같이 STOCK_KRX 테이블에는 최신의 종목 리스트를 모두 담을 수 있게 됩니다.

 

SELECT  T1.EX_CD ,COUNT(*) CNT
FROM    DB_DTECH.STOCK_KRX T1
GROUP BY T1.EX_CD
ORDER BY T1.EX_CD;


오늘은 여기까지입니다.~! 파이썬을 접해보지 않은 분들께는 어려울 수 있지만, 찬찬히 하나씩 익히다 보면 그리 어렵지도 않답니다.!

오늘은 파이썬을 이용해 MySQL 에 접속을 해서 데이터를 가져와보고, 간단하게 차트도 하나 그려보겠습니다.
아무래도, 요즘에 신입 취업을 위해서는 파이썬도 거의 필수가 되어가는 느낌입니다.
부지런히 준비할 필요가 있습니다.~!

파이썬의 장점 중에 하나는 많은 모듈들이 제공되고 있고, 모듈만 잘 활용하면 정말 손쉽게 기능을 구현할 수 있다는 점입니다. DB연결 및 차트 그리는 과정도 마찬가지입니다.
여기서는 파이썬을 이용해  '평생 필요한 데이터 분석'의 DB_SQLSTK 데이터베이스에 접속을 합니다.

저 같은 경우는 Anaconda와 PyCharm을 설치해서 사용하고 있습니다. Anaconda는 파이썬의 주요 모듈을 모아놓은 패키지라고 생각하시면 됩니다. 파이썬 대신에 Anaconda를 설치하시면 됩니다. PyCharm은 파이썬 코딩을 할 수 있는 툴이라고 생각하시면 됩니다.

Anaconda의 경우 32비트와 64비트 버젼이 있습니다. 만약에 나중에 증권사 API를 통해 주식 데이터를 모으는 작업도 진행할 예정이라면 32비트를 설치하는 것이 좋습니다. 반면에 머신러닝등의 작업을 할 예정이라면 64bit 버젼을 설치해야 합니다. 64비트를 설치한 후에 가상환경을 만들어 32비트 모듈도 별도 처리할 수 있다고 하니 참고바랍니다.(저는 그렇게 해본적은 없고 그냥 32비트를 사용중입니다.)

​아나콘다는 아래 사이트에서 다운로드 할 수 있습니다.

https://www.anaconda.com/

 

Anaconda | The World's Most Popular Data Science Platform

Anaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.

www.anaconda.com

파이참은 아래 사이트에서 다운로드할 수 있습니다.

https://www.jetbrains.com/ko-kr/pycharm/

 

PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

 


그러면, 본격적으로 MySQL에 접속해서 간단한 차트까지 그려보겠습니다.
가장 먼저 할일은 필요한 모듈을 import하는 것입니다. 아래와 같습니다.

import pymysql #mysql 연결및 실행을 위한 모듈
import pandas as pd 
import matplotlib.pyplot as plt #차트 처리를 위한 모듈




이번에는 파이썬에서 MySQL에 접속해보도록 하겠습니다. 아래와 같습니다.

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


MySQL에 실행할 SQL을 만들어봅니다. 앞에서 설명했듯이, 평생필요한 데이터 분석의 DB_SQLSTK의 테이블을 조회합니다. 아래와 같습니다.

# 실행할 SQL 생성
sql = """
        SELECT  T1.STK_CD ,T1.STK_NM
                ,T2.DT
                ,T2.C_PRC
                ,T2.O_PRC
                ,T2.H_PRC
                ,T2.L_PRC
                ,T2.VOL
        FROM    DB_SQLSTK.STOCK T1
                INNER JOIN DB_SQLSTK.HISTORY_DT T2
                   ON (T2.STK_CD = T1.STK_CD)
        WHERE   T1.STK_NM = '삼성전자'
        """


SQL을 실행하고, 결과를 바로 DataFrame에 저장합니다. DataFrame(DF)를 Print해보면 테이블 형태로 데이터가 저장된 것을 알 수 있습니다.

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

# 결과 출력
print(df)


여기까지, MySQL에 접속해서 SQL까지 실행해봤습니다.

마지막으로, 가져온 데이터에서 C_PRC(종가)만 Series 객체에 담은 후에 차트로 그려보도록 하겠습니다. 아래와 같습니다.

# 차트로 처리할 항목을 Series에 별도로 담는다.
c_prc = df['C_PRC']
c_prc.index = df['DT']

plt.figure(figsize=(11,9))
c_prc.plot(label='Close Price', title= "Samsung Close Price")
plt.legend(loc='lower left')
plt.grid(True)
plt.show()


아래와 같은 삼성전자의 종가 차트를 손쉽게 만들어 낼 수 있습니다.





전체 소스는 아래와 같습니다.

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 생성
sql = """
        SELECT  T1.STK_CD ,T1.STK_NM
                ,T2.DT
                ,T2.C_PRC
                ,T2.O_PRC
                ,T2.H_PRC
                ,T2.L_PRC
                ,T2.VOL
        FROM    DB_SQLSTK.STOCK T1
                INNER JOIN DB_SQLSTK.HISTORY_DT T2
                   ON (T2.STK_CD = T1.STK_CD)
        WHERE   T1.STK_NM = '삼성전자'
        """

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

# 결과 출력
print(df)

# 차트로 처리할 항목을 Series에 별도로 담는다.
c_prc = df['C_PRC']
c_prc.index = df['DT']

plt.figure(figsize=(11,9))
c_prc.plot(label='Close Price', title= "Samsung Close Price")
plt.legend(loc='lower left')
plt.grid(True)
plt.show()


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

 

 

데이터를 분석하는 과정을 공부해보고 싶으신 분은 아래의 '평생 필요한 데이터 분석'의 교육 과정을 추천합니다. 교육을 통해 SQL을 배운다면, 위 내용을 좀 더 보강할 수도 있고, 자신만의 스타일로 분석을 할 수 있습니다. SQL을 완전히 자신의 것으로 만들 수 있는 교육이니 관심 가져보시기 바랍니다. 감사합니다.~!

https://cafe.naver.com/dbian/5259

 

「평생 필요한 데이터 분석(MySQL 과정)」 수강자 모집

MySQL 사용자를 위한 SQL 교육 과정을 모집합니다. 2021년 4월에 첫 강의를 성공리에 잘 마친 이후, 강사님의 프로젝트 일정이 너무 바쁜 탓에, 그리고 코로나 탓에 ...

cafe.naver.com

 

98년 IMF, 2008년 금융위기, 2020년 코로나

10년에 한 번씩 온다는 위기. 위기는 곧 기회라는걸 우리는 잘 알고 있습니다.

하지만, 위기가 오면, 항상 공포와 불안이 엄습하면서 위기를 기회로 만들지 못합니다.

저역시 마찬가지입니다.

98년에는 대학생이어서, 너무 어려서(?) 몰 몰랐고요.

2008년에는 겁만 잔뜩 먹고 손절하기 바빴죠.

2020년에는, 1500 밑으로만 오면 들어가야겠다.

하지만 1500 밑으로 주가가 내려갔어도 더 밑으로 내려가겠지 조금만 기다려보자,

생각하다 기회를 놓치고 말았습니다.

앞으로 10년쯤 후에 기회가 한 번 더 올지는 알 수 없습니다.

생각보다 오랜 시간이 걸릴 수도 있고, 생각보다 빨리 올수도 있겠죠.

어쨌든, 그러한 위기이자 기회가 왔을때,어느 시점에 투자를 시작할지 과거 데이터를 통해 살펴봤습니다.

여기서 사용한 아이디어는 알렉산더 엘더의 '주식시장에서 살아남는 심리투자의 법칙'을 참고했습니다.

이전 포스팅과 중복된 내용입니다. 다만, 이번 글에서는 '바닥'을 찾는 개념으로 데이터를 바라보았습니다.

 

https://sweetquant.tistory.com/285

 

지수ETF는 이평선을 타고? feat. 주식시장에서 살아남는 심리 투자 법칙

​ 오늘은 알렉산더 엘더의 "주식시장에서 살아남는 심리 투자 법칙"이란 책을 읽다가 투자 아이디어가 생각나서, 시뮬레이션 해본 결과를 올려봅니다. ​ 본격적인 설명에 앞서, 절대 어떤 종

sweetquant.tistory.com

 

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

1. 60일 이동평균 상회 종목 비율 구하기

'주식시장에서 살아남는 심리투자의 법칙'에서는 50일 이동평균을 상회하는 종목수의 비율을 이용해 시장의 방향 전환을 예측할 수 있다고 설명합니다. 여기서는 60일 이동평균을 사용합니다.

'평생 필요한 데이터 분석'의 데이터베이스를 사용해 [그림-1]과 같은 차트를 만들어 냅니다.

[그림-1]

 

[그림-1]의 차트 데이터를 뽑아내는 로직은 아래와 같습니다.

  - 코스피에 상장된 일반주만 사용합니다.(우선주, ETF, ETN등 제외)

  - 2019년1월부터 2020년12월까지의 일별 주가 데이터를 사용합니다.

  - 일별로 종가가 60일 이동평균을 상회하는 종목수를 카운트해서 전체 종목대비 비율을 구합니다.

  - 60일 이동평균 상회 종목 비율이므로 0부터 100사이를 왔다 갔다 합니다.

위의 로직에 합당한 데이터는 '평생 필요한 데이터 분석'의 데이터와 아래 [SQL-1]을 사용해 얻을 수 있습니다. 아래 SQL로 얻은 데이터를 엑셀을 사용해 [그림-1]과 같은 차트를 만들면 됩니다.

-- [SQL-1] SQL 평생 필요한 데이터 분석 DB 사용(코스피, 일반주만)
SELECT  T1.DT
        ,COUNT(*) 종목수
        ,SUM(CASE WHEN T1.C_PRC >= T1.M60_PRC THEN 1 ELSE 0 END) 60일이평상회종목수
        ,ROUND(SUM(CASE WHEN T1.C_PRC >= T1.M60_PRC THEN 1 ELSE 0 END)
                                            / COUNT(*) * 100,1) 60일이평상회종목비율
FROM    DB_SQLSTK.HISTORY_DT T1
        INNER JOIN DB_SQLSTK.STOCK T2
          ON (T2.STK_CD = T1.STK_CD)
WHERE   T2.STK_TP_NM IS NULL
AND     T2.EX_CD = 'KP'
GROUP BY T1.DT
ORDER BY T1.DT;

  - 평생 필요한 데이터 분석 데이터베이스 구축하기

      : https://blog.naver.com/ryu1hwan/222359890049

2. KOSPI 지수 같이 보기

앞에서 구한 차트에 KOSPI 지수를 매핑해서 차트를 그려봅니다. KOSPI 지수는 키움의 영웅문을 이용해 얻었습니다. [그림-1]에 KOSPI 지수를 입혀보면 아래 [그림-2]와 같습니다.

[그림-2]

 

[그림-2]를 보면 코로나 저점인 2020년 3월에, 60일 상회 종목비율이 5% 이하까지 내려갔습니다. 주가 최저점은 1457.65포인트였고, 해당 시점에 60일 상회 종목 비율은 1.4%입니다.

코로나 이전, 2019년 8월 초에도 60일 상회 종목 비율이 6.9%까지 내려갔습니다. 해당 시점에 주가는 하락세이긴 했지만, 코로나 시점처럼 폭락은 아니었습니다.

[그림-2]를 보면, 전반적으로 60일 상회 종목 비율이 깊이 내려갔다가, 상승하면 코스피 지수가 상승 추세로 전환하는 것으로 보입니다.

3. 과거 데이터 털어보기 - 바닥은 5% 이하?

위와 같이 2년치 데이터만 살펴봐서는 '바닥'을 찾는 방법이 잘 보이지 않습니다. 제가 가지고 있는 2002년 이후의 모든 주가 데이터와 KOSPI 지수를 합쳐서 차트를 그려봤습니다. [그림-3]과 같습니다.

[그림-3]

 

[그림-3]을 보면, 2008년 금융 위기때도, 60일 상회 종목 비율이 거의 0에 가깝게 떨어진 것을 볼 수 있습니다.

60일 상회 종목 비율이 5% 이하인 시점만 필터해서 조회해보면 아래 [결과-1]과 같습니다.

[결과-1]

 

2008년 금융위기때 저점은 968이었고, 코로나때 저점은 1457이었습니다. (일별 종가 기준)

시장에 큰 충격이 왔을때, 지수가 몇이 저점일지를 맞추는 것은 어렵습니다.

각자 생각이 다를겁니다. 코로나때 지수 지점이 1600이라고 예측한 사람은 1600에 들어갔다가 1500이 깨지자 못 버티고 손절했을겁니다. 1400이라고 생각한 사람은 기회를 놓쳤을겁니다. 2008년 지수를 경험한 사람은 1000이하를 기다리다 실패했을겁니다. 물론, 신나게 잘 잡아서 성공한 사람도 많을겁니다.

이처럼 지수를 통해 바닥을 확인하기는 만만치가 않습니다. 하지만 [그림-3]을 통해서는, 60일 이동평균을 상회하는 종목이 5% 이하로 내려가면 충격에 의한 하락의 거의 저점에 도달하는 것을 볼 수 있습니다. 사례가 2008년, 2020년 두 번밖에 없기 때문에 앞으로도 그럴 것이라고 확언할 수 없습니다.

어쨋든, 지수 저점을 맞추는 것보다, 지수를 구성하는 종목의 전체 흐름을 통해 바닥을 확인해볼 수도 있다는 것을 알 수 있습니다.

앞에서 참고한 '주식시장에서 살아남는 심리투자의 법칙'에서는 상회 비율이 방향 전환해 상승으로 나아갈때, 주식 매수에 들어가는 것이 좋다고 합니다. 즉, 바닥을 확인하고 올라가는 시점에 주식을 매수하라는 거죠. 저 역시 이 말이 맞다고 생각합니다. 바닥 밑에 지하 있고, 지하 밑에 지옥이 있기도 하니까요.

오늘은 여기까지입니다. 그냥 참고하는 정보로 봐주시면 감사하겠습니다.

오늘은 알렉산더 엘더의 "주식시장에서 살아남는 심리 투자 법칙"이란 책을 읽다가 투자 아이디어가 생각나서, 시뮬레이션 해본 결과를 올려봅니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

"주식시장에서 살아남는 심리 투자 법칙"의 35장에서는 "50일 이동평균 상회종목"을 설명합니다.

간단히, 이야기 하면, 주식 시장에 종목들 중에 50일 이동평균을 상회하는 종목의 비율을 따라 전체 시장이 반전 될지를 어느 정도 예측할 수 있다는 내용입니다.

책에서는, 50일 이동평균을 상회하는 종목의 비율이 "대개 75퍼센트 근처에 도달하면 다시 내려오고 25퍼센트 근처에 도달하면 다시 올라간다. 나는 차트에 75퍼센트, 25퍼센트에 해당하는 지점에 두 개의 기준선을 긋고 이 수준에 도달했다가 방향을 바꾸는 시장을 찾는다" 라고 설명되어 있습니다.

그리고, "50일 이동평균 상회 종목 비율이 특정 수준에 도달할 때가 아니라 특정 수준 근처에서 방향을 선회할 때 매매 신호가 켜진다. 상단 기준선 가까이 가거나 상단 기준선을 돌파한 후 기준선 아래로 떨어지면 천장이 완성됐다는 신호다. 하단 기준선 가까이 가거나 하단 기준선을 돌파한 후 상승 전환하면 바닥이 완성됐다는 신호다."

뒤에는 더 중요한 말들이 있습니다. 주식 투자에 관심이 많다면 한번쯤 읽어볼 만한 책이라고 생각합니다.

여기서는 책에서 설명한 내용을 이용해 코스피 지수 ETF를 매매한다면 어떻게 될까를 시뮬레이션 해봤습니다.

여기서는 60일 이동평균을 사용합니다. 50일 이동평균을 계산하는 것이 어렵지는 않지만, 우선 60일 이동평균으로 위의 로직이 진짜 먹힐까를 시험해 보려고 합니다.

우선, DB_SQLSTK의 데이터베이스(평생 필요한 데이터 분석 책에서 사용하는 데이터베이스)를 사용해, 2019년부터 2020년 말까지 일별로 코스피 일반주 중에 60일 이동평균을 상회하는 종목의 비율을 구해서 엑셀의 차트로 그려봅니다. 아래와 같습니다. 비율이므로 0부터 100 사이를 왔다 갔다 합니다.

[그림 - 1]

 

[그림-1]을 구하는 SQL은 아주 쉽습니다. 아래와 같습니다.

SELECT  T2.DT
        ,COUNT(*) ALL_CNT
        ,SUM(CASE WHEN T2.C_PRC >= T2.M60_PRC THEN 1 ELSE 0 END) OV_MV_CNT
        ,ROUND(SUM(CASE WHEN T2.C_PRC >= T2.M60_PRC THEN 1 ELSE 0 END) / COUNT(*) *100,2)OV_MV_RT
FROM    DB_SQLSTK.STOCK T1
        INNER JOIN DB_SQLSTK.HISTORY_DT T2
           ON (T2.STK_CD = T1.STK_CD)
WHERE   T1.STK_TP_NM IS NULL
AND     T1.EX_CD = 'KP'
GROUP BY T2.DT;

 

이제, 위 60일 상회 종목 비율에 코스피 지수를 추종하는 ETF 중에 하나인 KODEX 200 의 주가를 겹쳐서 그려봅니다. 그리고 KODEX 200의 매수(B)와 매도(S) 시점을 잡아봅니다.

- 매수시점 : 60일 상회가 25% 밑으로 내려갔다가 25% 위로 올라오는 시점

- 매도시점: 60일 상회가 75% 위로 올라갔다가 75% 밑으로 내려오는 시점

[그림-2]

 

[그림-2]와 같이 결과가 형편없습니다. 제 생각을 지수 ETF를 매매하는 것이 틀렸다고 봐야겠죠. 그림을 보면, 코로나 시점에는 60일을 상회하는 종목이 거의 0%에 가까웠네요. 해당 구간을 벗어날때 매수가 들어갔다면 좋았겠지만, 앞에서 매수후 매도 조건에 들어 맞지 않았으므로 매수 하지 않았다고 가정했습니다.

그래도, 60일 이동평균을 상회하는 종목이 늘어나는 시점을 기준으로 시장을 공략해 볼수는 있어 보입니다.

위에서 테스트한 구간은 2019, 2020년 2년치입니다. 제가 가진 데이터 중에 가능한 긴 데이터를 사용해 시뮬레이션 해보면 아래와 같습니다.

2002년부터 현재까지의 60일 이동평균 상회 종목 비율의 움직임과 KODEX 200 ETF 주가의 움직입니다.

[그림-3]

 

매수, 매도 시점을 대략 집어 넣어 봤습니다. 수작업으로 하려니 힘드네요..

[그림-3]에서 아래쪽에 녹색 상자 위의 선이 60일 이동평균 상회 종목 비율입니다. 0부터 100 사이를 왔다 갔다 합니다. 그리고 위에 파란선은 KODEX 200 ETF의 주가입니다.

KODEX 200 ETF의 주가 위에는 빨간 점선이 그려져 있습니다. 매수와 매도 시점에 따른 주가의 흐름을 표시한 선입니다. 보면, 16번의 매매가 있었고 이 중에 두 번은 하락(5번, 15번) 나머지는 상승한 것을 볼 수 있습니다.

나빠보이지는 않습니다. 하지만 5번의 하락 정도가 매우 크고, 16번을 기점으로 유동성 대세 상승에서는 아무 수익을 얻지 못하는 것을 알 수 있습니다.

위의 그림을 봤을때는, 어느정도는 60일 이동평균 상회 종목 비율을 이용해, 지수 ETF의 움직임을 예측하는 것이 아주 불가능해 보이지는 않습니다. 다만, 60일 비율이 바닥을 만들고 틀어 올릴때 기준과.. 천정을 만들지 못하고 떨어지는 경우를 어떻게 구분해볼지 추가적인 고민이 필요해보입니다.

결국..오늘 설명 드린 내용은, "주식시장에서 살아남는 심리 투자 법칙" 책은 괜찮은거 같다... 이동평균을 상회하는 종목 비율 변화로 지수ETF를 따라가보는건 어떨까. 정도입니다.

감사합니다.

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

 

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

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

※ 교육 소개: https://sweetquant.tistory.com/283?category=1205210 

 

※ 완전판 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=

 

안녕하세요.

주식 관련 서적이나, 블로그등을 살펴보다 보면 '긴 아래 꼬리 음봉'이 나오면 상승 반전이라는 글들이 종종 있습니다. 아래 그림과 같은 모양이죠.

[그림 - 1]

 

오늘은 긴 아래 꼬리 음봉이 나오면 주가의 추세가 정말 반전되는지에 대해서 데이터를 살펴봤습니다.

먼저, 저는 주식 매매를 전문으로 하는 사람은 아닙니다. 차트를 잘 알지도 못하고요.

다만 데이터 분석 관점으로 다양하게 주식과 주식 차트를 분석하는 중입니다.

(제 직업을 정확히 말씀드리자면 데이터베이스와 SQL 전문가입니다.)

오늘 적어드린 내용은 기준을 어떻게 잡는지에 따라 다양한 결과가 나오는 부분입니다.

그렇기 때문에 재미로만 봐주시면 좋을거 같고, 각자 데이터에 관심이 있다면, 제 블로그의 글들을 참고해 더 연구해보시기 바랍니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

먼저, [그림 - 1]과 같은 모양의 '긴 아래 꼬리 음봉' 기준을 제 나름대로 정해보면 아래와 같습니다.

  1. 음봉의 아래꼬리 길이가 전체 길이 대비 65% 이상

  2. 거래금액이 100억 이상

  3. 전날 봉 전체 길이(어제고가-어제저가)보다 오늘 봉 전체 길이가 1.5배 이상

  4. 다음날 봉 전체 길이(어제고가-어제저가)보다 오늘 봉 전체 길이가 1.5배 이상

  5. 전날 종가보다 오늘 종가가 작을것

  6. 다음날 시가보다 오늘 종가가 작을것

  7. 전날 거래금액보다 오늘 거래금액이 3배 이상

  8. 다음날 거래금액보다 오늘 거래금액이 3배 이상

위와 같은 기준은 각자 정할 수 있겠죠. 위와 같은 기준으로 '긴 아래 꼬리 음봉'이 발생한 종목과 일자를 찾아볼 예정입니다. 사용한 데이터 기준은 아래와 같습니다.

  - 데이터는 '평생 필요한 데이터 분석'에서 제공하는 2019년, 2020년 일별주가 데이터를 사용했습니다.

     : https://blog.naver.com/ryu1hwan/222359890049

 

위에서 정한 기준으로 긴 아래 꼬리 음봉이 발생한 데이터를 출력해보면 아래의 [결과 - 1]과 같습니다. 결과를 출력할 때, 긴 아래 꼬리 음봉이 발생한 20일 후의 종가를 가져와 등락률도 같이 계산합니다.

[결과 - 1]

 

[결과 - 1] 의 내용을 종합해보면 다음과 같습니다.

  - 긴 아래 꼬리 음봉 발생 횟수: 13회 (2019~2020년 사이)

  - 20 거래일 후 5% 이상 상승 횟수: 5회

  - 20 거래일 후 5% 이상 상승 확률: 38%

정리하면, 여기서 정한 '긴 아래 꼬리 길이' 기준으로 매매를 하게 된다면 20 거래일 후 5% 이상 상승할 확률이 38% 정도라고 볼 수 있습니다. (이러한 확률을 적용하기에는 모수가 너무 적지 않나 생각이 듭니다.)

중요한건, 제가 위에서 정한 기준에 따라 이러한 확률이 나온 것이고, 각자 기준을 변경해 본다면 더 좋은 확률이 나올 수 있습니다.(예를 들어, 거래금액이 더 높아야 한다거나, 다음날에 상승이 어느정도 되어야 한다거나)

[결과 - 1]에서 첫 번째 데이터를 살펴보면, '지누스' 종목에서 2020년 4월 2일에 긴 아래 꼬리 음봉이 나왔고, 20 거래일 후에 53%나 상승을 했습니다. 실제 차트를 살펴보면 아래 [그림 - 2]와 같습니다.

[그림 - 2]

 

단순하게, 위 결과만 보고 '긴 아래 꼬리 음봉'='상승'이라고 생각하면 안되겠죠. [결과 - 1]의 마지막 데이터를 보면, 공교롭게도 같은 종목인 '지누스'에서 2020년 2월 8일에도 긴 아래 꼬리 음봉이 나왔고, 해당 일자의 20일 후에는 오히려 -25% 하락이 발생했습니다. 아래 [그림 - 3]과 같습니다.

[그림 - 3]

 

무조건 '긴 아래 꼬리 음봉'이 나온다고 상승하지 않는다는 것을 알 수 있습니다.

위 차트를 보며 생각해 보니, 떨어진 경우는 2020년 3월 코로나로 모두가 급락한 것이고, 오른 시점은 코로나 이후 대세 상승한 케이스에 지나지 않나 생각도 듭니다.

당연히, 단순히 이 신호만으로 성공할 수 있다면 세상 모든 사람이 부자가 되었겠죠. ^^

내친김에, 2010년 이후로 현재(2021년7월8일)까지 여기서 정한 기준을 적용해 종목을 찾아보면 아래 [결과 - 2]와 같습니다. (아래 결과는 개인적으로 수집, 관리하는 일별주가 데이터를 사용했습니다.)

[결과 - 2]

 

[결과 - 2]의 내용을 종합해 보면 아래와 같습니다.

  - 긴 아래 꼬리 음봉 발생 횟수: 55회 (2010~2021년 7월 8일 사이)

  - 20 거래일 후 5% 이상 상승 횟수: 19회

  - 20 거래일 후 5% 이상 상승 확률: 35%

35%라는 확률이 의미가 있는지 잘 모르겠습니다. 더욱이 기준에 따라 확률의 변화 정도가 크기 때문이죠.

위 결과가 포함된 엑셀도 올려드립니다.

20210709_반전의긴아래꼬리음봉_업.xlsx
0.02MB

 

마지막으로 [결과 - 1]를 추출하는 SQL은 아래와 같습니다.

WITH RES01 AS(
SELECT  T1.C_PRC - T1.L_PRC 아래꼬리길이
        ,T1.O_PRC - T1.C_PRC 몸통길이
        ,T1.H_PRC - T1.O_PRC 위꼬리길이
        ,T1.H_PRC - T1.L_PRC 전체길이
        ,ROUND((T1.H_PRC - T1.L_PRC) / T1.L_PRC *100,2) 고점저점등락률
        ,T1.C_PRC * T1.VOL / 1e8 거래금액_억
        ,T_BF1.H_PRC - T_BF1.L_PRC 전날_전체길이
        ,T_AF1.H_PRC - T_AF1.L_PRC 다음날_전체길이
        ,T_BF1.C_PRC * T_BF1.VOL / 1e8 전날_거래금액_억
        ,T1.C_PRC
        ,T1.O_PRC
        ,T1.DT
        ,T1.STK_CD
        ,T1.STK_DT_NO
        ,T1.H_PRC
        ,T1.L_PRC
FROM    DB_SQLSTK.HISTORY_DT T1
        INNER JOIN DB_SQLSTK.STOCK T3
           ON (T3.STK_CD = T1.STK_CD)
        INNER JOIN DB_SQLSTK.HISTORY_DT T_BF1
           ON (T_BF1.STK_CD = T1.STK_CD AND T_BF1.STK_DT_NO = T1.STK_DT_NO-1)
        INNER JOIN DB_SQLSTK.HISTORY_DT T_AF1
           ON (T_AF1.STK_CD = T1.STK_CD AND T_AF1.STK_DT_NO = T1.STK_DT_NO+1)
WHERE   T1.C_PRC < T1.O_PRC 
AND     T1.C_PRC < T_BF1.C_PRC
AND     T1.C_PRC < T_AF1.O_PRC
AND     T3.STK_TP_NM IS NULL
)
,RES02 AS(
SELECT  T1.아래꼬리길이 / T1.전체길이 아래꼬리길이비율
        ,T1.몸통길이 / T1.전체길이 몸통길이비율
        ,T1.위꼬리길이 / T1.전체길이 위꼬리길이비율
        ,T1.*
FROM    RES01 T1
)
,RES03 AS(
SELECT  T1.*
        ,ROUND((T2.C_PRC - T1.C_PRC) / T1.C_PRC*100,2) CHG_RT_AF_20
        ,T2.C_PRC C_PRC_AF_20
        ,T2.DT DT_AF_20
        ,T2.STK_CD STK_CD_AF_20
FROM    RES02 T1
        INNER JOIN DB_SQLSTK.HISTORY_DT T2
          ON (T2.STK_CD = T1.STK_CD
              AND T2.STK_DT_NO = T1.STK_DT_NO + 20)
WHERE   T1.아래꼬리길이비율 >= 0.65
AND     T1.전날_전체길이 > 0
AND     T1.전체길이/T1.전날_전체길이 > 1.5
AND     T1.다음날_전체길이 > 0
AND     T1.전체길이/T1.다음날_전체길이 > 1.5
AND     T1.거래금액_억 > 100
AND     T1.거래금액_억 / T1.전날_거래금액_억 > 3

)
,RES04 AS( 
SELECT  SUM(CASE WHEN T1.CHG_RT_AF_20 >= 5 THEN 1 ELSE 0 END) WIN_CNT
        ,AVG(T1.CHG_RT_AF_20) AVG_AF_20
        ,COUNT(*) CNT
        ,ROUND(SUM(CASE WHEN T1.CHG_RT_AF_20 >= 5 THEN 1 ELSE 0 END) / COUNT(*) * 100,2)WIN_RT
FROM    RES03 T1
)
# SELECT * FROM RES04;
SELECT  T2.STK_CD ,T2.STK_NM
        ,T1.DT 꼬리일자
        ,T1.아래꼬리길이비율
        ,T1.C_PRC
        ,T1.DT_AF_20
        ,T1.C_PRC_AF_20
        ,T1.CHG_RT_AF_20
FROM    RES03 T1
        INNER JOIN DB_SQLSTK.STOCK T2 ON (T2.STK_CD = T1.STK_CD)
ORDER BY CHG_RT_AF_20 DESC
;

 

이상입니다. 참고 정보로만 봐주시기 바랍니다.~!

개인적으로는 이러한 매매 시그널 찾는것 보다는, 어떤 종목이 더 좋을까. 종목을 잘 선별하는게 더 중요한거 같습니다.

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

 

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

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

※ 교육 소개: https://sweetquant.tistory.com/283?category=1205210 

 

※ 완전판 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=

 

오늘은 DART의 21년 1분기 영업이익 데이터와 월별주가를 섞어서 종목을 검색해보겠습니다.

여기서 찾아보는 종목은 아래와 같습니다.

  1. 종목별, 영업이익증가 순위와 등락 순위

  2. 영업이익 증가와 함께 주가도 오른 종목 Top-10

  3. 영업이익 증가에 비해 주가가 내린 종목 Top-10

사용한 분석 데이터의 기준은 아래와 같습니다.

  - 2021년 1분기 영업이익: DART에서 2021년 6월 18일에 게시된 포괄_손익계산서_연결 데이터 사용

    * 일부 종목의 경우 통화기준이 USD로 보고가 됩니다. USD를 KRW로 변경없이 그냥 올렸습니다.

    * 그러므로 USD로 보고되는 종목의 경우 수치가 맞지 않습니다.

  - 최종 데이터를 추출할 때, 전기1분기(2020년1분기)의 영업이익이 50억 이상인 종목만 대상으로 합니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

이 글의 내용을 직접 구현해보거나 응용해보고 싶다면, 앞의 글들을 차례대로 진행해주셔야 합니다.

1. 2021년 1분기 DART 재무제표 데이터베이스화하기

  : https://sweetquant.tistory.com/263

2. 2021년 1분기 영업이익 증가 종목 찾기

  : https://sweetquant.tistory.com/267

3. 월별주가 데이터 업로드하기

  : https://sweetquant.tistory.com/276

1. 종목별, 영업이익증가 순위와 등락 순위

먼저 저희가 구할 순위는 아래와 같이 네 가지입니다.

(20년1분기 영업이익이 50억 이상인 종목만 대상으로 합니다.)

  - 영업이익 증가 순위

    : 21년 1분기 영업이익 - 20년 1분기 영업이익

    : 단순히 영업이익 금액 증가에 따라 순위를 부여합니다. 영업이익 자체가 큰 기업일수록 순위에 유리합니다.

  - 영업이익 증가율 순위

    : 21년 1분기 영업이익 / 20년 1분기 영업이익

    : 영업이익 증가 비율에 따른 순위입니다. 영업이익 금액이 작아도 증가율에 따라 순위가 좋아집니다.

  - 등락률 순위

    : (21년6월종가 - 21년1월종가) / 21년1월종가 * 100

    : 위 로직에 따라 등락률이 높으면 순위가 좋습니다.(1위)

  - 하락률 순위

    : 등락률 순위와 반대로, 많이 하락할수록 순위가 좋습니다.

 

순위를 구한 엑셀 파일은 아래와 같습니다.

20210706_영업이익과월별주가.xlsx
0.07MB

 

순위를 구하는 SQL은 아래와 같습니다. 막상 보기에 복잡해 보일 수 있지만 데이터를 이해하고 SQL을 알고 있다면 그리 어려운 문법은 아닙니다.

본 블로그의 '평생 필요한 데이터 분석'을 통해 SQL을 천천히 공부해보시길 추천합니다.

# [SQL-1]
WITH RES01 AS(
		# 영업이익증가
        SELECT  T1.회사명 
                ,SUBSTR(T1.종목코드,2,6) STK_CD
                ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
                ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가액
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가율
                ,RANK() OVER(ORDER BY ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) DESC) 영업이익증가액순위
                ,RANK() OVER(ORDER BY ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) DESC) 영업이익증가율순위
        FROM    DB_DTECH.up_손익계산서_20211q T1
        WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
        AND     ROUND(T1.전기1분기3개월/1e8,1) >= 50
        )
SELECT  T1.*
        ,T_YM1.YM YM1 ,T_YM1.C_PRC 종가1
        ,T_YM2.YM YM2 ,T_YM2.C_PRC 종가2
        ,ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) 등락률
        ,RANK() OVER(ORDER BY ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) DESC) 등락률순위
        ,RANK() OVER(ORDER BY ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) ASC) 하락률순위
FROM    RES01 T1
        INNER JOIN DB_DTECH.HIST_YM T_YM1 ON (T_YM1.STK_CD = T1.STK_CD AND T_YM1.YM = '202101')
        INNER JOIN DB_DTECH.HIST_YM T_YM2 ON (T_YM2.STK_CD = T1.STK_CD AND T_YM2.YM = '202106')
        ;

 

2. 영업이익 증가와 함께 주가도 오른 종목 Top-10

영업이익증가금액 순위 + 영업이익증가율 순위 + 등락률 순위를 합해서 순위가 좋은 종목 Top-10을 찾아보면 아래와 같습니다.

위 결과는 아래와 같이 [SQL-1]을 조금 변형해서 얻을 수 있습니다. [SQL-1]의 내용을 RES02로 묶은 후에, 세 가지 순위를 합해서 순위가 좋은 종목을 찾아내면 됩니다.

# [SQL-2]
WITH RES01 AS(
		# 영업이익증가
        SELECT  T1.회사명 
                ,SUBSTR(T1.종목코드,2,6) STK_CD
                ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
                ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가액
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가율
                ,RANK() OVER(ORDER BY ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) DESC) 영업이익증가액순위
                ,RANK() OVER(ORDER BY ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) DESC) 영업이익증가율순위
        FROM    DB_DTECH.up_손익계산서_20211q T1
        WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
        AND     ROUND(T1.전기1분기3개월/1e8,1) >= 50
        )
,RES02 AS(
		SELECT  T1.*
		        ,T_YM1.YM YM1 ,T_YM1.C_PRC 종가1
		        ,T_YM2.YM YM2 ,T_YM2.C_PRC 종가2
		        ,ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) 등락률
		        ,RANK() OVER(ORDER BY ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) DESC) 등락률순위
		        ,RANK() OVER(ORDER BY ROUND((T_YM2.C_PRC - T_YM1.C_PRC) / T_YM1.C_PRC * 100,1) ASC) 하락률순위
		FROM    RES01 T1
		        INNER JOIN DB_DTECH.HIST_YM T_YM1 ON (T_YM1.STK_CD = T1.STK_CD AND T_YM1.YM = '202101')
		        INNER JOIN DB_DTECH.HIST_YM T_YM2 ON (T_YM2.STK_CD = T1.STK_CD AND T_YM2.YM = '202106')
        )
SELECT  T2.*
FROM    RES02 T2
ORDER BY T2.영업이익증가액순위 + T2.영업이익증가율순위 + T2.등락률순위 ASC
LIMIT 10;

 

 

3. 영업이익 증가에 비해 주가가 내린 종목 Top-10

마지막으로, 영어익증가액순위와 영업이익증가율순위, 하락률순위를 종합해 종목 열개를 찾아보겠습니다. 영업이익은 증가했지만, 그 중에 상대적으로 주가가 내려간 종목을 찾는 방법입니다. 위 [SQL-2]의 마지막 부분 ORDER BY만 아래와 같이 변경하면 됩니다.

  - ORDER BY T2.영업이익증가액순위 + T2.영업이익증가율순위 + T2.하락률순위 ASC

결과는 아래와 같습니다.

오늘은 여기까지입니다. 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=

 

안녕하세요. 오늘은 월별 주가를 DB화해보겠습니다.

앞에서는 DART의 재무 제표 데이터를 올렸는데요, 월별 주가를 올려서 월별 주가도 같이 분석한다면 좀 더 좋은 종목을 찾는데 도움이 되기 때문입니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

오늘 올린 월별 주가 데이터는 2019년 1월부터 2021년 6월까지입니다. (2년 6개월치)

주의할 점은 일별주가가 아닌, 월별주가라는 점입니다.

일별주가 데이터의 경우 데이터 양이 많아 공유하고 DB화하는 과정이 쉽지 않습니다.

데이 트레이딩이나 단기 트레이딩이 아니라면 월별 주가 데이터로도 충분히 투자 종목 분석에 유용하게 사용할 수 있습니다.

월별주가의 특징부터 간단히 설명드리면, 일별 주가 데이터를 월별로 집계한 것입니다. '평생 필요한 데이터 분석' 책에서는 월별주가에 대해 아래와 같이 설명을 하고 있습니다. 참고하기 바랍니다.

[그림-1]

 

여기서는 앞에서 생성한 DB_DTECH 데이터베이스에 HIST_YM이라는 신규 테이블을 만들어 월별 주가 데이터를 올릴 예정입니다. (평생 필요한 데이터 분석에서 월별주가 테이블은 HISTORY_YM입니다. 일부러 다른 테이블을 사용해 평생 필요한 데이터 분석의 연습 환경을 보존합니다.)

만약에 MySQL과 DB_DTECH라는 DB를 생성하지 않은 환경이라면 앞에 글을 참고해 환경을 먼저 만들어주세요.

https://sweetquant.tistory.com/263?category=1163308 

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다. 이후에는 데

sweetquant.tistory.com

 

 

 

SQL 툴로 DB_DTECH에 접속해 SQL 창을 열어 아래 SQL로 HIST_YM이라는 월별주가 테이블을 먼저 생성합니다. (여기서는 SQL툴로 DBeaver를 사용했습니다. DBeaver 설치 과정 역시 위의 링크된 블로그 글을 참고해주세요.)

CREATE TABLE DB_DTECH.HIST_YM (
  STK_CD varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '종목코드',
  YM varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '년월',
  O_PRC decimal(18,3) DEFAULT NULL COMMENT '시작가',
  H_PRC decimal(18,3) DEFAULT NULL COMMENT '고가',
  L_PRC decimal(18,3) DEFAULT NULL COMMENT '저가',
  C_PRC decimal(18,3) DEFAULT NULL COMMENT '종가',
  VOL decimal(18,3) DEFAULT NULL COMMENT '거래량',
  PRIMARY KEY (STK_CD,YM),
  KEY IX_HIST_YM_01 (STK_CD,YM,H_PRC,C_PRC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='월별주가';

 

이제 테이블을 생성했으면, 월별주가 데이터를 올릴 차례입니다.

아래 압축 파일을 받으면, 2019년 1월부터 2021년 6월까지의 종목별 월별주가 데이터가 CSV 파일로 들어 있습니다.

 

YM_STK_202107060806.zip
1.18MB

 

위의 파일을 다운로드 한 후에 압축을 풀어주세요. 그 다음에는 DBeaver를 이용해 다운 받은 CSV 파일을 앞에서 만든 HIST_YM 테이블에 밀어 넣을 차례입니다.

DBeaver를 실행 한 후에, [그림 -2]와 같이 Database Navigator 창에서 새로 만든 HIST_YM 테이블을 찾아 마우스 우클릭 후에 데이터 가져오기 기능을 선택합니다.

[그림-2]

 

[그림-3]과 같이 CSV를 선택한 후에 다음(N) 버튼을 클릭합니다.

[그림-3]

 

아래 [그림-4]와 같이 테이블에 올릴 파일을 선택하는 창이 나오면 이 글에서 다운 받아 압축을 풀어놓은 파일을 선택해주세요.

[그림-4]

 

아래 [그림-5]와 같은 창을 통해, Source(원본)가 YM_STK_202107060806.csv 파일이고 Target(대상)이 db_dtech.hist_ym인 것을 확인합니다 Source의 데이터를 Target으로 밀어 넣는다는 걸 알 수 있습니다.

컬럼 구분자가 콤마(,)로 되어 있는지도 확인해주세요. 문제 없다면, 다음을 클릭해서 넘어갑니다.

[그림-5]

 

아래 [그림-6]과 같이 1번 부분을 확장해서 Source의 필드와 Target의 컬럼의 Mapping 상태를 확인합니다. 그림의 2번 부분과 같이 existing 상태면 문제 없습니다. 다음을 눌러주세요.

[그림-6]

 

위 [그림-6]이후 나오는 화면에서는 다음(Next)이나 시작(Start) 버튼을 눌러서 계속 넘어가다 보면 업로드가 진행됩니다.

모든 업로드가 완료되었다면, DB_DTECH의 SQL창에서 아래와 같이 SQL을 실행해봅니다. 삼성전자(005930)의 월별주가 데이터를 조회하는 SQL입니다.

SELECT  T1.* 
FROM    DB_DTECH.HIST_YM T1
WHERE   T1.STK_CD = '005930';
[결과]
STK_CD   YM       O_PRC       H_PRC       L_PRC       C_PRC       VOL             
======== ======== =========== =========== =========== =========== =============== 
005930   201901   39400.000   47050.000   36850.000   46150.000   301783852.000   
005930   201902   46650.000   47550.000   44250.000   45100.000   194923203.000   
005930   201903   46000.000   47000.000   43100.000   44650.000   223260605.000 
… 생략 …

 

오늘은 여기까지입니다. 다음 글에서는 월별주가 데이터를 분석해보도록 하겠습니다.

감사합니다.

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 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=

 

안녕하세요. 오늘은 상따로 수익을 낼 확률을 간단하게 구해보겠습니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

상따(상한가 따라잡기), 말 그대로 상한가 갈거 같은 종목을 매매하거나, 상한가인 종목을 따라가서 매매하는 방법입니다. (매매기법이라고 하는 것이 맞는지 잘 모르겠습니다.)

개인적으로 상따와 같은 매매 기법을 선호하지 않습니다. 상따뿐만 아니라 단타 매매 자체를 안하려고 노력하는 스타일입니다. 단타가 필패거나 나쁘다 생각하지는 않지만, 제 경우에는 단타가 잘 맞지 않더군요.

어쨌든, 상따는 과연 얼마나 성공할 수 있는지, 간단하게 확률을 구해봤습니다.

'상따' 매매도 다양한 방법이 있을거 같습니다. 시초가 상따를 따라간다던지, 오후장 상따를 노린다던지, 상따후 기다렸다 눌렸을때 매매한다든지, 상따를 만드는 과정을 고려해서 매매를 한다든지, 다양한 방법이 있겠죠.

안타깝게도 이와 같은 모든 방법을 구현해 상따의 승리(?) 확률을 구하려면 복잡해집니다. 그러므로 여기서는 아주 간단한 로직으로만 진행하겠습니다. 절대, 재미로만 봐주시기 바랍니다.

1. 종가가 15~20% 사이면 종가로 상따 매수

: 종가가 15~20% 사이일 때, 종가로 매수했다고 가정합니다.

: 결과를 보면, 1일후에 -5% 이하로 하락할 확률이 더 큽니다.

: 2% 이상 상승할 확률도 30%가 될까 말까 합니다.

2. 종가가 20~25% 사이면 종가로 상따 매수

: 종가가 20~25% 사이일 때, 종가로 매수했다고 가정합니다.

: 결과를 보면, 1일후에 -5% 이하로 하락할 확률이 위의 1번 케이스보다 더 높아졌습니다.

3. 종가가 25~28% 사이면 종가로 상따 매수

: 종가가 25~28% 사이면, 종가로 매수했다고 가정합니다.

: -5% 이하로 하락할 확률이 40%를 넘습니다.!!

지금까지 결과를 보면 상따한 경우, +5% 이상 상승할 경우보다 -5%이하로 하락할 확률이 더 높은 것을 알 수 있습니다. 특히나, 상한가에 근접하면 할 수록 다음날 -5%이하로 하락할 확률이 더 높아집니다.

(이점을 고려해, 상한가 나오고, 그 다음날 종가에 매수하면 또 어떻게 변할지 계산해볼 수도 있겠죠.)

결론은, 역시 상따는 안하는게 좋아보입니다.^^

위 데이터는 DB화된 일별 주가 데이터를 사용해 아래 SQL로 손쉽게 뽑아낸 결과입니다. 조건만 좀더 변경한다면 각자 원하는 방법으로 테스트 해볼 수 있습니다. 물론, 일별주가 데이터를 모아서 DB화 하는 과정이 순탄하지는 않습니다.

SELECT SUBSTR(T1.YMD,1,4) YY
       ,COUNT(*) CNT
       ,SUM(CASE WHEN T2.GRW_RT >= 2 THEN 1 END) 상승횟수
       ,ROUND(SUM(CASE WHEN T2.GRW_RT >= 2 THEN 1 END) / COUNT(*) * 100,2) 상승률
       ,SUM(CASE WHEN T2.GRW_RT <= -5 THEN 1 END) 급락횟수
       ,ROUND(SUM(CASE WHEN T2.GRW_RT <= -5 THEN 1 END) / COUNT(*) * 100,2) 급락률
       ,SUM(CASE WHEN T2.GRW_RT >= 5 THEN 1 END) 급등횟수
       ,ROUND(SUM(CASE WHEN T2.GRW_RT >= 5 THEN 1 END) / COUNT(*) * 100,2) 급등률
FROM   ORA_STK_USER.FT_STK_YMD T1
       ,ORA_STK_USER.FT_STK_YMD T2  
WHERE  T1.YMD >= '2016'
AND    T1.GRW_RT <= 28
AND    T1.GRW_RT > 25
AND    T2.STK_CD = T1.STK_CD
AND    T2.STK_YMD_NO = T1.STK_YMD_NO + 1
GROUP BY SUBSTR(T1.YMD,1,4)
ORDER BY YY;

 

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

  * 참고로 아래 책은, 주식 데이터를 모으는 방법은 설명하지 않습니다.

  * 주식 데이터(일별주가 2019년 2020년 2년치)를 데이터베이스화 해놓고 바로 SQL을 실습하는 책입니다.

 

이처럼, 데이터를 분석하는 과정을 공부해보고 싶으신 분은 아래의 '평생 필요한 데이터 분석'의 교육 과정을 추천합니다. 교육을 통해 SQL을 배운다면, 위 내용을 좀 더 보강할 수도 있고, 자신만의 스타일로 분석을 할 수 있습니다. SQL을 완전히 자신의 것으로 만들 수 있는 교육이니 관심 가져보시기 바랍니다. 감사합니다.~!

 

https://cafe.naver.com/dbian/5259

 

「평생 필요한 데이터 분석(MySQL 과정)」 수강자 모집

MySQL 사용자를 위한 SQL 교육 과정을 모집합니다. 2021년 4월에 첫 강의를 성공리에 잘 마친 이후, 강사님의 프로젝트 일정이 너무 바쁜 탓에, 그리고 코로나 탓에 ...

cafe.naver.com

 

 

 

 

 

 

안녕하세요.

오늘은 DART의 2021년 1분기 손익계산서를 사용해, 영업이익률이 좋은 종목을 찾아보겠습니다.

본격적인 설명에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않는다는 것을 기억해주시기 바랍니다.

데이터의 정확성 역시 일차적으로는 검토했지만, 데이터 수집 시점이나 과정에서 발생한 실수로 부정확할수도 있으니 양해바랍니다.

DART의 2021년 1분기 손익계산서를 다운받아 DB화하는 과정은 아래 글을 참고해주세요.

https://sweetquant.tistory.com/263?category=1163308 

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다. 이후에는 데

sweetquant.tistory.com

업로드한 테이블인 'up_손익계산서_20211q'를 SELECT해보면서 어떤 값들이 있는지 눈여겨 보시기 바랍니다. 테이블에 어떤 데이터가 있는지 잘 알고 있어야, 자신만이 원하는 것을 분석할 수 있으니까요.

DART의 손익계산서 파일에서, 매출액의 항목코드는 ifrs-full_Revenue 입니다. 영업이익 항목코드는 이전 글에서 살펴본 것처럼 dart_OperatingIncomeLoss 로 파악됩니다.

먼저 영업이익률을 간단히 정의해보면 아래와 같습니다.

  - 영업이익률 = 영업이익 / 매출액 * 100

어떻게 SQL을 작성하는지에 대한 자세한 설명은 생략하고 결과만 빠르게 살펴보겠습니다. SQL의 원리는 '평생 필요한 데이터 분석' 책을 통해 공부해주시기 바랍니다.

DART 포괄-손익계산서-연결 기준 2021년 1분기에 영업이익률 Top-10 종목을 찾아보면 아래와 같습니다. 여기서는 매출액이 500억 이상인 종목만 대상으로 했습니다. (일부 종목의 경우 USD로 보고된것이 있습니다. USD를 별도 KRW로 변경하지 않고 처리했습니다. 그러므로 USD로 수치가 보고된 데이터 일부는 누락되었을수 있습니다.)

WITH RES01 AS(
		SELECT  T1.종목코드 ,T1.회사명
		        ,MAX(CASE WHEN T1.항목코드 = 'dart_OperatingIncomeLoss' THEN ROUND(T1.당기1분기3개월/1e8,1) END) 영업이익
		        ,MAX(CASE WHEN T1.항목코드 = 'ifrs-full_Revenue' THEN ROUND(T1.당기1분기3개월/1e8,1) END) 매출액
		FROM    DB_DTECH.up_손익계산서_20211q T1
		WHERE   T1.항목코드 IN ('ifrs-full_Revenue','dart_OperatingIncomeLoss')
		GROUP BY T1.종목코드 ,T1.회사명
		)
SELECT  T1.종목코드 ,T1.회사명
        ,T1.영업이익 ,T1.매출액
        ,ROUND((T1.영업이익 / T1.매출액) * 100,2) 영업이익률
FROM    RES01 T1
WHERE   T1.매출액 > 500
AND     T1.영업이익 > 0
ORDER BY 영업이익률 DESC
LIMIT 10;

 

 

결과는 아래와 같습니다.

이번에는 DART 손익계산서에 포함된 업종명을 이용해, 업종별 영업이익률 Top-3 종목을 찾아보겠습니다. 아래와 같습니다. 마찬가지로 매출액 500억 이상인 종목만 대상으로 했습니다.

# SQL
WITH RES01 AS(
SELECT  T1.종목코드 ,T1.회사명 ,T1.업종명
        ,MAX(CASE WHEN T1.항목코드 = 'dart_OperatingIncomeLoss' THEN ROUND(T1.당기1분기3개월/1e8,1) END) 영업이익
        ,MAX(CASE WHEN T1.항목코드 = 'ifrs-full_Revenue' THEN ROUND(T1.당기1분기3개월/1e8,1) END) 매출액
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목코드 IN ('ifrs-full_Revenue','dart_OperatingIncomeLoss')
GROUP BY T1.종목코드 ,T1.회사명 ,T1.업종명
)
SELECT  T2.*
FROM    (
SELECT  T1.종목코드 ,T1.회사명 ,T1.업종명
        ,T1.영업이익 ,T1.매출액
        ,ROUND((T1.영업이익 / T1.매출액) * 100,2) 영업이익률
        ,RANK() OVER(PARTITION BY  T1.업종명 ORDER BY ROUND((T1.영업이익 / T1.매출액) * 100,2) DESC) 업종별순위
FROM    RES01 T1
WHERE   T1.매출액 > 500
AND     T1.영업이익 > 0
) T2
WHERE   T2.업종별순위 <= 3;

 

위의 SQL의 조건만 조금 변경한다면, 매출액 기준이나 Top-N에 대한 기준도 각자 원하는대로 변경이 가능합니다.

결과를 살펴보면 아래와 같습니다.

결과 파일을 아래 엑셀로도 첨부드립니다.

20210628_DART_2021년1분기영업이익률Top종목.xlsx
0.03MB

 

 

위와 같이 주식 데이터를 마음대로 분석해볼 수 있는 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=

 

오늘은 DART의 2021년 1분기 손익계산서 데이터를 사용해, 영업이익 증가한 종목을 찾아내보겠습니다.

본격적인 글에 앞서, 절대 어떤 종목을 추천하기 위한 글이 아니며, 본 글로 인해 투자한 종목의 손실에 대해서는 절대 누구도 책임지지 않습니다.

DART에서 손익계산서를 다운로드하고 데이터베이스화하는 과정은 아래 글을 참고해주세요.

 

https://sweetquant.tistory.com/263?category=1163308 

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다. 이후에는 데

sweetquant.tistory.com

 

위의 글을 통해, DART 손익계산서를 데이터베이스화했다고 가정하고 설명하도록 하겠습니다.

여기서는 앞에서 업로드용으로 사용한 up_손익계산서_20211q 테이블을 사용해 바로 데이터 분석을 진행합니다. 앞으로 좀 더 통합적이고 체계적인 분석을 위해서는 이와 같은 업로드용 테이블이 아닌, 실제 분석용 테이블로 데이터를 한 번 더 정제해서 사용하는 것이 좋습니다. 이러한 내용은 나중에 기회가 되면 다루도록 하고, 일단은 업로드용 테이블을 바로 사용해 분석을 합니다.

먼저 아래와 같은 SELECT SQL로 테이블을 간단히 조회해봅니다.

SELECT  T1.*
FROM    DB_DTECH.up_손익계산서_20211q T1;

 

결과를 확인해 보면, 굉자히 많은 데이터가 있습니다. 이중에서 오늘 사용할 것은 영업이익 데이터입니다.

테이블을 보면, 항목코드와 항목명이 있는데, '영업이익' 데이터를 제대로 고르기 위해서는 항목코드를 사용해야 합니다. 그러기 위해서는 영업이익의 항목코드가 무엇인지 먼저 찾아내야 합니다. 아래와 같은 SQL로 영업이익 항목코드를 유추해볼 수 있습니다.

SELECT  T1.항목코드
        ,COUNT(*) CNT
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목명 LIKE '%영업이익%'
GROUP BY T1.항목코드
ORDER BY CNT DESC;
[결과]
항목코드                                          CNT    
================================================= ====== 
dart_OperatingIncomeLoss                          1537   
ifrs-full_ProfitLossFromContinuingOperations      240    
ifrs-full_ProfitLossFromDiscontinuedOperations    170    
ifrs-full_ProfitLossBeforeTax                     7      
ifrs-full_DilutedEarningsLossPerShare             3    

 

항목명에 영업이익이 포함된 데이터를 항목코드별로 카운트를 해서 어떤 항목코드가 가장 많은지 찾아봤습니다. 아마도 dart_OperatingIncomeLoss가 영업이익일거 같습니다.

아래와 같은 SQL로 엔씨소프트의 2021년 1분기 영업이익을 확인해봅니다.

SELECT  T1.회사명 
        ,T1.항목명
        ,T1.당기1분기3개월
        ,T1.전기1분기3개월
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     T1.회사명 = '엔씨소프트';
[결과]
회사명            항목명                 당기1분기3개월         전기1분기3개월               
================= ====================== ====================== ====================== 
엔씨소프트        영업이익(손실)         56732864604.00         241424012436.00  

 

 

결과에서, 당기1분기3개월은 2021년 1분기(1월~3월)이고 전기1분기3개월은 2020년 1분기입니다. 엔씨소프트의 2021년 1분기 영업이익은 567억이고, 2020년 1분기 영업이익은 2414억입니다. (엔씨소프트의 영업이익이 엄청 줄었네요.. ㅜ.ㅜ 리니즈의 시대가 저무는걸까요...)

위의 결과는 영업이익이 원 단위로 출력됩니다. 원 단위로 출력되다 보니, 숫자가 너무 길어 보기가 불편합니다. 이 경우 1e8로 나누기 처리하면 원 단위를 억원 단위로 바로 변경할 수 있습니다. 아래와 같이 SQL을 실행합니다.

SELECT  T1.회사명 
        ,T1.항목명
        ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
        ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     T1.회사명 = '엔씨소프트';
[결과]
회사명            항목명                 당기1분기       전기1분기           
================= ====================== =============== =============== 
엔씨소프트        영업이익(손실)         567.3           2414.2        

 

결과가 좀 더 보기 편해졌습니다.

이제 우리가 사용한 테이블과 데이터에는 어느정도 감이 잡혔을겁니다. 바로, 영업이익이 가장 많이 오른 종목 열 개를 찾아보겠습니다. 2020년 1분기 대비해 2021년 1분기의 영업이익이 가장 많이 증가한 종목입니다.

SELECT  T1.회사명 
        ,T1.항목명
        ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
        ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
        ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가액
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
ORDER BY 영업이익증가액 DESC
LIMIT 10;
[결과]
회사명            항목명           당기1분기    전기1분기   영업이익증가액  
================= ================ ============ =========== =============== 
SK                영업이익(손실)   15446.9      -9654.3     25101.2         
SK이노베이션      영업이익(손실)   5025.4       -18154.3    23179.7         
S-Oil             영업이익(손실)   6292.2       -10072.6    16364.8         
현대중공업지주    영업이익         5343.0       -4872.3     10215.3         
HMM               영업이익(손실)   10192.9      -20.2       10213.1         
LG디스플레이      영업이익(손실)   5230.3       -3619.2     8849.5          
포스코            영업이익         15524.4      7052.5      8471.9          
롯데케미칼        영업이익(손실)   6237.7       -859.9      7097.6          
한화              영업이익(손실)   8484.7       2964.3      5520.4          
SK하이닉스        영업이익         13244.2      8027.6      5216.6    

 

결과는 보다시피 SK, SK이노베이션, S-Oil의 증가액이 가장 큰 것을 알 수 있습니다. 여기서, 주의할 것은 삼성전자나 현대차와 같은 경우는 저희가 사용한 DART 파일에 데이터가 존재하지 않습니다. DART에서 다운 받은 파일 중 다른 파일에 존재할 것입니다.

그리고, 결과를 보면 SK의 항목명은 '영업이익(손실)'이라고 나오고 현대중공업지주는 항목명이 '영업이익'입니다. DART에서 받은 파일 자체에 항목코드는 같지만 항목명은 다르게 들어가 있는 경우입니다. 그렇기 때문에 우리는 항목코드를 사용해야 하고, 이와 같은 항목명은 나중에 클린징이 필요합니다.(우선은 그냥 사용합니다.)

 

 

위와 같이 영업증가액을 사용하면, 영업이익 금액 자체가 높은 우량 기업 위주로 조회가 됩니다. 이 방법도 좋지만, 영업이익 상승률을 확인해볼 필요도 있습니다.

아래와 같은 SQL로 2020년1분기에 영업이익이 100억 이상이면서 영업이익 상승률이 가장 높은 종목 Top-10을 찾아낼 수 있습니다.

SELECT  T1.회사명 
        ,T1.항목명
        ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
        ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
        ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가액
        ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가율
FROM    DB_DTECH.up_손익계산서_20211q T1
WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
AND     ROUND(T1.전기1분기3개월/1e8,1) >= 100
ORDER BY 영업이익증가율 DESC
LIMIT 10;
[결과]
회사명             항목명          당기1분기   전기1분기   영업이익증가액   영업이익증가율         
================== =============== =========== =========== ================ =============== 
다우기술           영업이익        3628.6      219.2       3409.4           16.6            
다우데이타         영업이익(손실)  3760.2      319.7       3440.5           11.8            
현대건설기계       영업이익(손실)  797.0       106.7       690.3            7.5             
씨젠               영업이익        1939.3      397.5       1541.8           4.9             
만도               영업이익(손실)  718.0       185.0       533.0            3.9             
케이씨씨           영업이익        773.5       205.9       567.6            3.8             
세아베스틸         영업이익(손실)  375.2       107.6       267.6            3.5             
아세아             영업이익(손실)  443.6       139.7       303.9            3.2             
한세예스24홀딩스   영업이익(손실)  441.4       141.4       300.0            3.1             
테스               영업이익        330.3       109.8       220.5            3.0  

 

이번에는 2020년1분기에 영업이익이 500억 이상인 종목 중에 2021년 1분기 영업이익 증가율이 높은 종목 Top-10을 찾아보겠습니다. 앞에 SQL에서 100억 이상 조건만 500억 이상으로 살짝 바꿔주시면 됩니다. 결과만 살펴보면 아래와 같습니다.

회사명                 항목명           당기1분기   전기1분기   영업이익증가액   영업이익증가율         
====================== ================ =========== =========== ================ =============== 
한화                   영업이익(손실)   8484.7      2964.3      5520.4           2.9             
아모레퍼시픽           영업이익         1762.4      609.4       1153.0           2.9             
아모레퍼시픽그룹       영업이익         1976.5      679.1       1297.4           2.9             
휠라홀딩스             영업이익(손실)   1835.7      671.4       1164.3           2.7             
삼성SDI                영업이익(손실)   1331.7      539.7       792.0            2.5             
포스코                 영업이익         15524.4     7052.5      8471.9           2.2             
삼성물산               영업이익(손실)   3025.8      1470.5      1555.3           2.1             
삼성전기               영업이익         3314.8      1662.7      1652.1           2.0             
카카오                 영업이익(손실)   1575.4      882.1       693.3            1.8             
한국타이어앤테크놀로지 영업이익         1860.2      1060.0      800.2            1.8    


마지막으로 2020년 1분기 영업이익 500억 이상이면서 영업이익 증가율이 Top-30 중에, 영업이익 증가액이 가장큰 Top-5만 조회하려면 아래와 같이 SQL을 작성하면 됩니다.

SELECT  T2.*
FROM    (
        SELECT  T1.회사명 
                ,T1.항목명
                ,ROUND(T1.당기1분기3개월/1e8,1) 당기1분기
                ,ROUND(T1.전기1분기3개월/1e8,1) 전기1분기
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) - ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가액
                ,ROUND(ROUND(T1.당기1분기3개월/1e8,1) / ROUND(T1.전기1분기3개월/1e8,1),1) 영업이익증가율
        FROM    DB_DTECH.up_손익계산서_20211q T1
        WHERE   T1.항목코드 = 'dart_OperatingIncomeLoss'
        AND     ROUND(T1.전기1분기3개월/1e8,1) >= 500
        ORDER BY 영업이익증가율 DESC
        LIMIT 30
        ) T2
ORDER BY T2.영업이익증가액 DESC
LIMIT 5;
[결과]
회사명        항목명           당기1분기  전기1분기  영업이익증가액   영업이익증가율          
============= ================ ========== ========== ================ ================ 
포스코        영업이익         15524.4    7052.5     8471.9           2.2              
한화          영업이익(손실)   8484.7     2964.3     5520.4           2.9              
SK하이닉스    영업이익         13244.2    8027.6     5216.6           1.6              
삼성전기      영업이익         3314.8     1662.7     1652.1           2.0              
삼성물산      영업이익(손실)   3025.8     1470.5     1555.3           2.1        

 

이상입니다.~!

위와 같이 데이터를 다루는 SQL을 이용해 주식을 분석하고 싶다면 아래 책을 추천합니다.~!

 

※ 주의 사항

  ▶ 절대 특정 종목을 추천하거나 투자를 권유하는 책이 아닙니다.

  ▶ 데이터 분석을 공부하기 위한 MySQL 책입니다.

  ▶ 책의 내용을 통해 얻은 종목에 투자해 발생한 손해는, 저를 비롯한 책 관계자 누구도 책임지지 않습니다.

※ 책 소개: 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=

 

 

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다.

오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다.

이후에는 데이터베이스화된 재무제표 데이터를 이용해 다양한 분석도 시도해볼 예정입니다.

1. DART 접속 및 사업보고서 확보

2021년 1분기보고서의 손익계산서를 다운로드하자. 2021년 1분기보고서에는 2021년 1월 1일부터 2021년 3월 31일까지의 재무 현황이 담겨 있다. 안타깝게도 해당 보고서는 1분기가 끝난 한참 후에나 DART에서 확인할 수 있다. DART의 접속 URL은 아래와 같다.

- http://dart.fss.or.kr/

DART의 접속해 아래와 같은 과정으로 2021년 1분기보고서의 손익계산서를 다운로드한다. [그림 1-1]을 참고한다.

1. DART 메뉴 상단의 '공시정보활용'마당 메뉴에 접속

2. '공시정보활용마당'의 좌측 메뉴에서 '재무정보 일괄다운로드'를 선택

3. 2021년을 선택한다.

4. 2021년 데이터 중에, '1분기보고서'의 '손익계산서'를 다운로드 한다.

[그림 1-1]

 

다운로드한 파일(2020_4Q_PL_20210422040118)의 압축을 풀어보면 아래와 같은 파일이 들어있다. (2021년 6월 18일 기준이다.)

  - 2021_1분기보고서_02_손익계산서_20210618.txt

  - 2021_1분기보고서_02_손익계산서_연결_20210618.txt

  - 2021_1분기보고서_03_포괄손익계산서_20210618.txt

  - 2021_1분기보고서_03_포괄손익계산서_연결_20210618.txt

위 파일들 중에, 2021_1분기보고서_03_포괄손익계산서_연결_20210618'만 데이터베이스에 올려볼 예정이다.

2. UPLOAD할 파일을 UTF-8로 변환하기

현재 DART에서 받은 파일은 ANSI 형태로 저장되어 있다. ANSI 형태 파일을 MySQL로 업로드하면 한글이 깨지는 문제가 있다. (환경에 따라 문제없을 수도 있다.) ANSI 형태의 파일을 UTF-8로 변환해 저장해야 한다. 여기서는 손익계산서 파일을 윈도우의 메모장(notepad)으로 열어서 인코딩을 UTF-8로 변환해 저장한다.

'2021_1분기보고서_03_포괄손익계산서_연결_20210618' 파일을 메모장으로 열어서 UTF-8로 변환해 저장한다. 저장할 때 업로드 하기 편하도록 파일명도 변경한다. ([그림 2-1]을 같이 참고한다.)

  - 2021_1분기보고서_03_포괄손익계산서_연결_20210618.txt

    1. 'UP_손익계산서_20111'로 파일명을 변경한다.

    2. 인코딩을 UTF-8로 변경한다.

    3. 확인을 눌러 저장한다.

[그림 2-1]

 

3. SQL Tool(DBeaver) 다운로드 및 접속하기

확보한 데이터 파일을 데이터베이스로 올리기 위해서는 DBMS와 SQL Tool이 필요하다. DBMS는 MySQL을 사용하고 SQL Tool은 DBeaver를 사용한다.

먼저 자신의 PC에 MySQL을 설치해야 한다. MySQL 설치는 아래 글을 참고하기 바란다.

  - https://blog.naver.com/ryu1hwan/222384349575

MySQL을 설치한 후에는 데이터베이스를 생성하고, 만들어진 데이터베이스에 테이블이라는 데이터 저장 공간을 만들어야 한다. 그리고, 테이블에 앞에서 UTF8로 변환해 저장한 파일을 올리게 된다.

데이터베이스와 테이블, 데이터에 대해 궁금하다면 아래 글을 참고하기 바란다.

  - https://blog.naver.com/ryu1hwan/222384222486

MySQL에 데이터베이스와 테이블을 생성하려면 SQL 툴을 사용해 명령을 내려야 한다. 이를 위해 DBeaver를 설치하도록 하자. DBeaver를 사용하는 이유는, 엑셀이나 CSV(콤마로 구분된 문서 파일) 파일을 데이터베이스로 올릴 때 유용하기 때문이다. 또한 DBeaver는 무료 버전이 있으며 다향한 DBMS에 접속하는 것도 가능하다. DBeaver는 아래 사이트에서 다운로드할 수 있다.

  - https://dbeaver.io/

DBeaver를 설치했다면 DBeaver로 MySQL에 접속하도록 하자. DBeaver를 설치했다면 DBeaver로 MySQL에 접속하도록 하자. DBeaver에 접속한 후에, SQL을 실행하기 위해서는 F3을 눌러 SQL Script 창을 열면 된다.

4. UPLOAD용 테이블 만들기

데이터를 업로드 할 때는, 업로드 전용 테이블을 만들어서 처리하는 것이 좋다. 실제 시스템에서 사용하는 테이블에 직접 업로드를 하면, 시스템 장애의 위험성도 있으며, 클린징되지 않은 데이터가 입력되어서 혼선을 일으킬 수 있다. 실제 운영 시스템에서 데이터 업로드를 해야 한다면 반드시 아래와 같은 과정으로 진행하기 바란다.

  1. 업로드용 임시 테이블 생성

  2. 파일을 업로드용 임시 테이블로 업로드 처리

  3. 업로드용 임시 테이블을 이용해, 잘 못된 데이터가 있는지 검토

  4. 검토가 완료되어 문제가 없다면, 임시 테이블의 데이터를 실제 테이블로 INSERT 처리한다.

테이블을 만들기 위해서는, 테이블을 생성할 데이터베이스를 먼저 생성해야 한다. DB_DTECH라는 데이터베이스를 생성한다. 데이터베이스를 만들기 위해서는 아래와 같이 CREATE DATABASE SQL을 사용하면 된다. DBeaver로 MySQL에 접속해 아래 SQL을 실행하면 된다.

CREATE DATABASE DB_DTECH;

 

 

SQL과 데이터 및 주식 분석에 대해 공부할 수 있는 '평생 필요한 데이터 분석' 책에서는 DB_SQLSTK 데이터베이스를 사용한다. DB_SQLSTK 데이터베이스를 이미 생성했다면 DB_SQLSTK 데이터베이스를 사용해도 된다. 하지만 DB_SQLSTK은 책의 실습을 위해 그대로 남겨두고 별도의 데이터베이스(DB_DTECH)를 만드는 것을 권장한다.

DB_DTECH 데이터베이스를 생성했으면 업로드용 임시 테이블을 만들 차례다. 업로드용 임시 테이블을 만들기 위해서는 다운로드한 파일을 열어서 어떤 컬럼들이 필요한지 살펴보아야 한다. '2021_1분기보고서_03_포괄손익계산서_연결_20210618' 파일을 엑셀로 열어 보자. 엑셀에서 첫 번째 로우의 필드명을 업로드용 임시 테이블의 컬럼으로 사용하면 된다. 결과적으로 아래의 SQL을 이용해 UP_손익계산서_2011Q 테이블을 생성하면 된다.

CREATE TABLE DB_DTECH.UP_손익계산서_20211Q
(
재무제표종류     VARCHAR(100) NOT NULL
,종목코드        VARCHAR(40) NOT NULL
,회사명          VARCHAR(100) 
,시장구분        VARCHAR(40)
,업종            VARCHAR(100)
,업종명          VARCHAR(100)
,결산월          VARCHAR(40)
,결산기준일      VARCHAR(40) NOT NULL
,보고서종류      VARCHAR(100)
,통화            VARCHAR(40)
,항목코드        VARCHAR(500) NOT NULL
,항목명          VARCHAR(500)
,당기1분기3개월  NUMERIC(18,2)
,당기1분기누적   NUMERIC(18,2)
,전기1분기3개월  NUMERIC(18,2)
,전기1분기누적   NUMERIC(18,2)
,전기            NUMERIC(18,2)
,전전기          NUMERIC(18,2)
,PRIMARY KEY(재무제표종류,종목코드,결산기준일,항목코드)
);

5. UPLOAD하기

이제 드디어 업로드 할 차례다. DBeaver의 DATA IMPORT(데이터 가져오기) 기능을 사용해 앞에서 만든 임시 테이블(UP_손익계산서_20211Q)에 'UP_손익계산서_20111'로 저장한 파일의 데이터를 가져올 예정이다.

[그림 5-1]과 같이 DBeaver의 좌측에 있는 Database Navigator에서 DB_DTECH의 Tables 폴더를 확장해보자. 새로 만든 UP_손익계산서_20211Q 테이블이 보일 것이다. 만약에 보이지 않는다면, DBeaver를 다시 접속하거나, Navigator 창에서 F5 키를 눌러 새로고침 해보기 바란다.

UP_손익계산서_20211Q 테이블에 마우스 우클릭을 하게 되면 팝업 메뉴가 나온다. 팝업 메뉴 중에 데이터 가져오기(DATA IMPORT)를 선택한다.

[그림 5-1]

 

[그림 5-2]와 같은 Data Transfer 창이 나오면, 'CSV에서 가져오기'를 선택하고 '다음' 버튼을 눌러 넘어가도록 한다.

[그림 5-2]

 

[그림 5-3]과 같이 테이블에 업로드할 파일을 선택하는 창이 나오면 앞에서 UTF로 저장한 'UP_손익계산서_20111'파일을 선택하도록 한다. 이때, DART에서 받은 파일의 확장자가 TXT로 되어 있어, 확장자를 CSV로 변경하지 않는다면 파일이 보이지 않는다. 그림과 같이 확장자를 TXT로 변경한 후에 UP_손익계산서_20111 파일을 선택하다.

[그림 5-3]

 

아래 [그림 5-4]와 같이 'Input File(s)' 창에서, 컬럼 구분자(Column Delimiter)에 '\t'(Tab)를 입력한다. DART에서 받은 파일이 컬럼(필드)을 탭(Tab)으로 구분하기 때문이다. 만약에 자신이 가지고 있는 파일의 컬럼 구분자가 콤마(,)라면 콤마를 입력해주면 된다. 컬럼 구분자를 탭으로 설정한 후에 다음을 누르도록 하자.

[그림 5-4]

 

[그림 5-5]와 같은 Tables Mapping 화면은 Source와 Target간에 컬럼을 매핑하는 화면이다. Source 테이블 쪽에 '>' 표시를 클릭해보면 컬럼간 매핑을 확인할 수 있다.

[그림 5-5]

 

[그림 5-5]에서 Source 쪽의 '>' 부분을 클릭한 후에 스크롤을 내려보면, 아래 [그림 5-6]의 좌측과 같이 일부 컬럼(당기 1분기 3개월~전기 1분기 누적까지)의 Mapping이 create로 되어 있는 것을 확인할 수 있다. DBeaver는 기본적으로 Source 파일의 필드명과 Target 테이블의 컬럼명을 비교해 같은 필드(컬럼)간에 매핑을 처리한다. 앞에서 테이블을 생성할 때, 파일의 "당기 1분기 3개월" 필드명은 "당기1분기3개월"과 같이 빈 칸(Space)을 제거해 테이블의 컬럼으로 만들어 놓은 상태다.

해당 매핑 화면에서 Mapping이 create로 된 항목은, Target쪽의 항목을 하나씩 클릭해 그림의 오른쪽과 같이 create가 existing이 되도록 테이블에 이미 있는 컬럼을 선택하기 바란다.

[그림 5-6]

 

여기까지 완료한 후, 나머지 화면에서는 '다음'과 'Start'를 선택해 업로드를 실행하면 된다.

업로드가 완료된 후에는 SELECT SQL을 통해 업로드한 데이터를 확인해보자.

SELECT  *
FROM    UP_손익계산서_20211Q;

 

[그림 5-7]

 

※ 책 소개: 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=

 

 

알락산더 엘더의 '주식시장에서 살아남는 심리 투자 법칙'이란 책을 열심히 읽고 있습니다.

이 책은 트레이더 관점에서 주식 매매를 어떻게 해야 하는지에 초점이 맞추어져 있습니다.

 

얼마나 빨리 많이 버는게 중요한게 아닌,

얼마나 오래 주식 트레이더로서 남아 있는지가 중요하다고 설명합니다.(매우 공감하는 부분입니다.)

그리고, 오래 살아 남기 위해서 알아야 할 것과, 조심해야 할 것들을 설명합니다.

 

주가 지표도 단순히 설명하는 것이 아니라,

상황따라 지표가 맞을 수 있음, 없음을 설명합니다.

예를 들어, 

추세추종지표(이동평균,MACD,방향성,거래량균형(OBV))는 시장이 움직일때 정확히 들어 맞는다고 합니다.

(시장도 추세를 타는 방향인 경우라는 건지는 더 읽어봐야 알겠네요.)

 

오실레이터는 횡보장에서 전환점 포착에 적절하지만, 시장이 추세를 보이면 성급하고 위급한 신호를 보낸다고 합니다.

 

이처럼, 지표를 무조건 사용하는 것이 아닌, 종목의 흐름, 시장의 흐름에 따라 사용해야 한다고 설명합니다.

 

제 투자 전략에 사용할만한 기법이 뭐가 있을까 살피면서, 꼼꼼히 정리하면서 읽고 있습니다.

특정 기업의 투자가 아닌 주식 매매로 접근하시는 분들께는 꼭 필요한 책이라 생각됩니다.

 

알라딘: 주식시장에서 살아남는 심리 투자 법칙 (aladin.co.kr)

 

주식시장에서 살아남는 심리 투자 법칙

금융시장에 ‘심리투자’라는 새로운 해법을 제시했던 알렉산더 엘더 박스의 《심리투자 법칙》 초판은 출간되자마자 월스트리트에서 화제의 중심에 섰으며, 전 세계 10개의 언어로 번역되었

www.aladin.co.kr

 

 

마지막으로 아래의 글이 기억에 남네요.

초보 트레이더는 미래를 예측하려고 한다. 프로는 예측하지 않는다. 황소와 곰의 힘을 비교하고 추세를 살피며 포지션을 관리한다.

 

 

Windows용 MySQL 8 설치 과정을 설명합니다.

 

아래 주소에서 Windows 버젼의 MySQL8 Community Server 버젼을 다운 받습니다.

(64bit 윈도우 사용자도 32bit 버젼을 받아서 설치하시면 됩니다.)

해당 버젼에는 MySQL에 접속해서 SQL을 실행할 수 있는 MySQL Workbench도 포함되어 있습니다.

https://dev.mysql.com/downloads/windows/installer/8.0.html

 

 

다음부터는 설치 화면입니다. 대부분 Next나 Execute를 눌러주시면 됩니다.

아래 사항만 주의해 주세요.

- 'Check Requirements' 에서 'Microsoft Visual C++ 2019 redi~'가 필요사항으로 되어 있으면, 정상적으로 설치가 되지 않습니다. 'Check Requirements'에서 'Microsoft Visual C++ 2019 redi~'를 선택한 후에 Execute를 누른후 해당 항목을 설치후 MySQL을 재설치하도록 해주세요.

 

1. Setup Type을 선택합니다.

- Developer Default로 해주세요.(Fig.1)

Fig.1 Setup Type 선택

 

 

2. Check Requirements

- 'Microsoft Visual C++ 2019 Redist..'가 없으면 MySQL을 제대로 설치할 수 없습니다.

- 'Microsoft Visual C++ 2019 Redist..'를 선택하신 후 Execute를 눌러 해당 항목을 다운받아 설치합니다.

- 'Microsoft Visual C++ 2019 Redist..'가 설치 된 후 MySQL 설치를 계속해 나갑니다.

Fig.2 Execute로 Microsoft Visual C++2019 Red...를 설치

 

 

Fig.3 - 위의 두 항목은 설치가 필요 없습니다.

 

 

Fig.4 - 일부 항목이 없어도 괜찮습니다. Yes로 넘어갑니다.

 

 

3. Installation

- Execute로 설치를 진행합니다.

- 모두 설치 된 후 Next버튼으로 넘어갑니다.

  (Connector/Python (3.7) 은 설치 안되어도 상관 없습니다.)

Fig.5 - Execute

 

4. Product Configuration

Fig.6 - Next

 

 

5. High Availabilty

- Next 눌러 주시면 됩니다.

Fig.7 - Next

 

 

6. Type and Networking

- 역시 Next 눌러주시면 됩니다.

- 여기서, Port가 3306으로 되어 있는걸 기억해 주세요.

- MySQL의 기본포트가 3306입니다.

- 필요에 따라 Port를 변경하셔도 됩니다.

Fig.8 - Type and Networking

 

 

7. Authentication Method

- 인증모드를 설정합니다. Use Strong Password가 기본입니다.

- 저 같은 경우 노트북에서만 사용할 것이므로 보다 편한 Use Legacy로 설정했습니다.

Fig.9 Authentication Method

 

8. Accounts and Roles

- Root의 Password을 설정합니다.

- 기억할 수 있는 Password로 설정해 주세요.

- 저는 1qaz2wsx를 사용했습니다.(좋은 방법은 절대 아닙니다.)

- 여기서 일반 사용자를 설정할 수도 있지만 넘어갑니다.

Fig.10 - Accounts and Roles

 

9. Windows Service

- Next를 클릭합니다

Fig.11 - Windows Service

 

10. Apply Configuration

- Execute 눌러주신 후 실해 완료되면, Finish 눌러주시면 됩니다.

Fig.12 - Apply Configuration

 

 

11. Connect To Server

- 계속 Next버튼을 누르시다, 아래 화면에서만 설정했던 Root의 Password를 입력해 Check 를 눌러주시고 Next로 넘어가면 됩니다.

Fig.13 Connect To Server

 

Fig.14 Connect To Server - Check

 

12. Apply Configuration

- Execute 누르신 후 Finish 누르시면 됩니다.

- 나머지 단계들은 모두 Execute나 Next 또 Finish 누르시면 됩니다.

Fig.15 - Apply Configuration

 

 

 

 

 

데이터를 활용하는 재테크, D-Tech!

오늘은 2차 전지 ETF를 살짝 살펴볼까 합니다. 원래는 21년 1월 13일 기준으로 정리해났던 내용인데 오늘에나 올리게 되었네요.

요즘 증시가 너무 불타오르고 있습니다. 그 중심에는 삼성전자, 현대차, LG전자와 같은 우량주들이 있지만, 2차 전지 관련주 역시 한 몫을 톡톡히 해내고 있습니다.

제 주변의 형님 한 분이 요즘 주가가 너무 올라서.. 이제 슬 빼서 2차 전지 ETF나 좀 들어가 볼까 하시길래... ETF를 한 번 살펴봤습니다. 제 개인적인 생각은 좀 늦은감이 있다 생각이 들었지만... 그건 누구도 알 수 없으니까요.

 

설명에 앞서, 이 글은 절대 어떤 종목을 추천하거나 투자를 권유하기 위한 글이 아닙니다. 투자에 참고용으로 사용하기 바라며, 데이터의 정확성 또한 보장하지 않습니다.(제가 1차적으로 확인은 하지만 확인 시점과 절차에 따라 오류가 있을 수 있습니다. 투자를 하신다면 반드시 최종 데이터는 본인이 확인해주시기 바랍니다.) 투자는 투자자 본인의 책임임을 항상 명심해주세요.

 

네이버 증권에 들어가서 2차 전지 관련 ETF를 조회해보면 아래와 같이 세 개가 나옵니다. (TIGER 2차전지 테마, KODEX 2차전지산업, TIGER KRX2차전지K-뉴딜)

 

종목 하나를 찍고 들어가서 'ETF분석' 탭을 클릭하면 해당 ETF에 자세한 정보를 볼 수 있습니다. 제가 관심을 갖고 있는건 2차 전지 ETF에 포함된 종목들입니다. 아래는 'TIGER 2차전지테마'의 예입니다.

CU당 구성종목을 보면 SK이노베이션, 삼성SDI, 포스코케미칼 등이 10% 이상으로 구성되어 있습니다. 여기서 'CU당'의 CU가 의미하는 바는 정확히 모르겠습니다. 어쨋든, ETF를 구성하는 종목의 비율임은 분명해 보입니다.

위와 같은 방법으로 세 개 ETF의 구성 종목을 모두 모아봅니다.

그리고, 국내 ETF 뿐만이 아니라 외국의 ETF도 좀 들여다 볼 생각입니다. 배터리 관련해서 유명한 외국의 ETF는 아래의 두 개가 있습니다.

 - Amplify Lithium & Battery Techn (BATT)

 - Global X Lithium & Battery Tech (LIT) 

 

외국 ETF의 구성 종목은 야후 파이낸스에서 확인할 수 있습니다. 모든 종목이 나오지는 않고 Top-10 종목만 나옵니다. Top-10이 많은 포지션을 차지하기 때문에 Top-10 종목만 알아도 될거 같습니다.

BATT의 구성 종목은 아래 URL에서 확인할 수 있습니다.

 - finance.yahoo.com/quote/BATT/holdings?p=BATT

 

Amplify Lithium & Battery Techn (BATT) Holdings - Yahoo Finance

View Top Holdings and Key Holding Information for Amplify Lithium & Battery Techn (BATT).

finance.yahoo.com

 

위 URL에 들아거서 Holdings 탭을 선택한 후에 아래로 내리다 보면 해당 ETF를 구성하는 Top-10 종목을 알 수 있습니다.

BATT ETF에는 우리나라의 LG화학과 삼성SDI가 자랑스럽게 포함되어 있는 것을 알 수 있습니다. 이 외에도 배터리 업체가 아닌 테슬라, BYD와 같은 전기 자동차 종목이 포함되어 있는 것도 눈에 뜁니다.

 

우리 나라 ETF 3개와 미국 ETF 2개에 포함되어 있는 종목들을 정리해 보니 아래와 같습니다. 네이버와 DART의 재무 정보를 이용해 당기 3분기(2020년), 전기 3분기(2019년)의 영업이익도 추가를 했습니다.

정리된 내용을 토대로 눈길이 가는 점을 정리해보면 아래와 같습니다.

 - 국내 ETF에서 가장 많이 담고 있는 종목은 SK이노베이션이다.

   : 반면에 외국 ETF에서는 담고 있지 않다.

 - 모두가 잘 아는 SK이노베이션, LG화학, 삼성SDI, 포스코케미칼이 국내 ETF내 많은 비중을 차지한다.

   : 곧 네 개 종목의 주가가 ETF의 큰 방향을 결정할거 같습니다.

 - KODEX 2차전지 산업 ETF는 '에코프로'를 많은 비중을 담고 있다.

   : 자회사인 에코프로비엠까지 고려하면 제법 많이 담고 있다 생각됩니다.

 - 영업이익이 10억도 되지 않는 종목들이 담겨져 있다.

   : 물론, 이는 중요하지 않을수도 있습니다. 개인적으로 이익이 나오는 회사를 선호하기 때문에 눈에 뜁니다.

 - 국내 ETF는 철저하게 배터리를 만드는 회사와 괸련 있는 종목만 있는거 같습니다.

   : 외국 ETF는 테슬라나 BYD와 같은 전기차 회사도 담고 있기 때문에 눈에 뜁니다.

   : 개인적으로 2차 전지 ETF가 국내 종목 뿐 아니라 외국 종목도 같이 담은 ETF면 재밌겠다 생각이 듭니다.

 

ETF를 들어가는것이 가장 편하고 안정적인 투자가 될 수 있겠지만.. 좀 더 공격적인 투자라면 위 ETF를 벤치마킹해서 자신만의 포트폴리오를 구성해보는 것도 좋을거 같습니다. 하지만.. 개인적으로 지금은 주가가 너무 높다 생각합니다.

마지막으로 개인적으로 이런 생각을 해봅니다. 2차 전지 관련주는 단기간에 급등을 했고, 앞으로 2차 전지가 많이 필요할 것은 너무나 자명해 보입니다. 그렇다면 2차 전지에 들어갈 주요 소재는 무엇이고 주요 소재의 가격은 지금 어느 위치에 있을까요.. 이 부분도 한 번 생각해볼 필요가 있을거 같습니다.

 

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

 

 

 

 

 

 

 

MySQL Workbench CE에서 SQL을 실행하다 보면 아래와 같은 에러가 나오는 경우가 있습니다.

 - Lost connection to MySQL server during query 30.000 sec

 

이는 Workbench에서 오래 걸리는 SQL을 자동으로 끊기 때문입니다.

Workbench의 설정을 변경해야 합니다.

 

Workbench 상단의 Edit 메뉴의 Preferences를 선택합니다. 아래와 같은 화면이 나옵니다.

 

SQL Editor 메뉴를 선택해, DBMS Connection read timeout interval(in seconds) 부분이 30으로 설정되어 있습니다. 이 부분을 999999로 늘려주시면 됩니다~!


SQL을 완벽히 배우는 방법 StartUP SQL!

StartUP SQL의 완전 무료 강의 노트를 오픈했습니다.(온라인 E-Book / ALL FREE ACCESS)

무료 영상 강의(자막 + 1.5배속 강추)


추가로, 제가 직접 만든 무료 MySQL 튜닝툴을 소개합니다.~

https://sweetquant.tistory.com/457

 

[StartUP Tuning]MySQL,MariaDB SQL 튜닝툴

MySQL과 MariaDB의 SQL 튜닝을 보다 간편하게 진행할 수 있는, SUT(StartUP Tuning)를 소개합니다. SUT는 실제 MySQL 튜닝을 전문적으로 수행하기 위해 직접 만들 툴입니다. 또한 MySQL,MariaDB의 성능 개선 교육

sweetquant.tistory.com

 

 

데이터로 하는 재테크 D-Tech!

오늘은 건설주를 살짝 들여다볼까 합니다. 어쩌다 보니 대우건설을 사게 되었는데 운좋게도 빠르게 수익이 나는 덕분에... 혹시 2021년은 건설붐인가 라는 생각이 들었습니다.

뉴스를 봐도 부동산 공급 물량이 부족하다고 합니다. 이는 앞으로 '부동산 공급을 많이 할거야'란 의미로 해석할 수도 있을거 같습니다. 그리고 부동산 물량 증가가 곧 건설주의 상승이 아닐까 생각이 듭니다. 이렇게 개인적으로 그냥 생각하고 '건설주를 사자'라고 결정할 수도 있겠지만... 투자를 위해서는 좀 더 데이터를 들여다 볼 필요가 있습니다.

 

설명에 앞서, 절대 어떤주를 추천하거나 어떤 종목이 어떻게 될거야라는 것을 주장하려는 것은 아닙니다. 데이터를 살펴보고 각자 생각을 해보심이 어떨까해서 올린 자료입니다.

 

먼저 팍스넷에서 건설 관련주를 추출해봤습니다. 상승테마 메뉴에서 '건설 대표주'를 확인해 보니 아래와 같이 여섯개의 종목이 나옵니다. 아래 부분의 '테마 히스토리'를 통해서는 건설 대표주 관련 주요 뉴스들을 확인할수도 있습니다. 좋네요~ (물론, 전 팍스넷과 아무 관련이 없습니다.)

 

위 건설 대표주에서 시가 총액 순으로 다 섯개 종목만 골라내면 삼성물산, 현대건설, GS건설, 대림산업, 대우건설이 나옵니다. 다섯 개 종목에 대해 '네이버 증권' 정보를 이용해 정리해보면 아래와 같습니다.

다섯 개 정도는 네이버 증권 정보에서 검색해보는건 전혀 어렵지 않죠. 네이버에서 사용한 정보는 19.3Q, 20.2Q, 20.3Q의 영업이익과 목표가입니다. 목표가는 다양한 증권사가 제시하는데 그중에 마지막으로 올라온 한 건만 사용했습니다. (이 부분도 여러 증권사의 평균을 사용하거나, 가장 큰 목표가를 제시한 증권사꺼를 사용하든가하는 다양한 방법이 있습니다. 여기서는 그냥 보이는 마지막꺼만 넣어봤습니다.)

 

데이터를 쑥 보니.. 시가 총액으로 보면 삼성물산이 압도적입니다. DART에 들어가서 삼성물산의 산업의 구성을 자세하게 들여다 보니, 건설, 상사, 패션, 리조트, 급식, 거기에 바이오까지 정말 다양한 포트폴리오를 가지고 있네요. 삼성물산은 너무 많은 업종을 하고 있으니 건너뛰어야 할거 같습니다.

 

현대건설의 최근 분기보고서(2020.3Q)의 '사업의 내용' 부분을 보면 아래와 같은 표를 볼 수 있습니다.  건축/주택 부분에서 많은 매출이 발생하는 것을 볼 수 있습니다.

GS건설도 분기보고서의 사업 내용을 살펴보면 아래와 같습니다.

 

GS건설 역시 건축/주택이 매출의 많은 부분을 차지하고 있습니다. 이는 집을 많이 지으면 건설주의 매출이 늘어나고 이는 주가의 상승으로 이어진다고 합리적으로 생각해 볼 수 있게 합니다.

 

그래서..'국토교통 통계누리'에 들어가서 주택 인허가 데이터를 살펴보기로 했습니다.(너무 집요한가요... 투자를 하려면 이처럼 집요해야하지 않을까요.)

 - 국토교통부 통계누리 (molit.go.kr)

 

국토교통부 통계누리

 

stat.molit.go.kr

 

해당 사이트의 상단에서 통계마당의 분야별 통계를 선택한 후에 아래와 같이 주택> 승인통계> 주택건설실적통계(인허가) > 부문별 주택건설 인허가실적(월별_누계)를 확인해 봤습니다.

 

저 같은 경우, 전체 데이터를 CSV로 내려서.. 데이터베이스에 올린 후에 SQL로 데이터를 정리했습니다. SQL을 배우고 싶으시면 아래로 고고고~!

sweetquant.tistory.com/category/MySQL%20%ED%80%80%ED%8A%B8%20-%20Book%20Version

 

'MySQL 퀀트 - Book Version' 카테고리의 글 목록

데이터와 함께하는 재밌는 세상

sweetquant.tistory.com

 

우선 년도별 주택 인허가 건수를 카운트해서 엑셀 차트로 그려보면 아래와 같습니다. 

2015년도에 가장 많이 인허가를 해주고.. 점점 줄어드는 것으로 보이네요... 참고로.. 2020년은 11월까지만 집계된 데이터입니다. 아직 12월 인허가 수는 올라오지 않았더군요...

흠... 아직까지 주택 공급을 늘리기 위해 인허가를 해주고 있는거 같진 않습니다. 내년에 많이 인허가 해준다는 건가요.... 

정책적인거나 정치적인건 제가 잘 모르겠고.. 어쨋든... 위 데이터로는 인허가는 줄어들고 있는 추세로 보입니다

 

주택 인허가수와 건설주 합쳐서 차트로 그려보면 어떨까요? 주택 인허가가 주가와 관련이 있을까?... 합리적으로 의심해 볼수 있으니까요. 아래와 같습니다.

주택 인허가수와 함께 현대건설, GS건설 두 종목만 주가를 같이 표시해봤습니다. 2015년에 가장 많이 인허가를 해줬는데. 그 부분이 주가를 끌어 올린 흔적이 보이거나 하는건 같진 않습니다. 

금융위기 이전, 북경 올림픽 이전인 2008년에 건설주는 최고가를 찍고 계속 하향 추세였습니다. 코로나 저점을 찍고 반등을 해서 상승 방향으로 방향을 돌려 놓은거 같긴 하지만... 다른 종목군에 비하면 얼마나 좋을지는 짐작이 잘 되지 않습니다. 뚜렷하게 오를거야라고 생각되지는 않네요.

 

현대건설하고 삼성전자 주가를 최대한 그려서 비교해보면 아래와 같습니다. 현대건설을 건설 대표주로 가정하고. 상승구간을 살펴보면, 2007년 상승 구간은 중국 특수가 아니었을까 생각합니다. 2008년 북경 올림픽 전만해도 중국과의 사이도 좋았으니까요.(제 개인적인 생각입니다. 정확한건 해당 시점에 매출액 구성을 봐야 알 수 있겠죠.) 그리고 해당 구간은 2008년 금융위기 전이라 증시도 활황이었던거 같습니다. 2018년초에 잠깐 솟아 오른 경우는.. 남북경협으로 떠들썩 했던 구간인거 같습니다.

지금까지 쭉 살펴봤을때.. 결론은 삼성전자...네요..ㅜㅜ

건설주가 2021년에 어떻게 될지는 각자 생각해보셨으면 합니다. 그리고... 최근에 증시에 유행하는 말처럼... 이와 같이 아무리 분석해봤자... 'GS자이가 아파트가 이뿌네'라고 생각하고 GS건설을 사는 것이 수익률이 더 좋을수도 있습니다.ㅠㅠ

 

읽어주셔서 감사합니다.~!

 

이와 같은 분석은 데이터베이스를 구축해 SQL을 활용한다면 훨씬 더 쉽고 강력하게 처리할 수 있습니다.

SQL과 주식에 관심이 있다면 아래 책을 참고해주세요.

※ 주의 사항

  ▶ 절대 특정 종목을 추천하거나 투자를 권유하는 책이 아닙니다.

  ▶ 데이터 분석을 공부하기 위한 MySQL 책입니다.

  ▶ 책의 내용을 통해 얻은 종목에 투자해 발생한 손해는, 저를 비롯한 책 관계자 누구도 책임지지 않습니다.

※ 책 소개: 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=

 

 

 

 

 

 

데이터로 하는 재테크! D-Tech입니다.

2021년 연초부터 증시가 불을 뿜네요. 이와 같은 우량주 대상승을 본 적이 없어 후들후들합니다.

 

주변에서, 증시가 활황이면 증권주를 사라는 말을 들어보셨을 겁니다. 그래서 오늘은 증권주를 살짝 들여다보겠습니다.

종목을 분석하는 다양한 방법이 있지만, 여기서는 간단하게 팍스넷과 엑셀만 사용합니다.(저는 팍스넷과 전혀 관련 없습니다.) 

설명에 앞서, 이 글은 투자를 권유하거나 특정 종목을 추천하려는 글이 아닙니다. 데이터를 이와 같이 분석할 수 있음을 알려드리고 싶은 글입니다. 또한 이 글에 나온 종목에 투자해 발생한 손해는 투자자 본인의 책임임을 명심하시기 바랍니다.

 

팍스넷에 접속해 '종목입체분석 > 상승테마' 메뉴에 들어가 '증권' 테마를 찾은 후 아래와 같은 설정으로 데이터를 조회합니다.

 - 현잭, 등락률, 시가총액(억), PER(배), 매출액증가율, 영업이익률 선택

 - 선택 조건 검색 클릭

 - 기간누적을 120일로 선택

 

 

팍스넷에 접속해 증권주를 검색한 결과를 카피해서 엑셀로 정리해보면 아래와 분석을 할 수 있었습니다. (팍스넷 데이터이기 때문에, 엑셀로 가공된 자료를 올리는 건 좀 문제가 있을까 싶어, 정리된 그림으로만 올렸습니다.)

팍스넷에서 증권 테마로 조회되는 종목은 위와 같이 22개가 조회됩니다. 위와 같은 데이터를 무료로 조회할 수 있고... 팍스넷에 정말 감사합니다.

 

보기 좋게, 각 항목별로 Top-3 종목에는 노란색으로 채워 났습니다.

예를 들어, 한국금융지주의 경우 시가 총액도 Top-3에 들어가고 영업이익률까지 Top-3에 들어갑니다. 다만, 기간등락률

(120일) 역시 Top-3에 들어감므로 이미 많이 올랐다고 생각할 수도 있습니다. (그러나 오른 종목은 계속 오른나는 말도 있죠.) 한국금융지주의 경우 개인과 기관의 120 일간 매수세도 Top-3에 들어갑니다. 그만큼 외인은 많이 팔았지만.. 요즘 대세는 외인보다는 개인이니까요.. 이 부분도 고민해볼 필요가 있겠네요.

 

참고로 제가 가지고 있는 증권주는 NH투자증권인데... 위 데이터로는 형편없네요. ㅋㅋㅋㅋ

위의 데이터만 보고, 어떤 종목을 사야겠다 결정할 수는 없겠죠. 어쨌든... 증권주 투자에 참고는 해볼 만하다고 생각합니다.

 

팍스넷 데이터를 사용해 위와 같이 데이터를 정리하고 싶다면 아래 글을 참고해주세요~!

sweetquant.tistory.com/195

 

위험천만 테마주와 알찬 팍스넷

데이터로 하는 재테크 D-Tech. 오늘은 제목을 좀 재미있게(?) 뽑아봤습니다. 이 글은 테마주에 투자를 추천하는 글이 절대 아닙니다. 여기서 이야기하는 테마는 갑작스러운 또는 너무도 불확실한

sweetquant.tistory.com

오늘은 바빠서 짧게 쓰고 도망갑니다.~!

다들 성투하시길~!

 

SQL과 주식에 관심이 있다면 아래 책을 참고해주세요.

※ 주의 사항

  ▶ 절대 특정 종목을 추천하거나 투자를 권유하는 책이 아닙니다.

  ▶ 데이터 분석을 공부하기 위한 MySQL 책입니다.

  ▶ 책의 내용을 통해 얻은 종목에 투자해 발생한 손해는, 저를 비롯한 책 관계자 누구도 책임지지 않습니다.

※ 책 소개: 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=

 

 

 

 

요즘 '듀얼 모멘텀 투자 전략'이라는 책을 틈틈히 보고 있습니다. 게리 안토나치 저에, 서태준님, 강환국님이 번역한 책입니다. 부지런하지 못해서 아직도 초반부 읽는 중인데, 저에게는 재밌고 흥미진진합니다.

책에는 간단히 모멘텀을 설명하면 '한 방향으로 움직이기 시작하면 계속 그 방향으로 나아가려는 주식 시장의 움직임'이라고 되어 있습니다.

말 그대로 오르는 주식은 계속 오르고, 내리는 주식은 계속 내린다는 간단하면서도 일리있는 내용입니다. 곰곰히 생각할수록 일리 있는데도, 따르기 쉬운 방법은 아닙니다.

 

책은 아직 다 읽지 못했지만. '모멘텀'이라는게 과연 우리나라 시장에서 얼마나 효과적일까..란 고민으로 데이터를 좀 두둘겨 봤습니다. 복잡하게 생각하지 않고. 간단하게 모멘텀 관련 ETF를 보면 되지 않을까란 생각으로 접근했습니다.

 

설명에 앞서. 절대 어떤 이론이 맞다 틀리다를 논하려고 하는 것이 아닙니다. 그리고 어떤 ETF를 추천하거나 문제가 있다라고 말하려는 것도 아닙니다. 모멘텀 관련 ETF에 이런것들이 있고, 흐름은 이렇다라는 현상만 설명하고 싶을 뿐입니다. 절대 어떤 투자를 권유하는 글이 아님을 명심해주시기 바랍니다.

 

 

먼저 네이버에 접근해서 금융 정보에서 '모멘텀'이라고 검색어를 입력합니다. 아래와 같은 모멘텀 관련 ETF들을 검색할 수 있습니다. 명칭에 '모멘텀'이 있다고 무조건 모멘텀 전략 ETF는 아닐 수도 있습니다. 아마도.. 모멘텀 관련일것이라는 합리적인(?) 의심으로 접근했습니다. 혹시라도 모멘텀 전략 ETF가 아닌걸로 아는 부분이 있으면 알려주세요.

위 ETF 종목 중에 하나를 찍고 들어가면 ETF에 구성된 종목이 무엇인지도 알 수 있습니다. 투자 아이디어에 도움이 되리라 생각합니다. TIGER 모멘텀을 확인해 보니, LG전자와 종근당, 삼성전자 등을 담고 있습니다.

 

네이버 증권 정보에서 모멘텀 관련 9개의 ETF를 검색할 수 있었습니다.이 ETF들이 코로나 저점 대비해서 얼마나 올랐는지와, 코스피 대표 종목으로 구성된 코덱스200 ETF랑 비교를 해보려고 합니다. 모멘텀 ETF들이 코스피 대표 종목들을 상화하는지 알고 싶기 때문입니다.

안타깝게도.. 결과는 아래와 같이 코덱스200과 큰 차이가 없습니다.

코로나 저점 대비 코덱스 200이 102%올랐는데, 모멘텀 ETF들도 거의 비슷한 수준입니다.

코로나 이후로 한정해 비교해서 별 차이가 없나 생각이 들기도 합니다. 그렇다면 더 과거의 데이터도 살펴봐야 할거 같습니다.

 

'코덱스 MSCI모멘텀'과 코덱스200을 비교해봤습니다. 아래와 같습니다.

MSCI 모멘텀이 파란색이고, 수치의 축은 왼쪽입니다. 코덱스200은 빨간색에 수치 축은 오른쪽입니다. 움직임을 비교해보면 거의 비슷합니다. 오히려 코덱스 200이 좀 더 좋아 보입니다. 아마도, 우리나라 환경이 대형주, 우량주 몇개가 전체 지수를 움직이는 경우가 크기 때문이 아닐까 생각해 봅니다.

 

그래서.. 중소형주 관련 모멘텀 ETF인것 같은.. 'KBSTAR 중소형 모멘텀밸류'하고 코덱스200도 비교해 봤습니다. 아래와 같습니다.

마찬가지로 중소형모멘텀도 코덱스200보다 월등히 하는 모습은 보이지 않습니다. 오히려 코덱스200보다 좋지 않아 보입니다.

 

이러한 차트로 얻은 결론은... 모멘텀 ETF가 뭔가.. 확실한 우위를 보여주는건 아직 없구나... 느낌입니다.

그렇다고 모멘텀 전략이 잘못되었다고 생각하지는 않습니다. ETF 운영에 문제가 있다고 생각하지도 않습니다.

각자 다양한 입장과 상황이 있겠죠. 개인적으로도 모멘텀을 지지하고, 모멘텀에 대해서는 연구를 더 해볼 생각입니다.

 

위와 같은 분석을 하기 위해서 파이썬을 이용해 주가 데이터를 가져오는 과정과, 엑셀의 VLOOKUP 작업을 했습니다.

아래 글들을 참고해주세요. 감사합니다.~!

sweetquant.tistory.com/207

 

EXCEL 기본편 - VLOOKUP

오늘은 엑셀 함수인 VLOOKUP을 다뤄볼까 합니다. D-Tech 관련된 글을 적으면서 엑셀의 VLOOKUP을 사용하는 경우가 많기 때문에 VLOOKUP만 별도로 한번 다루는 것이 좋다고 생각했습니다. 먼저 엑셀의 VLOO

sweetquant.tistory.com

sweetquant.tistory.com/209

 

파이썬 기본편 - 특정 종목의 주가 정보 가져오기

저는 데이터 분석을 위해 SQL을 반드시 배우라고 떠들고 다닙니다. 이와 함께 미는 언어가 하나 더 있습니다. 바로 파이썬입니다. 파이썬은 데이터를 분석하고 다루기 위해 연구하고 공부할 매력

sweetquant.tistory.com

 

 

저는 데이터 분석을 위해 SQL을 반드시 배우라고 떠들고 다닙니다. 이와 함께 미는 언어가 하나 더 있습니다. 바로 파이썬입니다.

파이썬은 데이터를 분석하고 다루기 위해 연구하고 공부할 매력있는 언어입니다.

파이썬을 처음 접한게 2016년 말이었습니다. 주식 데이터를 어떻게 분석할까 헤매이다 접하게 되었습니다. 그때 든 생각은.. '아.. 파이썬은 개발자는 물론 비 개발자 직군에도 필요한 언어가 되겠구나'였습니다. 아니나 다를까 현재 일부 회사의 경우 비 개발자도 파이썬을 배우게 하고 시험도 보는 경우가 있습니다. 저 역시 좀 더 파이썬 공부에 열을 올려볼까 생각하고 있습니다.

 

주식을 분석하기 위해서 필요한 기본적인 정보 두가지는 재무 정보와 주가(가격) 정보입니다.

오늘은 일별 주가 정보를 파이썬을 이용해 얻는 방법을 소개합니다.

일별 주가 정보를 얻는 다양한 방법이 있지만, pandas_datareader를 사용합니다. 그리고 얻은 주가 정보를 엑셀 파일로 저장하는 기능까지 구현합니다.

 

제가 개발한 환경은 아래와 같습니다. 반드시 아래와 같은 환경이 아니어도 됩니다.

 - Anaconda 3.1

 - Pycharm

 

아나콘다는 파이썬에 많이 쓰는 모듈을 모아 놓은 파이썬 버젼이라 생각하시면 됩니다. 그리고 파이참은 개발을 편하게 해주는 개발툴입니다. 반드시 이와 같이 환경을 구성할 필요는 없습니다. 그냥 파이썬만 다운받아 하셔도 됩니다.

 

여기서는 파이썬 프로그램 파일명을 "SIMPLE_STOCK_HISTORY.py"로 했습니다. 간단한 주가 이력 가져오기 정도의 의미입니다. 먼저 아래와 같이 필요한 모듈을 Import합니다.

import datetime
import time
from pandas_datareader import data as pdr

 

필요한 모듈을 Import 한 후에, 아래와 같이 getHistory라는 특정 종목의 주가 정보를 오늘자까지 가져오는 함수를 구현합니다.

def getHistory(_code,_excelSaveYN):
    start = datetime.datetime(2000,1,1)
    end = datetime.datetime(int(time.strftime("%Y")),int(time.strftime("%m")),int(time.strftime("%d")))
    print(start, end)

    history =pdr.get_data_yahoo(_code,start)
    print(history)

    if _excelSaveYN == 'Y':
        saveExcel(_code,history)

 

getHistory와 _code와 _excelSaveYN이라는 변수를 넘겨 받습니다. _code는 종목코드이고 _excelSaveYN은 엑셀 저장 여부입니다.

start에 주가 정보를 가져올 시작 시점을 입력하고, end에는 오늘 일자를 입력합니다. pdr.get_data_yahoo를 사용해 주가 정보를 바로 가져옵니다. _excelSaveYN이 Y면 엑셀 저장을 처리합니다.

 

아래는 엑셀 저장 함수 소스코드입니다. 저장하는 엑셀의 파일명은 _code명에 오늘의 날자를 더해서 구성합니다.

def saveExcel(_code,_history):
    file_nm = _code + '_' + time.strftime("%Y%m%d%H%M%S") + '.xls'
    print(file_nm)
    _history.to_excel(file_nm)

 

최종 소스코드는 아래와 같습니다.

import datetime
import time
from pandas_datareader import data as pdr

def getHistory(_code,_excelSaveYN):
    start = datetime.datetime(2000,1,1)
    end = datetime.datetime(int(time.strftime("%Y")),int(time.strftime("%m")),int(time.strftime("%d")))
    print(start, end)


    history =pdr.get_data_yahoo(_code,start)
    print(history)

    if _excelSaveYN == 'Y':
        saveExcel(_code,history)

def saveExcel(_code,_history):
    file_nm = _code + '_' + time.strftime("%Y%m%d%H%M%S") + '.xls'
    print(file_nm)
    _history.to_excel(file_nm)

if __name__ == "__main__":

    getHistory('005930.KS','Y') #코스피는 .KS, 코스닥은 .KQ

 

위 소스를 실행하면 해당 소스코드가 있는 폴더에 아래와 같이 주가 정보를 가져온 엑셀이 만들어 집니다.

 

오늘은 여기까지입니다. 모두 파이썬 한 번 접해보시길 바랍니다~!

 

 

SQL과 주식에 관심이 있다면 아래 책을 참고해주세요.

※ 주의 사항

  ▶ 절대 특정 종목을 추천하거나 투자를 권유하는 책이 아닙니다.

  ▶ 데이터 분석을 공부하기 위한 MySQL 책입니다.

  ▶ 책의 내용을 통해 얻은 종목에 투자해 발생한 손해는, 저를 비롯한 책 관계자 누구도 책임지지 않습니다.

※ 책 소개: 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