멀티팩터 기반 주식 데이터 수집 패키지
Project description
MultiFactor 📈
MultiFactor는 국내상장주식(코스피/코스닥)을 대상으로 멀티팩터(Multi-Factor) 전략을 손쉽게 적용하고, 팩터별 점수 및 종합 순위를 산출해 주는 파이썬 패키지입니다.
종목별 주가와 재무 데이터 수집은 FinanceDataReader를 기반으로 구동됩니다.
📌 멀티팩터 전략이란?
주식 투자에서 멀티팩터(Multi-Factor) 기법은 주가의 수익률에 영향을 미치는 여러 가지 핵심 요인(팩터)을 동시에 고려하여 종목을 고르고 포트폴리오를 운용하는 데이터에 기반한 정량적 투자 전략입니다.
단순히 '저평가된 주식'만 찾거나 '상승 추세인 주식'만 사는 것이 아니라, 다양한 성공 요소를 결합하여 단일 팩터의 약점을 보완하고 보다 안정적인 초과 수익을 추구합니다. MultiFactor 라이브러리는 다음 3가지 핵심 팩터의 점수를 계산하고 이를 종합점수로 환산한 후 순위화한 결과를 제공합니다.
| 팩터 (Factor) | 핵심 개념 | 주요 지표 |
|---|---|---|
| 모멘텀 (Momentum) | 과거에 우수한 성과를 보인 주식이 미래에도 상승 추세를 이어갈 것이라는 가정 | 주가 상승률, 거래량 |
| 밸류 (Value) | 기업의 내재 가치 대비 저평가된 주식을 발굴 | PER, PBR |
| 퀄리티 (Quality) | 우량한 펀더멘털, 안정적인 수익성, 장기 성장 잠재력을 갖춘 기업에 집중 | 매출성장률, 영업이익성장률, ROE |
✨ 주요 기능
- 국내 주식 멀티팩터 데이터 제공: 가치, 모멘텀, 퀄리티 지표 및 이를 합산한 종합 점수 산출
| 구분 | 주요 기능 | 함수명 |
|---|---|---|
| 종목 정보 수집 | 시가총액 기준 상위 종목들의 기본 정보(종목코드, 종목명, 시가총액, 업종, 최근 종가 등)를 수집합니다. | get_stockinfo() |
| 멀티팩터 종합점수 | 종목별 멀티팩터 세부 지표 점수와 종합 점수, 그리고 전체 순위를 산출합니다. | get_score() |
| 투자스타일별 종합점수 | 3가지 투자 스타일(안정추구, 추세성장, 역발상 등)에 맞춰 가중치가 조정된 멀티팩터 종합 점수를 제공합니다. | get_score_adj_weight() |
| 종합점수 그룹화 | 산출된 종합 점수를 바탕으로 전체 종목을 N개의 그룹으로 분류하고, 그룹별 종목명을 출력합니다. | get_Ngroup() |
| 특정 종목 팩터 조회 | 단일 종목에 대한 개별 팩터(모멘텀, 밸류, 퀄리티) 값을 빠르게 조회합니다. | get_momentum_one() get_value_one() get_quality_one() |
- 투자 유형별 가중치 조절한 멀티팩터 데이터 제공 : 투자 스타일에 맞춘 3가지 모델 제공
- 가치성장: 밸류 + 퀄리티 조합 ("기업의 본질적인 가치와 안정성을 중요하게 생각하며, 장기적인 관점에서 투자")
- 추세성장: 모멘텀 + 밸류 조합 ("시장의 흐름과 성장을 중요하게 생각하고, 주가 상승에 적극적으로 참여")
- 역발상: 밸류 + 모멘텀 조합 ("저평가 종목이 다시 반등하는 시점을 찾아 투자 기회를 포착")
⚙️ 설치 방법 (Installation)
다음 코드를 실행하여 각자의 PC(또는 실습 환경)에 MultiFactor 라이브러리를 설치합니다. 이 과정은 최초 1회만 수행하면 됩니다.
!pip install MultiFactor
만약 기존에 설치된 라이브러리를 최신 버전으로 업데이트해야 한다면 아래의 코드를 실행합니다.
!pip install --upgrade MultiFactor
🚀 빠른 시작 (Quick Start)
1. 패키지 불러오기
다음 코드로 멀티팩터 패키지를 불러옵니다.
from MultiFactor import MultiFactor
2. 멀티팩터 객체 생성
멀티팩터 객체 생성 시, 수집 대상 종목 수(N)를 반드시 지정해야 합니다. N은 시가총액 상위 순으로 N개까지 종목을 수집함을 의미합니다. N이 커질수록 데이터 수집 시간이 길어지므로, 초기 테스트에는 종목수(N)를 5~50 사이로 지정한 후 차츰 늘려가기를 권장합니다.
mf = MultiFactor(N=50) # 시가총액 상위 50개 종목
3. 종목 정보 수집
멀티팩터 객체에서 지정한 종목수(N) 만큼 종목 정보 데이터를 생성합니다. 반환되는 데이터 형식은 데이터프레임(기본값) 또는 딕셔너리로 지정할 수 있습니다.
# 종목 코드 정보 생성 (데이터프레임)
df = mf.get_stockinfo()
# 종목코드, 종목명, 시가총액 출력 (최초 5건)
df[['Code', 'Name', 'Marcap']].head()
| Code | Name | Marcap | |
|---|---|---|---|
| 0 | 005930 | 삼성전자 | 1147817793075800 |
| 1 | 000660 | SK하이닉스 | 691321294050000 |
| 2 | 005380 | 현대차 | 106883553852000 |
| 3 | 373220 | LG에너지솔루션 | 89037000000000 |
| 4 | 402340 | SK스퀘어 | 77535136505000 |
# 종목 코드 정보 생성 (딕셔너리)
stock_list = mf.get_stockinfo(dtype='dic') # {'종목코드': '종목명'}
print(stock_list)
# {'005930': '삼성전자', '000660': 'SK하이닉스', '005380': '현대차', ... }
4.멀티팩터 종합 점수 데이터 수집
get_score함수로 멀티팩터 종합점수 데이터를 간단하게 생성할 수 있습니다. 다음 코드는 시가총액 상위 10개 종목의 종합 점수를 추출하여 파이썬 데이터프레임(df)에 저장합니다.
from MultiFactor import MultiFactor
mf = MultiFactor(N=10)
df = mf.get_score()
이 데이터프레임 안에는 분석에 필요한 총 23개의 컬럼(열)이 담겨 있습니다. 컬럼은 크게 4개 유형을 구분할 수 있습니다.
- 종목정보 : 종목코드, 종목명
- 종합지표 원본 : 모멘텀 주가, 모멘텀 거래량, PER, PBR, 매출 증가율, 영업이익 증가율, 순이익 증가율, ROE
- 종합지표 순위 :종합 지표 원본 데이터를 추출된 N개 종목 내에서의 상대 순위로 환산한 값
- 종합점수/순위 : 종합 지표 순위들의 평균값 및 이를 바탕으로 매긴 최종 순위
① 종합지표 원본 추출 예시
종합지표 원본 데이터를 출력하여 결과를 해석합니다.
cols = ['scode', 'sname', 'mom_price', 'mom_vol', 'PER', 'PBR',
'revenue_rate', 'oper_income_rate', 'net_income_rate', 'ROE']
df[cols].head()
| scode | sname | mom_price | mom_vol | PER | PBR | revenue_rate | oper_income_rate | net_income_rate | ROE | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 402340 | SK스퀘어 | 105.54 | 2.99 | 5.54 | 1.73 | 9.76 | 17.12 | 32.01 | 37.08 |
| 1 | 000660 | SK하이닉스 | 80.87 | -9.40 | 11.03 | 3.73 | 34.27 | 68.40 | 21.02 | 44.14 |
| 2 | 005930 | 삼성전자 | 47.69 | -17.79 | 17.89 | 1.82 | 9.04 | 65.00 | 60.66 | 10.78 |
| 3 | 000270 | 기아 | 14.42 | -32.69 | 6.38 | 0.77 | -2.09 | 26.00 | 3.40 | 12.91 |
| 4 | 105560 | KB금융 | 22.34 | -17.47 | 6.59 | 0.52 | -37.96 | 9.47 | -5.29 | 9.50 |
② 종합지표 순위 추출 예시
cols = ['scode', 'sname', '모멘텀_주가', '모멘텀_거래량', '밸류_PER', '밸류_PBR',
'퀄리티_ROE', '퀄리티_매출증가', '퀄리티_영업이익증가', '퀄리티_순이익증가']
df[cols].head()
| scode | sname | 모멘텀_주가 | 모멘텀_거래량 | 밸류_PER | 밸류_PBR | 퀄리티_ROE | 퀄리티_매출증가 | 퀄리티_영업이익증가 | 퀄리티_순이익증가 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 402340 | SK스퀘어 | 10 | 10 | 10 | 40 | 20 | 40 | 50 | 30 |
| 1 | 000660 | SK하이닉스 | 20 | 30 | 50 | 80 | 10 | 10 | 10 | 40 |
| 2 | 005930 | 삼성전자 | 40 | 50 | 60 | 50 | 60 | 50 | 20 | 10 |
| 3 | 000270 | 기아 | 80 | 60 | 20 | 30 | 50 | 80 | 40 | 50 |
| 4 | 105560 | KB금융 | 70 | 40 | 30 | 10 | 70 | 90 | 60 | 60 |
③ 종합점수/순위 추출 예시
cols = ['scode', 'sname', '종합점수', '종합순위', '종합순위_퍼센트']
df[cols].head()
| scode | sname | 종합점수 | 종합순위 | 종합순위_퍼센트 | |
|---|---|---|---|---|---|
| 0 | 402340 | SK스퀘어 | 26 | 1 | 10 |
| 1 | 000660 | SK하이닉스 | 31 | 2 | 20 |
| 2 | 005930 | 삼성전자 | 42 | 3 | 30 |
| 3 | 000270 | 기아 | 51 | 4 | 40 |
| 4 | 105560 | KB금융 | 54 | 5 | 50 |
5. 투자 스타일별 종합점수 출력
3가지로 분류된 투자 유형별로 멀티팩터 종합 점수 데이터를 생성할 수 있습니다.
# 시가총액 상위 100 종목 멀티팩터 종합점수 추출
mf = MultiFactor(N=100)
df = mf.get_score()
① 가치 성장 전략 : 밸류 + 퀄리티 조합
df = mf.get_score_adj_weight(df, weight='가치성장')
df[['scode', 'sname', '종합점수', '종합순위']].head()
| scode | sname | 종합점수 | 종합순위 | |
|---|---|---|---|---|
| 0 | 028050 | 삼성E&A | 24 | 1 |
| 1 | 267250 | HD현대 | 24 | 2 |
| 2 | 064400 | LG씨엔에스 | 25 | 3 |
| 3 | 000660 | SK하이닉스 | 26 | 4 |
| 4 | 402340 | SK스퀘어 | 27 | 5 |
② 추세 성장 전략 : 모멘텀 + 퀄리티 조합
df = mf.get_score_adj_weight(df, weight='추세성장')
df[['scode', 'sname', '종합점수', '종합순위']].head()
| scode | sname | 종합점수 | 종합순위 | |
|---|---|---|---|---|
| 0 | 278470 | 에이피알 | 12 | 1 |
| 1 | 000660 | SK하이닉스 | 14 | 2 |
| 2 | 402340 | SK스퀘어 | 18 | 3 |
| 3 | 010120 | LS ELECTRIC | 20 | 4 |
| 4 | 028050 | 삼성E&A | 22 | 5 |
③ 역발상 전략 : 밸류 + 모멘텀 조합
df = mf.get_score_adj_weight(df, weight='역발상')
df[['scode', 'sname', '종합점수', '종합순위']].head()
| scode | sname | 종합점수 | 종합순위 | |
|---|---|---|---|---|
| 0 | 000880 | 한화 | 16 | 1 |
| 1 | 039490 | 키움증권 | 19 | 2 |
| 2 | 006800 | 미래에셋증권 | 19 | 3 |
| 3 | 047040 | 대우건설 | 20 | 4 |
| 4 | 071050 | 한국금융지주 | 22 | 6 |
6. 종합점수별 그룹화 출력
get_Ngroup() 함수를 사용하면 전체 종목을 원하는 개수의 그룹으로 깔끔하게 묶어 요약할 수 있습니다.
mf = MultiFactor(N=100)
df = mf.get_score()
mf.get_Ngroup(df, Ngroup=10) # 종합점수 상위 순 10개 그룹으로 분류
# [출력 결과]
# 1 : SK스퀘어, SK하이닉스, 삼성E&A, HD현대, 에이피알, 한국금융지주, 삼성전자, LG이노텍, 키움증권, LS ELECTRIC
# 2 : 효성중공업, NH투자증권, 이수페타시스, 삼성물산, 삼성증권, HD현대일렉트릭, LG씨엔에스, LS, HD한국조선해양, 현대건설
# 3 : 코오롱티슈진, 한화, 고려아연, 하나금융지주, JB금융지주, 미래에셋증권, KB금융, 삼천당제약, 기업은행, 엘앤에프
# 4 : DB손해보험, 기아, 한전기술, 셀트리온, 우리금융지주, 펩트론, BNK금융지주, 대우건설, 한국항공우주, 현대글로비스
# 5 : 삼성생명, 신한지주, HD현대중공업, 한화에어로스페이스, 현대모비스, 한화솔루션, 현대차, 삼양식품, 삼성카드, 에이비엘바이오
# 6 : SK바이오팜, LG유플러스, 한미약품, S-Oil, GS, KT, 한화오션, 삼성화재, 두산, 삼성전기
# 7 : SK텔레콤, 카카오뱅크, 한국전력, 한국타이어앤테크놀로지, HMM, 삼성중공업, 포스코인터내셔널, SK, 현대로템, 카카오페이
# 8 : 대한항공, 현대오토에버, CJ, LIG넥스원, 삼성SDI, HD건설기계, HD현대마린솔루션, 두산에너빌리티, 크래프톤, 하이브
# 9 : HLB, 삼성에스디에스, KT&G, 아모레퍼시픽, 유한양행, 한화시스템, SK이노베이션, LG전자, 삼성에피스홀딩스, NAVER
# 10 : LG, 레인보우로보틱스, 한미반도체, POSCO홀딩스, LG에너지솔루션, 카카오, LG화학, 삼성바이오로직스, 한진칼, 포스코퓨처엠
7. 개별 지표 데이터 수집
특정 팩터의 데이터만 개별적으로 추출할 수 있습니다.
# 개별 팩터 데이터 추출 (인자로 stock_list 딕셔너리 주입)
data_mom = mf.get_momentum(stock_list)
data_val = mf.get_value(stock_list)
data_fin = mf.get_quality(stock_list)
# 추출한 개별 팩터 데이터를 조합하여, 종합 점수 산정
data_mast_custom = mf.get_score_by_data(data_mom, data_val, data_fin)
8. 특정 종목 팩터 값 조회
개별 종목(예: 삼성전자 '005930')의 팩터 점수만 빠르게 확인하고 싶을 때 활용합니다.
# 삼성전자의 모멘텀 데이터
mf.get_momentum_one('005930')
| scode | mom_price | mom_vol | |
|---|---|---|---|
| 0 | 005930 | 62.531321 | -40.739685 |
# 삼성전자의 밸류 데이터
mf.get_value_one('005930')
| scode | PER | PBR | |
|---|---|---|---|
| 0 | 005930 | 17.89 | 1.82 |
# 삼성전자의 퀄리티 데이터
mf.get_quality_one('005930')
| scode | revenue_rate | oper_income_rate | net_income_rate | ROE | |
|---|---|---|---|---|---|
| 0 | 005930 | 9.03503 | 64.997 | 60.659103 | 10.78 |
⚠️ 투자자 유의사항 (Disclaimer)
MultiFactor 라이브러리에서 제공하는 모든 데이터와 분석 결과(종합 점수, 순위 등)는 투자 참고용일 뿐이며, 그 정확성이나 완전성을 보장하지 않습니다.
- 본 라이브러리는 종목 추천을 목적으로 하지 않으며, 과거의 데이터나 높은 팩터 점수가 미래의 수익을 보장하지 않습니다.
- 데이터 수집 과정에서 지연, 누락, 오류가 발생할 수 있습니다.
- 본 라이브러리의 결과물을 활용한 투자 결정으로 인해 발생하는 어떠한 직·간접적인 손실에 대해서도 개발자(저자)는 일체의 법적 책임을 지지 않습니다.
- 최종 투자 판단과 그에 따른 책임은 전적으로 투자자 본인에게 있습니다.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file multifactor-0.2.1.tar.gz.
File metadata
- Download URL: multifactor-0.2.1.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fdbc53d64f41c7817011940fae52a3731a3d94f050fd85164bd4e0b85a911f5
|
|
| MD5 |
8121c7404c6d7c2dbf10405a8bc56540
|
|
| BLAKE2b-256 |
fafadbe3f0d8b573ae0076f3062cacbd47f3ac2435296a00958540c8bb839626
|
File details
Details for the file multifactor-0.2.1-py3-none-any.whl.
File metadata
- Download URL: multifactor-0.2.1-py3-none-any.whl
- Upload date:
- Size: 23.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d193a158b9cc55cc6ef7994cf0c478fc32b3b3176ef554f6882831b423062f95
|
|
| MD5 |
23684b935facf88a2fc2009e329ede00
|
|
| BLAKE2b-256 |
eca747450d90a7876c239d32acc9a429268a095f62c11baa0db30367ff56cebc
|