책 소개
실제 퀀트 포트폴리오 매니저 출신이 알려주는
퀀트 투자 기초부터 고급까지, 모든 것을 한 방에!!
개정판의 주요 변경 사항
■ 변경된 한국거래소 사이트에 맞춰 새로 작성
■ 웹페이지 구조가 변경되어 크롤링이 불가능하게 된 곳을 삭제
■ 네이버 증권의 주가 데이터 출처가 변경되어 새로 작성
■ 크롤러의 접근이 어려운 곳은 user_agent() 함수로 크롤링할 수 있도록 변경
■ DART 크롤링 내용 추가
■ 실전에서 많이 사용되는 인덱스 포트폴리오 및 인핸스드 인덱스 포트폴리오 구성 방법 추가
■ ggplot2 패키지의 기본적인 사용법 추가
■ 일부 코드를 수정하여 데이터 처리를 좀 더 쉽게, 종목 선택을 더욱 꼼꼼히 하도록 변경
1. R을 이용해 주식 투자에 필요한 각종 데이터를 크롤링하여 수집하고 정리할 수 있다!
여러 프로그래밍 언어 중 R은 무료이며 비교적 일반 사용자가 사용하기 쉬운 형태로 구성되어 있습니다. 무엇보다 독보적으로 통계나 계량분석과 관련된 패키지를 포함하고 있다는 장점이 있습니다. 이런 R을 활용하여 직접 금융 데이터를 크롤링하여 수집할 수 있습니다. 단순히 데이터를 수집하는 데 그치지 않고 데이터를 분석하고 시각화하여 효과적인 투자 전략을 세울 수 있도록 데이터를 정리할 수 있습니다. 단, 이 책은 R과 R Studio 설치 등 기초적인 프로그래밍 내용은 생략합니다. 그러므로 R 기초 프로그래밍을 먼저 익힌 후 학습한다면 더욱 효과적입니다.
2. 퀀트 모델을 통해 포트폴리오를 구성하고, 백테스트 및 성과를 평가할 수 있다!
실제 퀀트 포트폴리오 매니저 출신이 알려주면 다릅니다. 데이터를 준비했다면 이제 어떤 종목에 투자해야 할지 선정합니다. 이 책은 퀀트 전략을 이용한 종목 선정을 기본부터 심화 과정으로 나눠 자세하게 설명합니다. 또한 포트폴리오 구성부터 백테스트 및 성과 평가까지 퀀트 투자를 위한 거의 모든 과정을 제대로 배울 수 있습니다.
3. 퀀트 모델에 대한 이해를 높이고, 코드를 통해 실제 구현할 수 있다!
가장 기본적인 퀀트 투자가 무엇인지부터 시작하여, 데이터 수집, 정리, 분석 및 시각화, 종목 선정, 포트폴리오 구성, 백테스트 및 성과 평가 등의 전 과정을 체계적으로 학습하면서 퀀트 모델에 대한 전반적인 이해도를 높일 수 있습니다. 또한 프로그래밍 초보자를 고려하여 코드에 따라 자세한 설명을 추가하였습니다. 이를 잘 학습한다면 책의 내용을 넘어 더욱 훌륭한 퀀트 투자 모델을 만들어 볼 수 있을 것입니다.
4. 웹페이지를 통한 지속적인 업데이트 및 전체 소스 제공!
퀀트 투자 환경은 빠르게 변하지만 고정된 지면으로는 변화에 빠른 대처가 어렵습니다. 그러므로 다음과 같이 저자가 제공하는 웹페이지를 통해 업데이트된 내용이나 변화된 환경에 대응할 수 있습니다.
웹페이지: https://hyunyulhenry.github.io/quant_cookbook
GitHub 저장소: https://github.com/hyunyulhenry/quant_cookbook
이 책의 대상 독자
- R을 이용해 퀀트 투자 전략을 세우려는 분
- 퀀트 투자를 하고 싶지만 데이터 구매 비용에 부담을 느끼는 분
- 퀀트 투자, 제대로 알고 시작하고 싶으신 분
- R을 이용해 데이터 크롤링하는 방법을 알고 싶으신 분
- R 데이터 수집 및 가공, 시각화를 실습해 보고 싶으신 분
작가 소개
한양대학교에서 경영학을 전공하고, 카이스트 대학원에서 금융공학 석사 학위를 받았다. 졸업 후 증권사에서 주식운용을, 자산운용사에서 퀀트 포트폴리오 매니저 업무를 거쳐 지금은 보험사에서 데이터 분석 업무를 하고 있으며, 평소 꾸준한 SNS와 블로그 활동으로 퀀트 아이디어 및 백테스트 결과 등을 공유하면서 퀀트 투자의 대중화를 위해 노력하고 있다. 현재 한양대학교 재무금융 박사 과정에 재학 중이며, 패스트캠퍼스에서 R과 퀀트 투자 강의를 맡고 있다. 지은 책으로는 《스마트베타》(2017)가 있다.
목 차
머리말 XI
이 책의 구성 XIII
이 책에 대하여 XV
CHAPTER 1 퀀트 투자의 심장: 데이터와 프로그래밍 _ 001
1.1 데이터 구하기 003
1.2 퀀트 투자와 프로그래밍 005
1.3 R 프로그램 006
1.4 퀀트 투자에 유용한 R 패키지 008
CHAPTER 2 크롤링을 위한 기본 지식 _ 011
2.1 인코딩의 이해와 R에서 UTF-8 설정하기 012
2.1.1 인간과 컴퓨터 간 번역의 시작, ASCII • 012
2.1.2 한글 인코딩 방식의 종류 • 013
2.1.3 R에서 UTF-8 설정하기 • 014
2.2 웹의 동작 방식 015
2.2.1 HTTP • 016
2.3 HTML과 CSS 017
2.3.1 HTML 기본 구조 • 018
2.3.2 태그와 속성 • 019
2.3.3 h 태그와 p 태그 • 019
2.3.4 리스트를 나타내는 ul 태그와 ol 태그 • 020
2.3.5 table 태그 • 021
2.3.6 a 태그와 src 태그 및 속성 • 023
2.3.7 div 태그 • 024
2.3.8 CSS • 025
2.3.9 클래스와 id • 026
2.4 파이프 오퍼레이터(%>%) 028
2.5 오류에 대한 예외처리 031
CHAPTER 3 API를 이용한 데이터 수집 _ 033
3.1 API를 이용한 Quandl 데이터 다운로드 034
3.2 getSymbols() 함수를 이용한 API 다운로드 035
3.2.1 주가 다운로드 • 036
3.2.2 국내 종목 주가 다운로드 • 039
3.2.3 FRED 데이터 다운로드 • 041
CHAPTER 4 크롤링 이해하기 _ 045
4.1 GET과 POST 방식 이해하기 046
4.1.1 GET 방식 • 046
4.1.2 POST 방식 • 048
4.2 크롤링 예제 050
4.2.1 금융 속보 크롤링 • 050
4.2.2 기업공시채널에서 오늘의 공시 불러오기 • 053
4.2.3 네이버 금융에서 주식티커 크롤링 • 056
CHAPTER 5 금융 데이터 수집하기(기본) _ 067
5.1 한국거래소의 산업별 현황 및 개별지표 크롤링 067
5.1.1 업종분류 현황 크롤링 • 068
5.1.2 개별종목 지표 크롤링 • 072
5.1.3 최근 영업일 기준 데이터 받기 • 074
5.1.4 거래소 데이터 정리하기 • 078
5.2 WICS 기준 섹터 정보 크롤링 083
CHAPTER 6 금융 데이터 수집하기(심화) _ 089
6.1 수정주가 크롤링 089
6.1.1 개별종목 주가 크롤링 • 090
6.1.2 전 종목 주가 크롤링 • 095
6.2 재무제표 및 가치지표 크롤링 097
6.2.1 재무제표 다운로드 • 097
6.2.2 가치지표 계산하기 • 103
6.2.3 전 종목 재무제표 및 가치지표 다운로드 • 107
6.3 DART의 Open API를 이용한 데이터 수집하기 111
6.3.1 API Key발급 및 추가하기 • 111
6.3.2 고유번호 다운로드 • 113
6.3.3 공시검색 • 116
6.3.4 사업보고서 주요 정보 • 121
6.3.5 상장기업 재무정보 • 123
6.3.6 단일회사 전체 재무제표 • 128
CHAPTER 7 데이터 정리하기 _ 135
7.1 주가 정리하기 135
7.2 재무제표 정리하기 137
7.3 가치지표 정리하기 141
CHAPTER8 데이터 분석 및 시각화하기 _ 145
8.1 종목정보 데이터 분석 146
8.1.1 *_join(): 데이터 합치기 • 146
8.1.2 glimpse(): 데이터 구조 확인하기 • 148
8.1.3 rename(): 열 이름 바꾸기 • 149
8.1.4 distinct(): 고유한 값 확인 • 150
8.1.5 select(): 원하는 열만 선택 • 150
8.1.6 mutate(): 열 생성 및 데이터 변형 • 152
8.1.7 filter(): 조건을 충족하는 행 선택 • 153
8.1.8 summarize(): 요약 통곗값 계산 • 154
8.1.9 arrange(): 데이터 정렬 • 154
8.1.10 row_number(): 순위 계산 • 155
8.1.11 ntile(): 분위수 계산 • 156
8.1.12 group_by(): 그룹별로 데이터를 묶기 • 156
8.2 ggplot() 기초 158
8.2.1 diamonds 데이터셋 • 160
8.2.2 Data, Aesthetics, Geometrics • 161
8.2.3 Facets • 164
8.2.4 Statistics • 164
8.2.5 Coordinates • 165
8.2.6 Theme • 167
8.3 종목정보 시각화 168
8.3.1 geom_point(): 산점도 나타내기 • 168
8.3.2 geom_histogram(): 히스토그램 나타내기 • 170
8.3.3 geom_boxplot(): 박스 플롯 나타내기 • 172
8.3.4 dplyr과 ggplot을 연결해 사용하기 • 173
8.3.5 geom_bar(): 막대 그래프 나타내기 • 174
8.4 주가 및 수익률 시각화 176
8.4.1 주가 그래프 나타내기 • 176
8.4.2 인터랙티브 그래프 나타내기 • 178
8.4.3 연도별 수익률 나타내기 • 181
CHAPTER 9 퀀트 전략을 이용한 종목 선정(기본) _ 185
9.1 베타 이해하기 187
9.1.1 베타 계산하기 • 189
9.1.2 베타 시각화 • 191
9.2 저변동성 전략 192
9.2.1 저변동성 포트폴리오 구하기: 일간 기준 • 194
9.2.2 저변동성 포트폴리오 구하기: 주간 기준 • 197
9.3 모멘텀 전략 199
9.3.1 모멘텀 포트폴리오 구하기: 12개월 모멘텀 • 200
9.3.2 모멘텀 포트폴리오 구하기: 위험조정 수익률 • 202
9.4 밸류 전략 205
9.4.1 밸류 포트폴리오 구하기: 저PBR • 206
9.4.2 각 지표 결합하기 • 207
9.5 퀄리티 전략 210
9.5.1 F-Score 지표 • 210
9.5.2 각 지표 결합하기 • 216
CHAPTER 10 퀀트 전략을 이용한 종목 선정(심화) _ 219
10.1 섹터 중립 포트폴리오 219
10.2 마법공식 223
10.2.1 퀄리티와 밸류 간의 관계 • 224
10.2.2 마법공식 이해하기 • 226
10.2.3 마법공식 구성하기 • 227
10.3 이상치 데이터 제거 및 팩터의 결합 231
10.3.1 트림(Trim): 이상치 데이터 삭제 • 232
10.3.2 윈저라이징(Winsorizing): 이상치 데이터 대체 • 233
10.3.3 팩터의 결합 방법 • 234
10.4 멀티팩터 포트폴리오 236
CHAPTER 11 포트폴리오 구성 _ 247
11.1 최소분산 포트폴리오 250
11.1.1 slsqp() 함수를 이용한 최적화 • 250
11.1.2 solve.QP() 함수를 이용한 최적화 • 254
11.1.3 optimalPortfolio() 함수를 이용한 최적화 • 259
11.1.4 결괏값들의 비교 • 261
11.1.5 최소 및 최대 투자비중 제약조건 • 262
11.1.6 각 자산별 제약조건의 추가 • 265
11.2 최대분산효과 포트폴리오 267
11.2.1 solve.QP() 함수를 이용한 최적화 • 270
11.2.2 optimalPortfolio() 함수를 이용한 최적화 • 272
11.2.3 최소 및 최대 투자비중 제약조건 • 273
11.2.4 각 자산별 제약조건의 추가 • 276
11.3 위험균형 포트폴리오 278
11.3.1 주식 60%와 채권 40% 포트폴리오의 위험기여도 • 279
11.3.2 rp() 함수를 이용한 최적화 • 280
11.3.3 위험예산 포트폴리오 • 282
11.4 인덱스 포트폴리오 구성하기 283
11.4.1 시가총액비중 계산하기 • 284
11.4.2 인덱스 포트폴리오 복제하기 • 284
11.4.3 팩터를 이용한 인핸스드 포트폴리오 구성하기 • 289
CHAPTER 12 포트폴리오 백테스트 _ 303
12.1 Return.portfolio() 함수 304
12.1.1 인자 목록 살펴보기 • 304
12.1.2 출력값 살펴보기 • 306
12.2 전통적인 60대40 포트폴리오 백테스트 306
12.3 시점 선택 전략 백테스트 311
12.4 동적 자산배분 백테스트 317
CHAPTER 13 성과 및 위험 평가 _ 325
13.1 결과 측정 지표 328
13.1.1 수익률 및 변동성 • 328
13.1.2 낙폭과 최대낙폭 • 332
13.1.3 연도별 수익률 • 334
13.1.4 승률 및 롤링 윈도우 값 • 336
13.2 팩터 회귀분석 및 테이블로 나타내기 338
참고문헌 342
찾아보기 346
- 단순 변심인 경우 : 상품 수령 후 7일 이내 신청
- 상품 불량/오배송인 경우 : 상품 수령 후 3개월 이내, 혹은 그 사실을 알게 된 이후 30일 이내 반품 신청 가능
반품사유 | 반품 배송비 부담자 |
---|---|
단순변심 | 고객 부담이며, 최초 배송비를 포함해 왕복 배송비가 발생합니다. 또한, 도서/산간지역이거나 설치 상품을 반품하는 경우에는 배송비가 추가될 수 있습니다. |
고객 부담이 아닙니다. |
진행 상태 | 결제완료 | 상품준비중 | 배송지시/배송중/배송완료 |
---|---|---|---|
어떤 상태 | 주문 내역 확인 전 | 상품 발송 준비 중 | 상품이 택배사로 이미 발송 됨 |
환불 | 즉시환불 | 구매취소 의사전달 → 발송중지 → 환불 | 반품회수 → 반품상품 확인 → 환불 |
- 결제완료 또는 배송상품은 1:1 문의에 취소신청해 주셔야 합니다.
- 특정 상품의 경우 취소 수수료가 부과될 수 있습니다.
결제수단 | 환불시점 | 환불방법 |
---|---|---|
신용카드 | 취소완료 후, 3~5일 내 카드사 승인취소(영업일 기준) | 신용카드 승인취소 |
계좌이체 |
실시간 계좌이체 또는 무통장입금 취소완료 후, 입력하신 환불계좌로 1~2일 내 환불금액 입금(영업일 기준) |
계좌입금 |
휴대폰 결제 |
당일 구매내역 취소시 취소 완료 후, 6시간 이내 승인취소 전월 구매내역 취소시 취소 완료 후, 1~2일 내 환불계좌로 입금(영업일 기준) |
당일취소 : 휴대폰 결제 승인취소 익월취소 : 계좌입금 |
포인트 | 취소 완료 후, 당일 포인트 적립 | 환불 포인트 적립 |
- 단순변심으로 인한 반품 시, 배송 완료 후 7일이 지나면 취소/반품 신청이 접수되지 않습니다.
- 주문/제작 상품의 경우, 상품의 제작이 이미 진행된 경우에는 취소가 불가합니다.
- 구성품을 분실하였거나 취급 부주의로 인한 파손/고장/오염된 경우에는 취소/반품이 제한됩니다.
- 제조사의 사정 (신모델 출시 등) 및 부품 가격변동 등에 의해 가격이 변동될 수 있으며, 이로 인한 반품 및 가격보상은 불가합니다.
- 뷰티 상품 이용 시 트러블(알러지, 붉은 반점, 가려움, 따가움)이 발생하는 경우 진료 확인서 및 소견서 등을 증빙하면 환불이 가능하지만 이 경우, 제반 비용은 고객님께서 부담하셔야 합니다.
- 각 상품별로 아래와 같은 사유로 취소/반품이 제한 될 수 있습니다.
상품군 | 취소/반품 불가사유 |
---|---|
의류/잡화/수입명품 | 상품의 택(TAG) 제거/라벨 및 상품 훼손으로 상품의 가치가 현저히 감소된 경우 |
계절상품/식품/화장품 | 고객님의 사용, 시간경과, 일부 소비에 의하여 상품의 가치가 현저히 감소한 경우 |
가전/설치상품 | 전자제품 특성 상, 정품 스티커가 제거되었거나 설치 또는 사용 이후에 단순변심인 경우, 액정화면이 부착된 상품의 전원을 켠 경우 (상품불량으로 인한 교환/반품은 AS센터의 불량 판정을 받아야 합니다.) |
자동차용품 | 상품을 개봉하여 장착한 이후 단순변심의 경우 |
CD/DVD/GAME/BOOK등 | 복제가 가능한 상품의 포장 등을 훼손한 경우 |
상품의 시리얼 넘버 유출로 내장된 소프트웨어의 가치가 감소한 경우 | |
노트북, 테스크탑 PC 등 | 홀로그램 등을 분리, 분실, 훼손하여 상품의 가치가 현저히 감소하여 재판매가 불가할 경우 |