본 포스트는 퀀트투자를 위한 개인적인 백테스트 기록이며, 테스트 과정이 올바르게 진행되었다는 어떠한 증명도 할 수 없음을 알려드립니다. 본 포스트를 참고하셔서 투자를 하는 행위는 삼가하여 주시기 바랍니다.
지난 포스트에 이어서 NCAV를 이용해서 백테스트 한 파이썬 코드 기록이다.
개념은 간단하다. NCAV가 "유동자산 - 총부채 > 시가총액" 조건이기 때문에 3가지 수치만 가져오면 된다. 어떻게...
나는 IT 업계에서 일하는 사람이 아니다. 당연히 파이썬도 독학으로 배운지 1년 정도 되었다. 그리고 금융관련 지식이라곤 재테크 책 몇 권 읽은것이 전부다.
이렇게 간단한 조건을 어렵게 생각하는 내가 과연 파이썬 코드로 구현할 수 있을지 너무나 내 자신에 대해 의구심이 가득했지만, 결과적으로는 만들었다. 당연히 오류도 좀 있겠지만, 만든것 자체만 봤을때는 나 스스로 자랑스럽다.
유동자산, 총부채는 fnguide에서 예전에 다운받은 데이터를 이용할 예정이다. 마침 2011년부터 2019년까지 자료를 가지고 있었다.(예전에는 무료로 fnguide 게시판에서 다운로드가 가능했지만, 이제는 더이상 제공하지 않는다. 개인적으로 아쉽다.)
'시가총액'은 krx 에서 가져올 예정이다. 어느 친절한 천재분이 pyxkrx 모듈을 만들어 놓으셔서 코드를 구현하기가 너무 쉬워졌다. 누군지는 모르겠지만, 그 분께 상당히 감사한 마음을 느낀다.
pykrx를 사용하다가 IP가 차단되거나 문제가 발생할 수 있으며, 그 책임은 사용자 본인에게 있으니 참고하시기 바랍니다.
우선 필요한 모듈부터 불러오겠다.
import pandas as pd
from pykrx import stock
생각보다 쓰는 모듈이 많지 않다. pykrx는 위에 설명을 했고, 판다스는 테이블 형태를 편하게 계산하고 형태를 바꾸고 하기 위해 필요하다.
가끔 내가 만든 코드에 대해서 되니 안되니 질문을 댓글로 하시는 분들이 계신다. 포스트의 서두에서도 말 했듯이 내 필요에 의한 기록이다. 당연히 코드는 계속 바뀌고 포스트는 업데이트 하지 않는다.
한마디로 불친절한 블로그 포스트다. 어차피 나의 금쪽같은 시간 내서 질문에 답해주고 알아봐줘봤자 고맙단 말 한마디 하지 않고, 광고 한번 클릭해 주지 않는데 굳이 내가 친절할 필요가 있겠는가?
그냥 참고만 하시고, 되도록 질문은 하지 마시기 바란다. 마음에 안 들면 친절한 다른 블로그를 찾아 보시길 바란다.
이번 코드는 내가 봐도 너무 무식하게 만든 것 같다.
date0 = '20160603' #투자 1년 전
date = '20170605'#투자날짜 입력, 연간실적 발표(5/E)이후 가능
date2 = '20180605'#투자 1년 후
날짜는 3개로 나누었다
file = r'C:\Users\passi\Desktop\실적데이터\2016.xls'
df = pd.read_excel(file)
df = df[['코드', '회사명', '유동자산' ,'부채총계']] #raw data 컬럼명 입력
df.columns = ['code', '종목명', '유동자산', '부채']
df = df.dropna()
파일을 가져온 후 데이터프레임을 만들고 필요한 항목만 가져왔다. 그리고 결측치 처리를 했다.
f['code'] = df['code'].apply(lambda x : x[1:7])
df = df.set_index(df['code'])
df = df[['종목명', '유동자산', '부채']]
df['유동자산'] = df['유동자산'].apply(lambda x : x * 1000000)
df['부채'] = df['부채'].apply(lambda x : x * 1000000)
fnguide에서 가져온 데이터는 종목코드가 "A000000"이런식으로 되어 있다. krx는 "000000" 이렇게 숫자로 6자리로 되어 있다. 어차피 종목코드가 인덱스가 되기 때문에 서로 일치시켜야 한다.
전체 코드는 아래와 같다.
여러 데이터를 가지고 쓰려면은 반복문을 써서 코드를 좀 수정해야 될 것이다.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import pandas as pd
from pykrx import stock
date0 = '20160603' #투자 1년 전
date = '20170605'#투자날짜 입력, 연간실적 발표(5/E)이후 가능
date2 = '20180605'#투자 1년 후
file = r'C:\Users\passi\Desktop\실적데이터\2016.xls'
df = pd.read_excel(file)
df = df[['코드', '회사명', '유동자산' ,'부채총계']] #raw data 컬럼명 입력
df.columns = ['code', '종목명', '유동자산', '부채']
df = df.dropna()
df['code'] = df['code'].apply(lambda x : x[1:7])
df = df.set_index(df['code'])
df = df[['종목명', '유동자산', '부채']]
df['유동자산'] = df['유동자산'].apply(lambda x : x * 1000000)
df['부채'] = df['부채'].apply(lambda x : x * 1000000)
df_f = stock.get_market_fundamental_by_ticker(date) #PER, PBR, DIV,...
df_c = stock.get_market_cap_by_ticker(date) #시가총액, 종가
df_t = pd.merge(df, df_c, left_index=True, right_index=True)
df_t = pd.merge(df_t, df_f, left_index=True, right_index=True)
df_t['ncav'] = df_t['유동자산'] - df_t['부채'] - df_t['시가총액']
df_t = df_t[df_t['ncav'] > 0]
df_t = df_t[df_t['PBR'] > 0.2]
df_c0 =stock.get_market_cap_by_ticker(date0) #시가총액, 종가
df_c0 = df_c0[['종가', '상장주식수']]
df_c0.columns = ['1년전 종가', '1년전 상장주식수']
df_c2 =stock.get_market_cap_by_ticker(date2) #시가총액, 종가
df_c2 = df_c2[['종가','거래량', '상장주식수']]
df_c2.columns = ['1년후 종가', '1년후 거래량', '1년후 상장주식수']
df_t = pd.merge(df_t, df_c0, left_index=True, right_index=True)
df_t = pd.merge(df_t, df_c2, left_index=True, right_index=True)
df_t['1년전 주식수 변화'] = df_t['상장주식수'] - df_t['1년전 상장주식수']
df_t['수익'] = df_t['1년후 종가'] - df_t['종가']
df_t['주식수 변화'] = df_t['1년후 상장주식수'] - df_t['상장주식수']
df_t['수익률'] = df_t['수익']/df_t['종가']
save_path = 'C:\\Users\\passi\\Desktop\data\\NCAV백테스트' + date +'.xlsx'
df_t.to_excel(save_path)
print(df_t)
|
cs |
'파이썬(Python) > 퀀트투자' 카테고리의 다른 글
퀀트투자 백테스트 - 저 PBR 20종목 (All Market) (0) | 2021.11.01 |
---|---|
퀀트투자 백테스트 - 저 PBR 20종목 VS 30종목 승자는? (0) | 2021.10.28 |
퀀트투자 백테스트 - 저 PBR 투자 수익률 (0) | 2021.10.26 |
퀀트투자 백테스트 - 워런버핏이 큰 돈을 번 NCAV 투자법 (0) | 2021.10.22 |
퀀트투자 백테스트를 한 번 해보기로 했다. (0) | 2021.10.20 |
댓글