MultiFactor 0.2.0__tar.gz → 0.2.2__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.0 → multifactor-0.2.2}/PKG-INFO +1 -1
- {multifactor-0.2.0 → multifactor-0.2.2}/pyproject.toml +1 -1
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_momentum.py +8 -6
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_quality.py +2 -1
- multifactor-0.2.2/src/MultiFactor/us_stockinfo.py +53 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_value.py +2 -1
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/PKG-INFO +1 -1
- multifactor-0.2.0/src/MultiFactor/us_stockinfo.py +0 -35
- {multifactor-0.2.0 → multifactor-0.2.2}/README.md +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/setup.cfg +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/__init__.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/core.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/momentum.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/momentum_one.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/quality.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/quality_one.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/score.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/score_adj_weight.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/stockinfo.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_core.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/value.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/value_one.py +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/SOURCES.txt +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/dependency_links.txt +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/requires.txt +0 -0
- {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/top_level.txt +0 -0
|
@@ -12,6 +12,8 @@ def get_us_momentum(stock_list):
|
|
|
12
12
|
SD = ED - timedelta(days=500) # 주간/월간/연간 모멘텀을 위해 넉넉히 500일 전 데이터 요청
|
|
13
13
|
|
|
14
14
|
# yfinance로 한 번에 여러 종목을 수집하면 빠름 (단기/중기/장기 모두를 위해 Daily 데이터 사용)
|
|
15
|
+
# yfinance 호환을 위해 티커의 / 을 - 로 변경 (예: BRK/B -> BRK-B)
|
|
16
|
+
stock_list = {k.replace('/', '-'): v for k, v in stock_list.items()}
|
|
15
17
|
tickers = list(stock_list.keys())
|
|
16
18
|
|
|
17
19
|
# 1. 주가 및 거래량 데이터 일괄 수집 (yfinance.download)
|
|
@@ -21,26 +23,26 @@ def get_us_momentum(stock_list):
|
|
|
21
23
|
def get_each_momentum(ticker):
|
|
22
24
|
try:
|
|
23
25
|
# 해당 종목의 데이터 추출 (종가, 거래량)
|
|
24
|
-
df = data[['
|
|
26
|
+
df = data[['Close', 'Volume']].xs(ticker, axis=1, level=1)
|
|
25
27
|
df = df.dropna()
|
|
26
28
|
|
|
27
29
|
if len(df) < 20:
|
|
28
30
|
return None, None
|
|
29
31
|
|
|
30
32
|
# 2. 주가 모멘텀 지표 생성
|
|
31
|
-
mom_1d = ( df.iloc[-1]['
|
|
32
|
-
mom_1w = ( df.iloc[-1]['
|
|
33
|
-
mom_1m = ( df.iloc[-1]['
|
|
33
|
+
mom_1d = ( df.iloc[-1]['Close'] / df.iloc[-2]['Close'] - 1 ) * 100 # 전일
|
|
34
|
+
mom_1w = ( df.iloc[-1]['Close'] / df.iloc[-5]['Close'] - 1 ) * 100 # 주간
|
|
35
|
+
mom_1m = ( df.iloc[-1]['Close'] / df.iloc[-20]['Close'] - 1 ) * 100 # 월간
|
|
34
36
|
|
|
35
37
|
# 3개월간 (데이터 부족 시 NaN 처리)
|
|
36
38
|
try:
|
|
37
|
-
mom_3m = ( df.iloc[-1]['
|
|
39
|
+
mom_3m = ( df.iloc[-1]['Close'] / df.iloc[-60]['Close'] - 1 ) * 100
|
|
38
40
|
except:
|
|
39
41
|
mom_3m = np.nan
|
|
40
42
|
|
|
41
43
|
# 연간 (데이터 부족 시 NaN 처리)
|
|
42
44
|
try:
|
|
43
|
-
mom_1y = ( df.iloc[-1]['
|
|
45
|
+
mom_1y = ( df.iloc[-1]['Close'] / df.iloc[-250]['Close'] - 1 ) * 100
|
|
44
46
|
except:
|
|
45
47
|
mom_1y = np.nan
|
|
46
48
|
|
|
@@ -8,7 +8,8 @@ def get_us_quality(stock_list):
|
|
|
8
8
|
미국 주식 퀄리티 계산 (yfinance 기반)
|
|
9
9
|
revenue_rate, oper_income_rate, net_income_rate, ROE 등
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
# 티커 클렌징 (yfinance 호환)
|
|
12
|
+
stock_list = {k.replace('/', '-'): v for k, v in stock_list.items()}
|
|
12
13
|
|
|
13
14
|
for i, (scode, sname) in enumerate(stock_list.items()):
|
|
14
15
|
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
|
@@ -8,7 +8,8 @@ def get_us_value(stock_list):
|
|
|
8
8
|
미국 주식 밸류 계산 (yfinance 기반)
|
|
9
9
|
참고: yfinance의 Ticker.info를 사용하므로 다수 종목 수집 시 시간이 소요됩니다.
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
# 티커 클렌징 (yfinance 호환)
|
|
12
|
+
stock_list = {k.replace('/', '-'): v for k, v in stock_list.items()}
|
|
12
13
|
|
|
13
14
|
for i, (scode, sname) in enumerate(stock_list.items()):
|
|
14
15
|
|
|
@@ -1,35 +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
|
-
미국 종목정보 추출 (S&P 500 기준 또는 전체 거래소)
|
|
9
|
-
"""
|
|
10
|
-
# S&P 500 종목 리스트 가져오기 (가장 안정적인 대형주 500개)
|
|
11
|
-
# 만약 전체 거래소 상위 500개를 원한다면 별도 로직 필요하나 S&P 500이 '시가총액 500개'에 가장 부합하는 기본 리스트임
|
|
12
|
-
try:
|
|
13
|
-
df = fdr.StockListing('S&P500')
|
|
14
|
-
except:
|
|
15
|
-
# S&P500 리스트 실패 시 NASDAQ, NYSE 등에서 시가총액 상위 추출 시도
|
|
16
|
-
df_nasdaq = fdr.StockListing('NASDAQ')
|
|
17
|
-
df_nyse = fdr.StockListing('NYSE')
|
|
18
|
-
df = pd.concat([df_nasdaq, df_nyse])
|
|
19
|
-
|
|
20
|
-
# 종목 추출 건수 체크 및 필터링 (필요 시)
|
|
21
|
-
# 미국 주식은 이미 fdr 리스트에 시가총액 정보 등이 포함되어 있을 수 있음
|
|
22
|
-
# 하지만 yfinance 호환을 위해 'Symbol' 또는 'Ticker' 컬럼이 중요함
|
|
23
|
-
|
|
24
|
-
if 'Symbol' in df.columns:
|
|
25
|
-
df = df.rename(columns={'Symbol': 'Code'})
|
|
26
|
-
|
|
27
|
-
# 상위 N개 추출
|
|
28
|
-
df = df.head(N)
|
|
29
|
-
|
|
30
|
-
# 데이터프레임 인덱스 초기화
|
|
31
|
-
df = df.reset_index(drop=True)
|
|
32
|
-
|
|
33
|
-
print("미국 종목 추출 건수 ", len(df))
|
|
34
|
-
|
|
35
|
-
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
|