<퀀트 전략 파이썬으로 세워라>

게으른 투자자 2020. 7. 5. 16:16

퀀트 전략 파이썬으로 세워라
국내도서
저자 : 박준규
출판 : 비제이퍼블릭 2019.04.30
상세보기

 

파이썬으로 퀀트 투자에 도전해보려는 사람들에게 입문서로 훌륭한 책이다. 파이썬을 모르는 사람도 천천히 따라갈 수 있도록 단계별로 조금씩 파이썬의 문법과 라이브러리(requests, pandas, numpy)를 설명해주는 저자의 친절함이 인상적이다.

 

프로그래밍으로 10년 넘게 밥먹고 사는 사람의 눈으로 봤을 때, 경제, 경영학을 전공한 저자는 같이 일하고 싶을 정도로 프로그래밍에 꽤 소질이 있는 것 같다. 코드가 깔끔하고 잘 구조화 되어 있다.

 

프로그래밍을 해보진 않았지만 프로그래밍에 감이 있는 사람이라면 쉽게 따라갈 수 있을 것이다. 반대라면 책의 후반부로 갈수록 코드량이 많아져서 쉽지 않겠다는 생각이 들었다.

 

같이 컴퓨터 공학을 공부했던 동기들 중에서도 프로그래밍을 배우는 속도의 차이가 컸던 기억이 난다. IT 비전공자라도 논리적으로 사고하는 것이 편안한 사람에게는 파이썬 프로그래밍을 배우는 것이 쉽게 느껴질 것이다.

 

퀀트 투자를 하려면 3가지가 필요하다.

  1. 데이터 수집 (시가총액, 주가, 매출, 영업이익, 자산, PBR, ROE, 주가, ...)
  2. 전략에 따른 종목 선정 (시가총액 하위 20% 기업 중에서 저PBR, 고GP/A 상위 20종목)
  3. 백테스트 (과거 주가 데이터를 가지고 수익률, 최대낙폭 시뮬레이션)

 

이 책은 3가지를 모두 다루며 2020년 7월 기준으로 약간만 수정하면 동작하는 파이썬 코드를 제공한다.

https://github.com/bjpublic/quantpython

 

수정해야 하는 코드도 별 것 아니다.

 

첫 번째는 CompanyGuide에서 제공하는 데이터 항목의 이름 달라져서 발생하는 문제로 쉽게 수정 가능하다. 

 

def make_fr_dataframe(firm_code):
    fr_url = 'https://comp.fnguide.com/SVO2/asp/SVD_FinanceRatio.asp?pGB=1&cID=&MenuYn=Y&ReportGB=D&NewMenuID=104&stkGb=701&gicode=' + firm_code
    fr_page = requests.get(fr_url)
    fr_tables = pd.read_html(fr_page.text)
    
    temp_df = fr_tables[0]
    temp_df = temp_df.set_index(temp_df.columns[0])
    temp_df = temp_df.loc[['유동비율계산에 참여한 계정 펼치기',
                           '부채비율계산에 참여한 계정 펼치기',
                           '영업이익률계산에 참여한 계정 펼치기',
                           'ROA계산에 참여한 계정 펼치기',
                           'ROIC계산에 참여한 계정 펼치기']]
    temp_df.index = ['유동비율', '부채비율', '영업이익률', 'ROA', 'ROIC']
    return temp_df

 

두 번째는 엑셀 파일을 DataFrame으로 불러올 때, 첫 번째 컬럼을 인덱스로 지정하는 옵션 파라미터를 사용하도록 수정해야 한다.

 

def get_finance_data(path):
    data_path = path
    raw_data = pd.read_excel(data_path, index_col=0)
    big_col = list(raw_data.columns)
    small_col = list(raw_data.iloc[0])
    
    new_big_col = []
    for num, col in enumerate(big_col):
        if 'Unnamed' in col:
            new_big_col.append(new_big_col[num-1])
        else:
            new_big_col.append(big_col[num])
            
    raw_data.columns = [new_big_col, small_col]
    clean_df = raw_data.loc[ raw_data.index.dropna() ]
    
    return clean_df

 

세 번째는 Pandas의 API 변경에 따른 수정사항이다. 특정 인덱스의 행만 남길 때 reindex 함수를 사용해야 한다.

 

def select_code_by_price(price_df, data_df, start_date):
    new_code_list = []
    for code in price_df[start_date].iloc[0].dropna().index:
        new_code_list.append('A' + code)
        
    selected_df =  data_df.reindex(new_code_list)
    return selected_df

 

모든 실습은 Jupyter Notebook에서 해볼 수 있도록 준비되어 있어서 편리하다. 조금씩 코드를 수정하며 테스트하기에 좋다.

 

Jupyter Notebook에서 실습

 

파이썬 코드를 활용해 CompanyGuide에서 제공되는 재무제표, 재무비율, 투자지표를 가져오고 네이버 금융에서 가격 정보를 가져와 엑셀로 저장한 후, 이를 다시 읽어 Pandas 라이브러리의 DataFrame을 활용해 내가 원하는 전략에 맞는 종목을 찾을 수 있다. 과거 데이터를 기반으로 전략을 백테스트(시뮬레이션) 해볼 수 있는 코드도 제공된다.

 

중요한 문제가 하나 있는데, CompanyGuide에서 가져올 수 있는 정보는 2016년부터이므로 백테스팅해볼 수 있는 구간이 너무 짧다.

 

지금까지 찾아본 대안은 다음과 같다.

  1. 퀀트킹에서 과거 데이터(2006~2019)를 구입(30만원)하여 데이터만 가져다 쓰기
  2. 퀀트킹에서 백테스팅 기능 개발 완료되면 유료로 사용하기 
  3. 인텔리퀀트 스튜디오 유료로 사용하기
  4. 젠포트 유료로 사용하기

 

할 수 있다! 퀀트 투자
국내도서
저자 : 강환국
출판 : 에프엔미디어 2017.09.11
상세보기

 

<할 수 있다! 퀀트 투자>에 나온 전략을 그대로 따라하는 편이 노력대비 성과면에서 나을수도 있겠다는 생각이 들기도 해서, 여기에 얼만큼의 노력을 들일지가 관건인 것 같다.

 

나만의 로직을 설계하고 검증하여 투자에 활용하고자 한다면, 데이터만 유료로 구해서 전략, 백테스트 로직은 직접 구현하는 것이 가장 좋아보인다. 개발자에게 도움이 되는 취미생활로 아직까지 이만한 것을 찾지 못했다. 우선은 확보할 수 있는 데이터 범위 안에서 해볼 수 있는 것들을 해보고, 나중에는 AI를 활용하여 종목을 찾아내는 실험도 해볼 생각이다.