MultiFactor 0.2.4__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {multifactor-0.2.4 → multifactor-0.2.5}/PKG-INFO +7 -7
- {multifactor-0.2.4 → multifactor-0.2.5}/README.md +6 -6
- {multifactor-0.2.4 → multifactor-0.2.5}/pyproject.toml +1 -1
- multifactor-0.2.5/src/MultiFactor/__init__.py +18 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/core.py +1 -1
- multifactor-0.2.5/src/MultiFactor/us_stockinfo.py +74 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor.egg-info/PKG-INFO +7 -7
- multifactor-0.2.4/src/MultiFactor/__init__.py +0 -8
- multifactor-0.2.4/src/MultiFactor/us_stockinfo.py +0 -53
- {multifactor-0.2.4 → multifactor-0.2.5}/setup.cfg +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/momentum.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/momentum_one.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/quality.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/quality_one.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/score.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/score_adj_weight.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/stockinfo.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/us_core.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/us_momentum.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/us_quality.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/us_value.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/value.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor/value_one.py +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor.egg-info/SOURCES.txt +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor.egg-info/dependency_links.txt +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor.egg-info/requires.txt +0 -0
- {multifactor-0.2.4 → multifactor-0.2.5}/src/MultiFactor.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MultiFactor
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: 멀티팩터 기반 주식 데이터 수집 패키지
|
|
5
5
|
Author-email: HANHO <hanhoman@gmail.com>
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -73,7 +73,7 @@ Requires-Dist: yfinance
|
|
|
73
73
|
### 1. 패키지 불러오기
|
|
74
74
|
다음 코드로 멀티팩터 패키지를 불러옵니다.
|
|
75
75
|
```python
|
|
76
|
-
from MultiFactor import
|
|
76
|
+
from MultiFactor import MultiFactorKR
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
<br>
|
|
@@ -81,7 +81,7 @@ from MultiFactor import MultiFactor
|
|
|
81
81
|
### 2. 멀티팩터 객체 생성
|
|
82
82
|
멀티팩터 객체 생성 시, 수집 대상 종목 수(N)를 반드시 지정해야 합니다. N은 시가총액 상위 순으로 N개까지 종목을 수집함을 의미합니다. N이 커질수록 데이터 수집 시간이 길어지므로, 초기 테스트에는 종목수(N)를 5~50 사이로 지정한 후 차츰 늘려가기를 권장합니다.
|
|
83
83
|
```python
|
|
84
|
-
mf =
|
|
84
|
+
mf = MultiFactorKR(N=50) # 시가총액 상위 50개 종목
|
|
85
85
|
```
|
|
86
86
|
<br>
|
|
87
87
|
|
|
@@ -154,8 +154,8 @@ print(stock_list)
|
|
|
154
154
|
```get_score```함수로 멀티팩터 종합점수 데이터를 간단하게 생성할 수 있습니다. 다음 코드는 시가총액 상위 10개 종목의 종합 점수를 추출하여 파이썬 데이터프레임(df)에 저장합니다.
|
|
155
155
|
|
|
156
156
|
```python
|
|
157
|
-
from MultiFactor import
|
|
158
|
-
mf =
|
|
157
|
+
from MultiFactor import MultiFactorKR
|
|
158
|
+
mf = MultiFactorKR(N=10)
|
|
159
159
|
df = mf.get_score()
|
|
160
160
|
```
|
|
161
161
|
|
|
@@ -428,7 +428,7 @@ df[cols].head()
|
|
|
428
428
|
|
|
429
429
|
```python
|
|
430
430
|
# 시가총액 상위 100 종목 멀티팩터 종합점수 추출
|
|
431
|
-
mf =
|
|
431
|
+
mf = MultiFactorKR(N=100)
|
|
432
432
|
df = mf.get_score()
|
|
433
433
|
```
|
|
434
434
|
|
|
@@ -606,7 +606,7 @@ df[['scode', 'sname', '종합점수', '종합순위']].head()
|
|
|
606
606
|
get_Ngroup() 함수를 사용하면 전체 종목을 원하는 개수의 그룹으로 깔끔하게 묶어 요약할 수 있습니다.
|
|
607
607
|
|
|
608
608
|
```python
|
|
609
|
-
mf =
|
|
609
|
+
mf = MultiFactorKR(N=100)
|
|
610
610
|
df = mf.get_score()
|
|
611
611
|
mf.get_Ngroup(df, Ngroup=10) # 종합점수 상위 순 10개 그룹으로 분류
|
|
612
612
|
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
### 1. 패키지 불러오기
|
|
57
57
|
다음 코드로 멀티팩터 패키지를 불러옵니다.
|
|
58
58
|
```python
|
|
59
|
-
from MultiFactor import
|
|
59
|
+
from MultiFactor import MultiFactorKR
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
<br>
|
|
@@ -64,7 +64,7 @@ from MultiFactor import MultiFactor
|
|
|
64
64
|
### 2. 멀티팩터 객체 생성
|
|
65
65
|
멀티팩터 객체 생성 시, 수집 대상 종목 수(N)를 반드시 지정해야 합니다. N은 시가총액 상위 순으로 N개까지 종목을 수집함을 의미합니다. N이 커질수록 데이터 수집 시간이 길어지므로, 초기 테스트에는 종목수(N)를 5~50 사이로 지정한 후 차츰 늘려가기를 권장합니다.
|
|
66
66
|
```python
|
|
67
|
-
mf =
|
|
67
|
+
mf = MultiFactorKR(N=50) # 시가총액 상위 50개 종목
|
|
68
68
|
```
|
|
69
69
|
<br>
|
|
70
70
|
|
|
@@ -137,8 +137,8 @@ print(stock_list)
|
|
|
137
137
|
```get_score```함수로 멀티팩터 종합점수 데이터를 간단하게 생성할 수 있습니다. 다음 코드는 시가총액 상위 10개 종목의 종합 점수를 추출하여 파이썬 데이터프레임(df)에 저장합니다.
|
|
138
138
|
|
|
139
139
|
```python
|
|
140
|
-
from MultiFactor import
|
|
141
|
-
mf =
|
|
140
|
+
from MultiFactor import MultiFactorKR
|
|
141
|
+
mf = MultiFactorKR(N=10)
|
|
142
142
|
df = mf.get_score()
|
|
143
143
|
```
|
|
144
144
|
|
|
@@ -411,7 +411,7 @@ df[cols].head()
|
|
|
411
411
|
|
|
412
412
|
```python
|
|
413
413
|
# 시가총액 상위 100 종목 멀티팩터 종합점수 추출
|
|
414
|
-
mf =
|
|
414
|
+
mf = MultiFactorKR(N=100)
|
|
415
415
|
df = mf.get_score()
|
|
416
416
|
```
|
|
417
417
|
|
|
@@ -589,7 +589,7 @@ df[['scode', 'sname', '종합점수', '종합순위']].head()
|
|
|
589
589
|
get_Ngroup() 함수를 사용하면 전체 종목을 원하는 개수의 그룹으로 깔끔하게 묶어 요약할 수 있습니다.
|
|
590
590
|
|
|
591
591
|
```python
|
|
592
|
-
mf =
|
|
592
|
+
mf = MultiFactorKR(N=100)
|
|
593
593
|
df = mf.get_score()
|
|
594
594
|
mf.get_Ngroup(df, Ngroup=10) # 종합점수 상위 순 10개 그룹으로 분류
|
|
595
595
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# src/MultiFactor/__init__.py
|
|
2
|
+
import warnings
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
# 1. 모든 로그 비활성 (라이브러리 내부 chatter 차단)
|
|
7
|
+
logging.disable(logging.CRITICAL)
|
|
8
|
+
# 2. 모든 경고 무시
|
|
9
|
+
warnings.filterwarnings("ignore")
|
|
10
|
+
# 3. 환경 변수 수준에서 무시
|
|
11
|
+
os.environ['PYTHONWARNINGS'] = 'ignore'
|
|
12
|
+
|
|
13
|
+
# 같은 폴더의 core.py/us_core.py에서 클래스를 가져옵니다.
|
|
14
|
+
from .core import MultiFactorKR
|
|
15
|
+
from .us_core import MultiFactorUS
|
|
16
|
+
|
|
17
|
+
# 패키지를 import할 때 노출할 항목을 명시합니다.
|
|
18
|
+
__all__ = ['MultiFactorKR', 'MultiFactorUS']
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import FinanceDataReader as fdr
|
|
2
|
+
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
def get_us_stockinfo(N=500):
|
|
7
|
+
"""
|
|
8
|
+
미국 종목정보 추출 (GitHub 시가총액 데이터 + FDR 상세정보 병합)
|
|
9
|
+
"""
|
|
10
|
+
url = "https://raw.githubusercontent.com/Ate329/top-us-stock-tickers/master/tickers/sp500.csv"
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
# 1. GitHub에서 최신 S&P 500 데이터 로드 (시가총액 등 순위용)
|
|
14
|
+
df = pd.read_csv(url)
|
|
15
|
+
|
|
16
|
+
# 2. FDR에서 KR/US 전체 상장 종목 정보 로드 (명칭 일관성 유지)
|
|
17
|
+
df_sp500 = fdr.StockListing('S&P500')
|
|
18
|
+
df_nasdaq = fdr.StockListing('NASDAQ')
|
|
19
|
+
df_nyse = fdr.StockListing('NYSE')
|
|
20
|
+
|
|
21
|
+
# 3. FDR 데이터 병합 및 중복 제거
|
|
22
|
+
fdr_stocks = pd.concat([df_sp500, df_nasdaq, df_nyse])
|
|
23
|
+
fdr_stocks = fdr_stocks.drop_duplicates(subset='Symbol')
|
|
24
|
+
|
|
25
|
+
# 4. Symbol 기준으로 조인하여 FDR의 Name을 사용
|
|
26
|
+
# fdr_stocks 에는 Symbol, Name, Sector, Industry 컬럼이 포함됨
|
|
27
|
+
df = df.merge(fdr_stocks[['Symbol', 'Name']], left_on='symbol', right_on='Symbol', how='left')
|
|
28
|
+
|
|
29
|
+
# 5. 컬럼명을 기존 시스템과 동일하게 변경 (GitHub의 name 대신 FDR의 Name 사용)
|
|
30
|
+
column_map = {
|
|
31
|
+
'symbol': 'Code',
|
|
32
|
+
'Name': 'Name',
|
|
33
|
+
'marketCap': 'MarketCap',
|
|
34
|
+
'industry': 'Industry',
|
|
35
|
+
'price': 'Price',
|
|
36
|
+
'volume': 'Volume'
|
|
37
|
+
}
|
|
38
|
+
df = df.rename(columns=column_map)
|
|
39
|
+
|
|
40
|
+
# 6. 시가총액 순으로 내림차순 정렬
|
|
41
|
+
if 'MarketCap' in df.columns:
|
|
42
|
+
df = df.sort_values(by='MarketCap', ascending=False)
|
|
43
|
+
|
|
44
|
+
except Exception as e:
|
|
45
|
+
print(f"데이터 로드 및 상세 정보 병합 실패: {e}. 기본 FDR 방식으로 전환합니다.")
|
|
46
|
+
try:
|
|
47
|
+
df_sp500 = fdr.StockListing('S&P500')
|
|
48
|
+
df_nasdaq = fdr.StockListing('NASDAQ')
|
|
49
|
+
df_nyse = fdr.StockListing('NYSE')
|
|
50
|
+
df = pd.concat([df_sp500, df_nasdaq, df_nyse]).drop_duplicates(subset='Symbol')
|
|
51
|
+
except:
|
|
52
|
+
df_nasdaq = fdr.StockListing('NASDAQ')
|
|
53
|
+
df_nyse = fdr.StockListing('NYSE')
|
|
54
|
+
df = pd.concat([df_nasdaq, df_nyse]).drop_duplicates(subset='Symbol')
|
|
55
|
+
|
|
56
|
+
if 'Symbol' in df.columns:
|
|
57
|
+
df = df.rename(columns={'Symbol': 'Code'})
|
|
58
|
+
|
|
59
|
+
# 7. 종목코드 클렌징 (yfinance 호환을 위해 / 를 - 로 변경. 예: BRK/B -> BRK-B)
|
|
60
|
+
if 'Code' in df.columns:
|
|
61
|
+
df['Code'] = df['Code'].str.replace('/', '-', regex=False)
|
|
62
|
+
|
|
63
|
+
# 8. 상위 N개 추출 및 인덱스 초기화
|
|
64
|
+
df = df.head(N).reset_index(drop=True)
|
|
65
|
+
|
|
66
|
+
# 9. 요청된 필수 컬럼만 필터링 (Code, Name, Price, MarketCap, Volume, Industry)
|
|
67
|
+
target_cols = ['Code', 'Name', 'Price', 'MarketCap', 'Volume', 'Industry']
|
|
68
|
+
# 존재하는 컬럼만 선택 (fallback 시 일부 컬럼이 없을 수 있음 대비)
|
|
69
|
+
available_cols = [col for col in target_cols if col in df.columns]
|
|
70
|
+
df = df[available_cols]
|
|
71
|
+
|
|
72
|
+
print("미국 종목 추출 건수 ", len(df))
|
|
73
|
+
|
|
74
|
+
return df
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MultiFactor
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: 멀티팩터 기반 주식 데이터 수집 패키지
|
|
5
5
|
Author-email: HANHO <hanhoman@gmail.com>
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -73,7 +73,7 @@ Requires-Dist: yfinance
|
|
|
73
73
|
### 1. 패키지 불러오기
|
|
74
74
|
다음 코드로 멀티팩터 패키지를 불러옵니다.
|
|
75
75
|
```python
|
|
76
|
-
from MultiFactor import
|
|
76
|
+
from MultiFactor import MultiFactorKR
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
<br>
|
|
@@ -81,7 +81,7 @@ from MultiFactor import MultiFactor
|
|
|
81
81
|
### 2. 멀티팩터 객체 생성
|
|
82
82
|
멀티팩터 객체 생성 시, 수집 대상 종목 수(N)를 반드시 지정해야 합니다. N은 시가총액 상위 순으로 N개까지 종목을 수집함을 의미합니다. N이 커질수록 데이터 수집 시간이 길어지므로, 초기 테스트에는 종목수(N)를 5~50 사이로 지정한 후 차츰 늘려가기를 권장합니다.
|
|
83
83
|
```python
|
|
84
|
-
mf =
|
|
84
|
+
mf = MultiFactorKR(N=50) # 시가총액 상위 50개 종목
|
|
85
85
|
```
|
|
86
86
|
<br>
|
|
87
87
|
|
|
@@ -154,8 +154,8 @@ print(stock_list)
|
|
|
154
154
|
```get_score```함수로 멀티팩터 종합점수 데이터를 간단하게 생성할 수 있습니다. 다음 코드는 시가총액 상위 10개 종목의 종합 점수를 추출하여 파이썬 데이터프레임(df)에 저장합니다.
|
|
155
155
|
|
|
156
156
|
```python
|
|
157
|
-
from MultiFactor import
|
|
158
|
-
mf =
|
|
157
|
+
from MultiFactor import MultiFactorKR
|
|
158
|
+
mf = MultiFactorKR(N=10)
|
|
159
159
|
df = mf.get_score()
|
|
160
160
|
```
|
|
161
161
|
|
|
@@ -428,7 +428,7 @@ df[cols].head()
|
|
|
428
428
|
|
|
429
429
|
```python
|
|
430
430
|
# 시가총액 상위 100 종목 멀티팩터 종합점수 추출
|
|
431
|
-
mf =
|
|
431
|
+
mf = MultiFactorKR(N=100)
|
|
432
432
|
df = mf.get_score()
|
|
433
433
|
```
|
|
434
434
|
|
|
@@ -606,7 +606,7 @@ df[['scode', 'sname', '종합점수', '종합순위']].head()
|
|
|
606
606
|
get_Ngroup() 함수를 사용하면 전체 종목을 원하는 개수의 그룹으로 깔끔하게 묶어 요약할 수 있습니다.
|
|
607
607
|
|
|
608
608
|
```python
|
|
609
|
-
mf =
|
|
609
|
+
mf = MultiFactorKR(N=100)
|
|
610
610
|
df = mf.get_score()
|
|
611
611
|
mf.get_Ngroup(df, Ngroup=10) # 종합점수 상위 순 10개 그룹으로 분류
|
|
612
612
|
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import FinanceDataReader as fdr
|
|
2
|
-
|
|
3
|
-
import pandas as pd
|
|
4
|
-
import numpy as np
|
|
5
|
-
|
|
6
|
-
def get_us_stockinfo(N=500):
|
|
7
|
-
"""
|
|
8
|
-
미국 종목정보 추출 (GitHub S&P 500 데이터 활용 및 정렬)
|
|
9
|
-
"""
|
|
10
|
-
url = "https://raw.githubusercontent.com/Ate329/top-us-stock-tickers/master/tickers/sp500.csv"
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
# 1. GitHub에서 최신 S&P 500 데이터 로드
|
|
14
|
-
df = pd.read_csv(url)
|
|
15
|
-
|
|
16
|
-
# 2. 컬럼명을 기존 시스템과 동일하게 변경
|
|
17
|
-
column_map = {
|
|
18
|
-
'symbol': 'Code',
|
|
19
|
-
'name': 'Name',
|
|
20
|
-
'marketCap': 'MarketCap',
|
|
21
|
-
'industry': 'Industry',
|
|
22
|
-
'price': 'Price',
|
|
23
|
-
'volume': 'Volume'
|
|
24
|
-
}
|
|
25
|
-
df = df.rename(columns=column_map)
|
|
26
|
-
|
|
27
|
-
# 3. 시가총액 순으로 내림차순 정렬
|
|
28
|
-
if 'MarketCap' in df.columns:
|
|
29
|
-
df = df.sort_values(by='MarketCap', ascending=False)
|
|
30
|
-
|
|
31
|
-
except Exception as e:
|
|
32
|
-
print(f"GitHub 데이터 로드 실패: {e}. 기존 FDR 방식으로 전환합니다.")
|
|
33
|
-
# 실패 시 기존 FinanceDataReader 로직 사용
|
|
34
|
-
try:
|
|
35
|
-
df = fdr.StockListing('S&P500')
|
|
36
|
-
except:
|
|
37
|
-
df_nasdaq = fdr.StockListing('NASDAQ')
|
|
38
|
-
df_nyse = fdr.StockListing('NYSE')
|
|
39
|
-
df = pd.concat([df_nasdaq, df_nyse])
|
|
40
|
-
|
|
41
|
-
if 'Symbol' in df.columns:
|
|
42
|
-
df = df.rename(columns={'Symbol': 'Code'})
|
|
43
|
-
|
|
44
|
-
# 4. 종목코드 클렌징 (yfinance 호환을 위해 / 를 - 로 변경. 예: BRK/B -> BRK-B)
|
|
45
|
-
if 'Code' in df.columns:
|
|
46
|
-
df['Code'] = df['Code'].str.replace('/', '-', regex=False)
|
|
47
|
-
|
|
48
|
-
# 5. 상위 N개 추출 및 인덱스 초기화
|
|
49
|
-
df = df.head(N).reset_index(drop=True)
|
|
50
|
-
|
|
51
|
-
print("미국 종목 추출 건수 ", len(df))
|
|
52
|
-
|
|
53
|
-
return df
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|