퀀트투자 - DB에서 날짜 가져와서 PBR x DPS 조건으로 종목 고르기(SQL 특정 조건 가져오기)
본문 바로가기
파이썬으로 만든 것들/퀀트투자

퀀트투자 - DB에서 날짜 가져와서 PBR x DPS 조건으로 종목 고르기(SQL 특정 조건 가져오기)

by Squat Lee 2022. 10. 1.

여태까지 투자 실험을 한 내용을 요약해 보겠다.

 

PBR x DPS를 기준으로 20 종목을 선정한 뒤 월별로 수익률을 분석했다.(물론 그 전에 여러 조건으로 수익률을 분석한 적이 있지만, 이런 세부적인 부분은 설명이 길어지니 생략하겠다.) 

 

pykrx 라이브러리를 사용해서 데이터를 가져오고, 백테스트를 하다보니 KRX 홈페이지에 차단되는 일이 발생했다. 그래서 데이터를 일일이 받아서 DB에 저장했다. 그리고 다시 백테스를 해 보려고 한다.

 

df = pd.read_sql("SELECT * FROM ...", con) 로 전체 데이터를 다 가져오니 시간이 생각보다 오래걸렸다. sqlite3를 처음 사용해보고 SQL 사용법을 모르니 생각보다 쉽지 않았다.

 

그래도 내 친구 Google이 쉽게 방법을 알려주어서 이번에도 쉽게 문제를 해결했다.

 

'WHERE' 이라는 문장을 하나 쓰면은 내가 필요한 데이터만 가져올 수 있다는 사실을 알게되었다. 이렇게 하나씩 무언가를 알아 가는 과정이 제법 재미있는 것 같다.

 

아래와 같이 코드를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sqlite3
import pandas as pd
 
#전역변수 선언
global df_data
global date_list
 
con = sqlite3.connect('krx_data.db')
df_dates = pd.read_sql("SELECT * FROM dates", con)
date_list = df_dates['일자'].to_list()
 
date = '20030103'
 
df = pd.read_sql("SELECT * FROM fundamental WHERE 일자==" + date, con)
print(df)
cs

2가지를 DB에서 가져왔다. 첫번째는 영업일을 가져와서 List로 만들었다. 

 

특정 시점에 투자를 한다는 가정하에 조건에 맞는 20개 종목을 선정 후 백테스트를 해서 일자별로 수익률을 확인하고 싶어서 일단 날짜를 List로 만들었다.

 

두번째 항목은 내가 원하는 날짜만 DB에서 가져와서 'df'라는 데이터프레임 변수에 저장했다.

날짜를 임의로 지정해서 결과가 잘 불러오는지 확인했다. 잘 작동한다.


이어서 투자종목을 고르는 함수를 만들어 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 투자 종목 고르기
def row_pbr_dps(date):
 
    df = pd.read_sql("SELECT 일자, code, 종목명, 종가, 거래량, 상장주식수, PBR, DPS "
                     "FROM fundamental WHERE 일자==" + date, con)
    df = df.set_index('code')
 
    df = df[df['PBR'> 0#PBR이 0이상만 구하기
    df['pbr_rank'= df['PBR'].rank()
 
    df = df[df['DPS'> 0#DPS 0이상만 구하기
    df['dps_rank'= df['DPS'].rank()
 
    df['pbr_dps'= df['pbr_rank'+ df['dps_rank']#pbr 순위와 dps 순위를 더하기
    df['pbr_dps_rank'= df['pbr_dps'].rank()#더한 PBR, DPS 순위의 순위 매기기
    df = df.sort_values(by='pbr_dps_rank'#pbr_dps_rank의 숫자가 낮은 순으로 정렬하기
 
    df = df[df['거래량'> 0#거래량이 0 이상인 종목만 구하기
    df = df.iloc[:20#20개 종목만 구하기
    df = df[['종목명''종가''상장주식수']] #컬럼이 많으면 복잡하니깐, 3개만 표시
 
    print(df)
    return df
 
row_pbr_dps(date)
cs

PBR x DPS 조건으로 거래량이 0 이상인 항목만 20개 골랐다.

 

결과가 잘 나왔다.

 

이제 특정일에 주식을 사서 일 단위로 수익률을 분석한 후 1년동안 최대 수익(손실)과 최저 수익(손실)을 구해야 한다.

 

pykrx를 사용했을때는 월마다 했기에 무리없이 코드를 작성할 수 있었는데, 이제 DB에서 가져와야 하니 날짜를 어떻게 해야 자동으로 백테스트가 되나 고민이 필요할 것 같다.

 

조금씩 고민하면서 코드를 작성하는 수 밖에 없을 것 같다.

 


코딩을 할 수록 기본기가 약하다는 사실이 느껴진다. 예를들어 List나 듀플을 만들때도 항상 구글링을 하게된다. 그 뿐만 아니라 코드 하나하나 바로 작성이 되지 않아서 검색하며 작성 하다보니 시간이 꽤 많이 걸린다.

 

판다스도 몇 번을 공부하고, 찾아봤지만 아직도 사용법이 익숙치 않다.

 

다행인 점은 내가 이렇게 검색하느라 시간이 걸리는 작업이 하나도 지루하지 않고 재밌다는 사실이다.

 

내 두뇌의 암기력은 좋지 않다는 사실은 초등학교 시절부터 익히 알고 있어서 익숙하다. 그래서 매번 구글링을 하며 사용해도 마치 머리속에 지우개가 있는 것 처럼 매번 새롭게 느껴진다. 

 

하지만, 괜찮다. 내가 재미있어 하니깐. 재미있으니깐 회사에서 야근하고 늦게 집에 오더라도 코딩을 할 수 있는 것이고, 주말에도 이렇게 앉아서 블로그에 기록을 남길 수 있는 것이다.

 

누군가 얘기한다. 너 지금 하는거 아무런 소용이 없으면 어떻할래? 그 시간에 차라리 딴걸 하는게 어때?

 

나는 괜찮다. 결과가 좋지 안하도 괜찮다. 왜냐하면, 내가 이걸 하는 동안에 이미 재미를 느끼고 있으니 그거면 됐다.   

 

728x90
반응형

댓글