이번 포스팅 에서 는 분류 알고리즘 으로 널리 이용 되 는 Decision tree model 을 기반 으로 한 Random forest 알고리즘 을 이용 한 모 멘 텀 전략 에 대해 살펴보 겠 습니다 . 1 . Decision tree ? Random forest ? Decision tree 모델 은 어떤 예측 을 하 기 위해 다양 한 변수 가 존재 하 는 경우 , 예 측력 이 높 은 변수 를 우선 적 으로 순차 적 으로 배치 한 뒤 연속 적 인 분류 과정 을 통해 최종 적 인 예측 을 얻 어 내 는 머신 러닝 알고리즘 의 일종 입니다 . ' 야 , 그걸 설명 이 라고 하 냐 ? 좀 알아듣 기 쉽 게 얘기 해 봐 ! ' 쉬운 예 를 들 어 보 겠 습니다 . 2 . Decision tree 알고리즘 을 통한 체벌 예측 제 가 고등학교 3 학년 때 저 의 담임 선생 님 은 학교 에서 가장 악명 이 자자 한 ' 폭력 교사 ' 였 습니다 . 요즘 은 시대 가 좋 아 졌 지만 , 제 학창 시절 만 해도 소위 ' 사랑 의 매 ' 라는 명목 으로 학생 에 대한 선생 님 의 폭력 이 정당 화 되 던 시기 였 습니다 . 하도 체벌 이 일상 화 되 어 있 어서 , 모의고사 를 치 고 나 면 10 점 떨어진 친구 는 10 점 떨어졌 으므로 10 대 , 5 점 떨어진 친구 는 5 대 씩 맞 았 죠 . 5 점 올랐 으면 ? 5 점 밖 에 안 올랐 다고 또 때리 고 . .. 하지만 가뭄 에 콩 나 듯이 매질 없이 넘어가 는 날 이 있 었 는데요 , 그럴 때 면 모든 친구 들 이 신기 해했 습니다 . 왜 오늘 은 안 때리 지 ? < 사랑 의 매 . jpg > 자 , 그러면 여기 서 우리 담임 선생 님 이 어떤 날 때릴 확률 이 높 고 어떤 날 안 때릴 확률 이 높 을지 decision tree 알고리즘 을 이용 해서 예측 해 보 겠 습니다 . 매일 얻어터지 던 우리 반 아이 들 이 모여서 회의 를 합니다 . " 야 , 우리 맨날 맞 는 것 도 지겨운 데 저기압 일 걸로 예상 되 는 날 에 는 특별히 더 신경 써서 설설 기 고 , 그렇 지 않 을 걸로 예상 되 는 날 에 는 좀 긴장 을 푸 는 것 이 어떨까 ? " " 오케이 좋 아 . 근데 언제 담임 이 우리 를 많이 때리 는 것 같 애 ? " " 내 가 봤 을 땐 , 담임 이 빨간 넥타이 차 고 온 날 많이 때린 것 같 애 " " 야 . .. 그게 말 이 되 냐 ? 그건 우연 의 일치 일 뿐 이 야 " " 내 가 봤 을 땐 , 아침 조례 시간 의 얼굴 표정 이 거의 90 % 를 좌우 하 는 것 같 음 . 아침 에 실실 웃 으면 그날 은 잘 넘어가 고 , 아침 에 굳 은 표정 인 날 은 십 중 팔 구 타작 날 이 었 던 것 같 음 " " 내 경험 에 의하 면 , 지각 한 놈 이 있 는지 의 여부 도 중요 한 변수 였 던 것 같 음 . 아무 도 지각 을 안 한 날 은 때린 적 이 별로 없 었 던 것 같 고 , 지각 한 놈 이 하나 라도 있 으면 때린 적 이 많 았 던 것 같 음 ' 어떻 습니까 ? 나름 대로 자신 의 경험 에 입각 해서 담임 선생 님 이 체벌 할지 의 여부 에 영향 을 미치 는 다양 한 변수 를 제시 했 습니다 . 어떤 변수 는 타당 해 보이 고 , 어떤 것 은 그렇 지 않 아 보이 고 , 어떤 것 은 잘 모르 겠 습니다 . 이 처럼 어떤 결과 에 영향 을 미치 는 다양 한 변수 가 존재 할 때 , 이 변수 들 을 어떻게 적절히 순차 적 으로 조합 을 해서 판단 을 내려야 최종 적 으로 가장 정확 한 판단 을 내릴 수 있 을지 결정 하 는 방법 중 하나 가 decision tree 모델 입니다 . 이 체벌 예측 모델 에서 독립 변수 는 넥타이 색깔 , 아침 조례 때 의 얼굴 표정 , 지각 한 학생 의 존재 여부 등 이 고 , 종속 변수 는 당일 체 별 여부 가 되 겠 지요 ? 변수 가 많 다고 해서 이것 이 다 의미 있 는 정보 는 아닐 겁니다 . 예 를 들 어 , 넥타이 색깔 은 제 개인 적 인 경험 으로 체 별 여부 와 상관 성 이 상당히 낮 았 던 걸로 기억 합니다 . 하지만 , 상대 적 으로 아침 조례 시간 의 기분 상태 는 상당히 체 별 여부 와 상관 성 이 높 았 던 것 같 네요 . 이 처럼 , 설명력 이 다양 한 변수 가 혼재 되 어 있 는 경우 , 어떻게 분류 를 해야 정확 한 예측 을 할 수 있 을까요 ? 너무나 상식 적 인 얘기 지만 , 종속 변수 와 의 상관 성 과 설명력 이 가장 높 은 개별 변수 를 최우선 적 으로 이용 해서 분류 를 한 뒤 , 순차 적 으로 높 은 중요도 를 가진 변수 를 배치 하 여 예측 을 하 는 것 이 바람직 하 겠 지요 ? 그러 기 위해서 는 우선 데이터 를 통해 패턴 을 검증 할 필요 가 있 겠 습니다 . 우선 , 다음 과 같 은 방식 으로 데이터 를 수집 합니다 . 아래 에서 는 일부 만 예 를 든 것 입니다 . 데이터 의 개수 는 많 으면 많 을수록 좋 겠 지요 ? 날짜 넥타이 색깔 조례 때 표정 지각 학생 유무 당일 체벌 여부 5 월 1 일 빨간색 천진 난 만유 X 5 월 2 일 파란색 똥 씹 은 표 정유 O 5 월 3 일 파란색 천진 난 만무 X 5 월 4 일 빨간색 천진 난 만유 O 5 월 5 일 파란 식 똥 씹 은 표정 무 O 이렇게 데이터 를 수집 한 후 에 는 각각 의 변수 ( 넥타이 색깔 , 조례 때 표정 , 지각 학생 유무 ) 가 당일 체벌 유무 와 얼마나 높 은 정확도 를 지니 는지 개별 적 으로 확인 을 한 뒤 , 정확도 가 높 은 순 으로 결정 모델 을 만드 는 것 입니다 . 예 를 들 어 , 100 일 동안 위 와 같 은 방식 으로 데이터 를 100 개 수집 한 후 분석 해 봤 더니 , 다음 과 같 았 다고 가정 해 보 겠 습니다 . 빨간 넥타이 : 체벌 확률 50 %, 파란 넥타이 : 체벌 확률 50 % 천진난만 표정 : 체벌 확률 10 %, 똥 씹 은 표정 : 체벌 확률 90 % 지각 학생 없 음 : 체벌 확률 30 %, 지각 학생 존재 : 체벌 확률 70 % 이렇게 데이터 가 나왔 다면 , 체벌 여부 와 가장 연관 성 이 높 은 변수 는 조례 때 표정 이 고 , 다음 이 지각 학생 의 여부 , 마지막 으로 넥타이 색깔 이 므로 , 의사 결정 모델 도 이 순서 에 맞 게 짜 면 되 는 것 입니다 . 체벌 예측 모델 : 조례 때 표정 ---> 지각 학생 여부 ---> 넥타이 색깔 예 를 들 어 , 조례 때 똥 씹 은 표정 을 한 상태 에서 지각 학생 까지 있 었 다면 , 십 중 팔 구 그 날 은 얻 어 터질 가능 성 이 높 다고 판단 하 면 되 겠 지요 ? 사실 넥타이 색깔 같 은 변수 는 설명력 이 거의 없 기 때문 에 배제 해도 거의 무방 할 정도 겠 지요 . 만일 조례 때 는 천진난만 한 표정 을 지 었 으나 , 지각 학생 은 있 었 고 , 넥타이 는 파란 색인 , 약간 은 애매 한 상황 에 는 어떻게 예측 해야 할까요 ? 이런 경우 에 대한 정량 적 인 판단 은 Decision tree 알고리즘 의 계산 수치 에 근거 해서 내려지 게 됩니다 . 물론 , 앞서 예 를 든 ' 뻔히 보이 는 경우 ' 에 대한 판단 도 사실 은 다 정량 적 으로 수치 기반 으로 판정 이 내려 집니다 . 최대한 이해 하 기 쉬운 설명 을 위해 ' 정확도 ', ' 결과 와 의 상관 성 ' 같 은 약간 은 부 정확 한 용어 를 이용 해서 설명 을 했 지만 , 엄밀 하 게 표현 하 자면 분류 의 정확 도 기준 은 데이터 분포 의 불 순도 를 나타내 는 ' 엔트로피 ' 라는 개념 을 이용 해서 계산 을 합니다 . 데이터 의 불 순도 가 높 을수록 엔트로피 값 이 낮 아 지 고 , 불 순도 가 낮 을수록 엔트로피 값 이 높 아지므로 , 개별 변수 에 대한 엔트로피 값 을 계산 하 여 , 분류 의 순서 를 정하 는 방식 입니다 . Decision tree 의 수학 적 알고리즘 에 대한 세부 적 인 내용 은 인터넷 검색 을 통해 확인 하 시 기 바랍니다 . Decision tree 에 대한 다른 예 를 몇 개 확인 하 면 다음 과 같 습니다 . 아마 그림 만 보 셔도 어떤 개념 인지 이해 가 가리 라 생각 합니다 . < 타이타닉 호 승객 의 생존 여부 예측 모델 > < 스팸 메일 분류 알고리즘 > 3 . Decision tree 모델 의 확장 판 - Random forest 알고리즘 앞서 살펴본 바 와 같이 decision tree 모델 은 직관 적 이 고 이해 하 기 쉬운 장점 이 있 지만 , 치명 적 인 단점 이 하 나 있 는데 , 그것 은 과거 데이터 에 최적 화 된 구조 이 기 때문 에 , 새로운 데이터 가 들어오 거나 약간 변화 가 생기 는 경우 오히려 정확도 가 떨어질 수 있 다는 것 입니다 . 전형 적 인 과 최적화 문제 라고 보 시 면 되 겠 지요 . 이런 문제 를 극복 하 기 위한 모델 이 random forest 모델 입니다 . Random forest 모델 에서 는 , decision tree 모델 의 학습 데이터 전체 를 그대로 이용 하 는 것 이 아니 라 , 우선 데이터 중 일부 만 랜덤 하 게 선택 하 여 여러 개 의 학습 데이터 셋 을 만든 뒤 결과 를 검증 합니다 . 이후 , 각각 의 데이터 셋 의 결과 를 다수결 투표 하 듯 표결 한 뒤 ( 투표 , 확률 , 평균 등 ) 가장 높 은 가능 성 을 보이 는 쪽 으로 분류 하 는 방식 입니다 . Random forest 모델 에서 는 각 트리 들 의 편향 은 그대로 유지 가 되 면서 , 분산 은 감소 하 기 때문 에 보다 안정 적 이 면서 도 전반 적 인 정확 도 성능 도 높 아 지 게 됩니다 . 본 블로그 에서 도 지속 적 으로 언급 한 평균 모 멘 텀 분산 투자 전략 의 개념 ( 1 개 의 모 멘 텀 값 만 선정 해서 투자 하 지 않 고 1 ~ 12 개월 의 12 개 구간 에 분산 한 뒤 상대 적 비중 을 부여 하 는 방식 ) 도 random forest 알고리즘 의 철학 과 일부 통하 는 면 이 있 다고 볼 수 있 습니다 . 4 . Random forest 모델 을 이용 한 월간 모 멘 텀 투자 전략 본 블로그 에서 는 월간 모 멘 텀 이 라는 지극히 단순 한 지표 하나 만 가지 고 다양 한 변종 투자 전략 을 소개 하 고 있 습니다 . 이번 포스팅 에서 는 Random forest 알고리즘 을 월간 모 멘 텀 전략 에 적용 한 결과 를 소개 하 려 합니다 . 모 멘 텀 기간 값 을 어떤 것 을 쓸 것 이 냐 를 결정 하 는 방법 은 크 게 3 가지 로 구분 할 수 있 겠 습니다 . 첫 번 째 방법 은 , 6 개월 이나 12 개월 같이 고정 된 값 을 쓰 는 방법 인데 , 이렇게 고정 된 값 을 써도 큰 무리 는 없 지만 , 왜 하필 7 개월 이나 11 개월 은 아니 냐 라는 질문 에 대한 명쾌 한 답 을 주지 는 못 합니다 . 그저 장기간 백 테스트 해 보 니 이게 제일 잘 나와서 라는 경험 적 인 대답 밖 에 는 할 수 가 없 는 것 이 단점 입니다 . 두 번 째 방법 은 , 1 ~ 12 개월 타임 프레임 전체 에 분산 투자 하 는 방법 으로 , 블로그 에서 지속 적 으로 소개 한 바 있 습니다 . 최적 화 라는 과정 을 아예 제거 해 버렸 기 때문 에 과 최적화 의 위험 성 이 없 다는 장점 이 있 습니다 . 세 번 째 방법 은 , adaptive time frame 같이 시장 의 변동성 에 맞 게 실시간 으로 최적 주기 를 조절 하 는 방법 인데 , 단순히 고정 된 모 멘 텀 값 을 쓰 는 방법 보다 는 진일보 한 방식 이 라고 볼 수 있 겠 습니다 . Random forest 모델 을 이용 한 월간 모 멘 텀 투자 전략 에서 는 , 1 개월 모 멘 텀 , 2 개월 모 멘 텀 , 3 개월 모 멘 텀 . ...... 12 개월 모 멘 텀 의 12 개 의 변수 를 독립 변수 로 하 고 , 다음 달 주가 상승 여부 를 종속 변수 로 지정 한 뒤 random forest 알고리즘 을 돌립니다 . 12 개 의 변수 를 통해 생성 된 여러 개 의 decision tree 들 을 기반 으로 , 매월 다수결 투표 를 해서 다음 달 상승 으로 예측 되 면 종목 보유 , 하락 으로 예측 되 면 현금 을 보유 하 는 방식 입니다 . 시장 은 끊임없이 변하 므로 학습 데이터 는 최근 12 개월 간 의 데이터 를 이용 해서 매달 최신 데이터 에 맞 게 업데이트 하 는 방식 입니다 . KOSPI 지수 를 대상 으로 시뮬레이션 한 결과 는 아래 와 같 습니다 . ( 모든 머신 러닝 알고리즘 이 마찬가지 이 지만 , 알고리즘 의 개념 은 이해 할 수 있 어도 , 실제 데이터 에 알고리즘 이 적용 되 어 산출 된 수학 적 인 결과 값 은 직관 적 으로 이해 하 기 는 어렵 습니다 . 따라서 , 수익 곡선 이 상대 적 으로 양호 하 게 나타나 는 구간 과 상대 적 으로 언더 퍼 폼 하 는 구간 을 이해 하 고 , 실제 투자 과정 에서 직관 적 이 지 못한 것 과 의 괴리 감 을 줄이 기 위해서 는 전통 적 인 트레이딩 모델 을 접목 하 는 것 이 중요 한 과제 라고 생각 합니다 . ) 5 . Random forest 알고리즘 파이썬 코드 import pandas as pdimport matplotlib . pyplot as pltimport numpy as npimport pandas _ datareader . data as webfrom sklearn import neighbors , svmfrom sklearn . ensemble import R andomForestClassifierfrom sklearn . linear _ model import LogisticRegression def price ( stock , start ) : price = web . DataReader ( name = stock , data _ source =' yahoo ', start = start ) [ ' Adj Close '] return price . div ( price . iat [ 0 ] ) . resample ( ' M '). last ( ) . to _ frame ( ' price ') a = price ( '^ KS 11 ',' 2000 - 01 - 01 ') a [ ' cash '] = [ ( 1 . 03 **( 1 / 12 ) ) ** x for x in range ( len ( a . index ) ) ] a [ ' R 1 '] = a . price . shift ( 1 ) / a . price . shift ( 2 ) a [ ' R 2 '] = a . price . shift ( 2 ) / a . price . shift ( 3 ) a [ ' R 3 '] = a . price . shift ( 3 ) / a . price . shift ( 4 ) a [ ' R 4 '] = a . price . shift ( 4 ) / a . price . shift ( 5 ) a [ ' R 5 '] = a . price . shift ( 5 ) / a . price . shift ( 6 ) a [ ' R 6 '] = a . price . shift ( 6 ) / a . price . shift ( 7 ) a [ ' R 7 '] = a . price . shift ( 7 ) / a . price . shift ( 8 ) a [ ' R 8 '] = a . price . shift ( 8 ) / a . price . shift ( 9 ) a [ ' R 9 '] = a . price . shift ( 9 ) / a . price . shift ( 10 ) a [ ' R 10 '] = a . price . shift ( 10 ) / a . price . shift ( 11 ) a [ ' R 11 '] = a . price . shift ( 11 ) / a . price . shift ( 12 ) a [ ' R 12 '] = a . price . shift ( 12 ) / a . price . shift ( 13 ) a [ ' rollingstd '] = a . price . pct _ change ( ) . shift ( 1 ) . rolling ( 12 ) . std ( ) a [ ' result '] = np . where ( a . price > a . price . shift ( 1 ) , 1 , 0 ) a = a . dropna ( ) clf 1 = neighbors . KNeighborsClassifier ( n _ neighbors = 3 ) clf 2 = svm . SVC ( ) clf 3 = RandomForestClassifier ( 10 ) clf 4 = LogisticRegression ( ) a [ ' predicted ']= pd . Series ( ) for i in range ( 12 , len ( a . index ) ) : x = a . iloc [ i - 12 : i , 2 : 15 ] y = a [ ' result '][ i - 12 : i ] clf 3 . fit ( x , y ) a [ ' predicted '][ i ] = clf 3 . predict ( x ) [ - 1 ] a = a . dropna ( ) a . price = a . price . div ( a . price . ix [ 0 ] ) print ( a ) accuracy = clf 3 . score ( a . iloc [ : , 2 : 15 ] , a [ ' result ']) a [ ' Random forest '] = np . where ( a . predicted . shift ( 1 ) == 1 , a . price / a . price . shift ( 1 ) , 1 . 0026 ) . cumprod ( ) a [ [ ' Random forest ',' price ']]. plot ( ) plt . show ( ) print ( " Predicted model accuracy : "+ str ( accuracy ) ) ( 무료 종목 추천 및 포트폴리오 비중 정보 를 제공 합니다 . 관심 있 으신 분 은 여기 를 클릭 하 셔서 회원 가입 해 주 세요 ~)( 본 블로그 에 소개 된 시황 과 무관 한 절대 수익 전략 을 이용 한 ETF 투자 상품 을 출시 하 려고 합니다 . 자세 한 정보 는 여기 를 클릭 하 시 기 바랍니다 . ) 여러분 의 인생 이 걸린 너무나 도 중요 한 소식 ! --- > 여기 를 클릭 하 세요 ! 카카오스토리 트위터 페이스북 이번 포스팅 에서 는 분류 알고리즘 으로 널리 이용 되 는 Decision tree model 을 기반 으로 한 Random forest 알고리즘 을 이용 한 모 멘 텀 전략 에 대해 살펴보 겠 습니다 . 1 . Decision tree ? Random forest ? Decision tree 모델 은 어떤 예측 을 하 기 위해 다양 한 변수 가 존재 하 는 경우 , 예 측력 이 높 은 변수 를 우선 적 으로 순차 적 으로 배치 한 뒤 연속 적 인 분류 과정 을 통해 최종 적 인 예측 을 얻 어 내 는 머신 러닝 알고리즘 의 일종 입니다 . ' 야 , 그걸 설명 이 라고 하 냐 ? 좀 알아듣 기 쉽 게 얘기 해 봐 ! ' 쉬운 예 를 들 어 보 겠 습니다 . 2 . Decision tree 알고리즘 을 통한 체벌 예측 제 가 고등학교 3 학년 때 저 의 담임 선생 님 은 학교 에서 가장 악명 이 자자 한 ' 폭력 교사 ' 였 습니다 . 요즘 은 시대 가 좋 아 졌 지만 , 제 학창 시절 만 해도 소위 ' 사랑 의 매 ' 라는 명목 으로 학생 에 대한 선생 님 의 폭력 이 정당 화 되 던 시기 였 습니다 . 하도 체벌 이 일상 화 되 어 있 어서 , 모의고사 를 치 고 나 면 10 점 떨어진 친구 는 10 점 떨어졌 으므로 10 대 , 5 점 떨어진 친구 는 5 대 씩 맞 았 죠 . 5 점 올랐 으면 ? 5 점 밖 에 안 올랐 다고 또 때리 고 . .. 하지만 가뭄 에 콩 나 듯이 매질 없이 넘어가 는 날 이 있 었 는데요 , 그럴 때 면 모든 친구 들 이 신기 해했 습니다 . 왜 오늘 은 안 때리 지 ? < 사랑 의 매 . jpg > 자 , 그러면 여기 서 우리 담임 선생 님 이 어떤 날 때릴 확률 이 높 고 어떤 날 안 때릴 확률 이 높 을지 decision tree 알고리즘 을 이용 해서 예측 해 보 겠 습니다 . 매일 얻어터지 던 우리 반 아이 들 이 모여서 회의 를 합니다 . " 야 , 우리 맨날 맞 는 것 도 지겨운 데 저기압 일 걸로 예상 되 는 날 에 는 특별히 더 신경 써서 설설 기 고 , 그렇 지 않 을 걸로 예상 되 는 날 에 는 좀 긴장 을 푸 는 것 이 어떨까 ? " " 오케이 좋 아 . 근데 언제 담임 이 우리 를 많이 때리 는 것 같 애 ? " " 내 가 봤 을 땐 , 담임 이 빨간 넥타이 차 고 온 날 많이 때린 것 같 애 " " 야 . .. 그게 말 이 되 냐 ? 그건 우연 의 일치 일 뿐 이 야 " " 내 가 봤 을 땐 , 아침 조례 시간 의 얼굴 표정 이 거의 90 % 를 좌우 하 는 것 같 음 . 아침 에 실실 웃 으면 그날 은 잘 넘어가 고 , 아침 에 굳 은 표정 인 날 은 십 중 팔 구 타작 날 이 었 던 것 같 음 " " 내 경험 에 의하 면 , 지각 한 놈 이 있 는지 의 여부 도 중요 한 변수 였 던 것 같 음 . 아무 도 지각 을 안 한 날 은 때린 적 이 별로 없 었 던 것 같 고 , 지각 한 놈 이 하나 라도 있 으면 때린 적 이 많 았 던 것 같 음 ' 어떻 습니까 ? 나름 대로 자신 의 경험 에 입각 해서 담임 선생 님 이 체벌 할지 의 여부 에 영향 을 미치 는 다양 한 변수 를 제시 했 습니다 . 어떤 변수 는 타당 해 보이 고 , 어떤 것 은 그렇 지 않 아 보이 고 , 어떤 것 은 잘 모르 겠 습니다 . 이 처럼 어떤 결과 에 영향 을 미치 는 다양 한 변수 가 존재 할 때 , 이 변수 들 을 어떻게 적절히 순차 적 으로 조합 을 해서 판단 을 내려야 최종 적 으로 가장 정확 한 판단 을 내릴 수 있 을지 결정 하 는 방법 중 하나 가 decision tree 모델 입니다 . 이 체벌 예측 모델 에서 독립 변수 는 넥타이 색깔 , 아침 조례 때 의 얼굴 표정 , 지각 한 학생 의 존재 여부 등 이 고 , 종속 변수 는 당일 체 별 여부 가 되 겠 지요 ? 변수 가 많 다고 해서 이것 이 다 의미 있 는 정보 는 아닐 겁니다 . 예 를 들 어 , 넥타이 색깔 은 제 개인 적 인 경험 으로 체 별 여부 와 상관 성 이 상당히 낮 았 던 걸로 기억 합니다 . 하지만 , 상대 적 으로 아침 조례 시간 의 기분 상태 는 상당히 체 별 여부 와 상관 성 이 높 았 던 것 같 네요 . 이 처럼 , 설명력 이 다양 한 변수 가 혼재 되 어 있 는 경우 , 어떻게 분류 를 해야 정확 한 예측 을 할 수 있 을까요 ? 너무나 상식 적 인 얘기 지만 , 종속 변수 와 의 상관 성 과 설명력 이 가장 높 은 개별 변수 를 최우선 적 으로 이용 해서 분류 를 한 뒤 , 순차 적 으로 높 은 중요도 를 가진 변수 를 배치 하 여 예측 을 하 는 것 이 바람직 하 겠 지요 ? 그러 기 위해서 는 우선 데이터 를 통해 패턴 을 검증 할 필요 가 있 겠 습니다 . 우선 , 다음 과 같 은 방식 으로 데이터 를 수집 합니다 . 아래 에서 는 일부 만 예 를 든 것 입니다 . 데이터 의 개수 는 많 으면 많 을수록 좋 겠 지요 ? 날짜 넥타이 색깔 조례 때 표정 지각 학생 유무 당일 체벌 여부 5 월 1 일 빨간색 천진 난 만유 X 5 월 2 일 파란색 똥 씹 은 표 정유 O 5 월 3 일 파란색 천진 난 만무 X 5 월 4 일 빨간색 천진 난 만유 O 5 월 5 일 파란 식 똥 씹 은 표정 무 O 이렇게 데이터 를 수집 한 후 에 는 각각 의 변수 ( 넥타이 색깔 , 조례 때 표정 , 지각 학생 유무 ) 가 당일 체벌 유무 와 얼마나 높 은 정확도 를 지니 는지 개별 적 으로 확인 을 한 뒤 , 정확도 가 높 은 순 으로 결정 모델 을 만드 는 것 입니다 . 예 를 들 어 , 100 일 동안 위 와 같 은 방식 으로 데이터 를 100 개 수집 한 후 분석 해 봤 더니 , 다음 과 같 았 다고 가정 해 보 겠 습니다 . 빨간 넥타이 : 체벌 확률 50 %, 파란 넥타이 : 체벌 확률 50 % 천진난만 표정 : 체벌 확률 10 %, 똥 씹 은 표정 : 체벌 확률 90 % 지각 학생 없 음 : 체벌 확률 30 %, 지각 학생 존재 : 체벌 확률 70 % 이렇게 데이터 가 나왔 다면 , 체벌 여부 와 가장 연관 성 이 높 은 변수 는 조례 때 표정 이 고 , 다음 이 지각 학생 의 여부 , 마지막 으로 넥타이 색깔 이 므로 , 의사 결정 모델 도 이 순서 에 맞 게 짜 면 되 는 것 입니다 . 체벌 예측 모델 : 조례 때 표정 ---> 지각 학생 여부 ---> 넥타이 색깔 예 를 들 어 , 조례 때 똥 씹 은 표정 을 한 상태 에서 지각 학생 까지 있 었 다면 , 십 중 팔 구 그 날 은 얻 어 터질 가능 성 이 높 다고 판단 하 면 되 겠 지요 ? 사실 넥타이 색깔 같 은 변수 는 설명력 이 거의 없 기 때문 에 배제 해도 거의 무방 할 정도 겠 지요 . 만일 조례 때 는 천진난만 한 표정 을 지 었 으나 , 지각 학생 은 있 었 고 , 넥타이 는 파란 색인 , 약간 은 애매 한 상황 에 는 어떻게 예측 해야 할까요 ? 이런 경우 에 대한 정량 적 인 판단 은 Decision tree 알고리즘 의 계산 수치 에 근거 해서 내려지 게 됩니다 . 물론 , 앞서 예 를 든 ' 뻔히 보이 는 경우 ' 에 대한 판단 도 사실 은 다 정량 적 으로 수치 기반 으로 판정 이 내려 집니다 . 최대한 이해 하 기 쉬운 설명 을 위해 ' 정확도 ', ' 결과 와 의 상관 성 ' 같 은 약간 은 부 정확 한 용어 를 이용 해서 설명 을 했 지만 , 엄밀 하 게 표현 하 자면 분류 의 정확 도 기준 은 데이터 분포 의 불 순도 를 나타내 는 ' 엔트로피 ' 라는 개념 을 이용 해서 계산 을 합니다 . 데이터 의 불 순도 가 높 을수록 엔트로피 값 이 낮 아 지 고 , 불 순도 가 낮 을수록 엔트로피 값 이 높 아지므로 , 개별 변수 에 대한 엔트로피 값 을 계산 하 여 , 분류 의 순서 를 정하 는 방식 입니다 . Decision tree 의 수학 적 알고리즘 에 대한 세부 적 인 내용 은 인터넷 검색 을 통해 확인 하 시 기 바랍니다 . Decision tree 에 대한 다른 예 를 몇 개 확인 하 면 다음 과 같 습니다 . 아마 그림 만 보 셔도 어떤 개념 인지 이해 가 가리 라 생각 합니다 . < 타이타닉 호 승객 의 생존 여부 예측 모델 > < 스팸 메일 분류 알고리즘 > 3 . Decision tree 모델 의 확장 판 - Random forest 알고리즘 앞서 살펴본 바 와 같이 decision tree 모델 은 직관 적 이 고 이해 하 기 쉬운 장점 이 있 지만 , 치명 적 인 단점 이 하 나 있 는데 , 그것 은 과거 데이터 에 최적 화 된 구조 이 기 때문 에 , 새로운 데이터 가 들어오 거나 약간 변화 가 생기 는 경우 오히려 정확도 가 떨어질 수 있 다는 것 입니다 . 전형 적 인 과 최적화 문제 라고 보 시 면 되 겠 지요 . 이런 문제 를 극복 하 기 위한 모델 이 random forest 모델 입니다 . Random forest 모델 에서 는 , decision tree 모델 의 학습 데이터 전체 를 그대로 이용 하 는 것 이 아니 라 , 우선 데이터 중 일부 만 랜덤 하 게 선택 하 여 여러 개 의 학습 데이터 셋 을 만든 뒤 결과 를 검증 합니다 . 이후 , 각각 의 데이터 셋 의 결과 를 다수결 투표 하 듯 표결 한 뒤 ( 투표 , 확률 , 평균 등 ) 가장 높 은 가능 성 을 보이 는 쪽 으로 분류 하 는 방식 입니다 . Random forest 모델 에서 는 각 트리 들 의 편향 은 그대로 유지 가 되 면서 , 분산 은 감소 하 기 때문 에 보다 안정 적 이 면서 도 전반 적 인 정확 도 성능 도 높 아 지 게 됩니다 . 본 블로그 에서 도 지속 적 으로 언급 한 평균 모 멘 텀 분산 투자 전략 의 개념 ( 1 개 의 모 멘 텀 값 만 선정 해서 투자 하 지 않 고 1 ~ 12 개월 의 12 개 구간 에 분산 한 뒤 상대 적 비중 을 부여 하 는 방식 ) 도 random forest 알고리즘 의 철학 과 일부 통하 는 면 이 있 다고 볼 수 있 습니다 . 4 . Random forest 모델 을 이용 한 월간 모 멘 텀 투자 전략 본 블로그 에서 는 월간 모 멘 텀 이 라는 지극히 단순 한 지표 하나 만 가지 고 다양 한 변종 투자 전략 을 소개 하 고 있 습니다 . 이번 포스팅 에서 는 Random forest 알고리즘 을 월간 모 멘 텀 전략 에 적용 한 결과 를 소개 하 려 합니다 . 모 멘 텀 기간 값 을 어떤 것 을 쓸 것 이 냐 를 결정 하 는 방법 은 크 게 3 가지 로 구분 할 수 있 겠 습니다 . 첫 번 째 방법 은 , 6 개월 이나 12 개월 같이 고정 된 값 을 쓰 는 방법 인데 , 이렇게 고정 된 값 을 써도 큰 무리 는 없 지만 , 왜 하필 7 개월 이나 11 개월 은 아니 냐 라는 질문 에 대한 명쾌 한 답 을 주지 는 못 합니다 . 그저 장기간 백 테스트 해 보 니 이게 제일 잘 나와서 라는 경험 적 인 대답 밖 에 는 할 수 가 없 는 것 이 단점 입니다 . 두 번 째 방법 은 , 1 ~ 12 개월 타임 프레임 전체 에 분산 투자 하 는 방법 으로 , 블로그 에서 지속 적 으로 소개 한 바 있 습니다 . 최적 화 라는 과정 을 아예 제거 해 버렸 기 때문 에 과 최적화 의 위험 성 이 없 다는 장점 이 있 습니다 . 세 번 째 방법 은 , adaptive time frame 같이 시장 의 변동성 에 맞 게 실시간 으로 최적 주기 를 조절 하 는 방법 인데 , 단순히 고정 된 모 멘 텀 값 을 쓰 는 방법 보다 는 진일보 한 방식 이 라고 볼 수 있 겠 습니다 . Random forest 모델 을 이용 한 월간 모 멘 텀 투자 전략 에서 는 , 1 개월 모 멘 텀 , 2 개월 모 멘 텀 , 3 개월 모 멘 텀 . ...... 12 개월 모 멘 텀 의 12 개 의 변수 를 독립 변수 로 하 고 , 다음 달 주가 상승 여부 를 종속 변수 로 지정 한 뒤 random forest 알고리즘 을 돌립니다 . 12 개 의 변수 를 통해 생성 된 여러 개 의 decision tree 들 을 기반 으로 , 매월 다수결 투표 를 해서 다음 달 상승 으로 예측 되 면 종목 보유 , 하락 으로 예측 되 면 현금 을 보유 하 는 방식 입니다 . 시장 은 끊임없이 변하 므로 학습 데이터 는 최근 12 개월 간 의 데이터 를 이용 해서 매달 최신 데이터 에 맞 게 업데이트 하 는 방식 입니다 . KOSPI 지수 를 대상 으로 시뮬레이션 한 결과 는 아래 와 같 습니다 . ( 모든 머신 러닝 알고리즘 이 마찬가지 이 지만 , 알고리즘 의 개념 은 이해 할 수 있 어도 , 실제 데이터 에 알고리즘 이 적용 되 어 산출 된 수학 적 인 결과 값 은 직관 적 으로 이해 하 기 는 어렵 습니다 . 따라서 , 수익 곡선 이 상대 적 으로 양호 하 게 나타나 는 구간 과 상대 적 으로 언더 퍼 폼 하 는 구간 을 이해 하 고 , 실제 투자 과정 에서 직관 적 이 지 못한 것 과 의 괴리 감 을 줄이 기 위해서 는 전통 적 인 트레이딩 모델 을 접목 하 는 것 이 중요 한 과제 라고 생각 합니다 . ) 5 . Random forest 알고리즘 파이썬 코드 import pandas as pdimport matplotlib . pyplot as pltimport numpy as npimport pandas _ datareader . data as webfrom sklearn import neighbors , svmfrom sklearn . ensemble import R andomForestClassifierfrom sklearn . linear _ model import LogisticRegression def price ( stock , start ) : price = web . DataReader ( name = stock , data _ source =' yahoo ', start = start ) [ ' Adj Close '] return price . div ( price . iat [ 0 ] ) . resample ( ' M '). last ( ) . to _ frame ( ' price ') a = price ( '^ KS 11 ',' 2000 - 01 - 01 ') a [ ' cash '] = [ ( 1 . 03 **( 1 / 12 ) ) ** x for x in range ( len ( a . index ) ) ] a [ ' R 1 '] = a . price . shift ( 1 ) / a . price . shift ( 2 ) a [ ' R 2 '] = a . price . shift ( 2 ) / a . price . shift ( 3 ) a [ ' R 3 '] = a . price . shift ( 3 ) / a . price . shift ( 4 ) a [ ' R 4 '] = a . price . shift ( 4 ) / a . price . shift ( 5 ) a [ ' R 5 '] = a . price . shift ( 5 ) / a . price . shift ( 6 ) a [ ' R 6 '] = a . price . shift ( 6 ) / a . price . shift ( 7 ) a [ ' R 7 '] = a . price . shift ( 7 ) / a . price . shift ( 8 ) a [ ' R 8 '] = a . price . shift ( 8 ) / a . price . shift ( 9 ) a [ ' R 9 '] = a . price . shift ( 9 ) / a . price . shift ( 10 ) a [ ' R 10 '] = a . price . shift ( 10 ) / a . price . shift ( 11 ) a [ ' R 11 '] = a . price . shift ( 11 ) / a . price . shift ( 12 ) a [ ' R 12 '] = a . price . shift ( 12 ) / a . price . shift ( 13 ) a [ ' rollingstd '] = a . price . pct _ change ( ) . shift ( 1 ) . rolling ( 12 ) . std ( ) a [ ' result '] = np . where ( a . price > a . price . shift ( 1 ) , 1 , 0 ) a = a . dropna ( ) clf 1 = neighbors . KNeighborsClassifier ( n _ neighbors = 3 ) clf 2 = svm . SVC ( ) clf 3 = RandomForestClassifier ( 10 ) clf 4 = LogisticRegression ( ) a [ ' predicted ']= pd . Series ( ) for i in range ( 12 , len ( a . index ) ) : x = a . iloc [ i - 12 : i , 2 : 15 ] y = a [ ' result '][ i - 12 : i ] clf 3 . fit ( x , y ) a [ ' predicted '][ i ] = clf 3 . predict ( x ) [ - 1 ] a = a . dropna ( ) a . price = a . price . div ( a . price . ix [ 0 ] ) print ( a ) accuracy = clf 3 . score ( a . iloc [ : , 2 : 15 ] , a [ ' result ']) a [ ' Random forest '] = np . where ( a . predicted . shift ( 1 ) == 1 , a . price / a . price . shift ( 1 ) , 1 . 0026 ) . cumprod ( ) a [ [ ' Random forest ',' price ']]. plot ( ) plt . show ( ) print ( " Predicted model accuracy : "+ str ( accuracy ) ) ( 무료 종목 추천 및 포트폴리오 비중 정보 를 제공 합니다 . 관심 있 으신 분 은 여기 를 클릭 하 셔서 회원 가입 해 주 세요 ~)( 본 블로그 에 소개 된 시황 과 무관 한 절대 수익 전략 을 이용 한 ETF 투자 상품 을 출시 하 려고 합니다 . 자세 한 정보 는 여기 를 클릭 하 시 기 바랍니다 . ) 여러분 의 인생 이 걸린 너무나 도 중요 한 소식 ! --- > 여기 를 클릭 하 세요 ! 카카오스토리 트위터 페이스북