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.
Files changed (26) hide show
  1. {multifactor-0.2.0 → multifactor-0.2.2}/PKG-INFO +1 -1
  2. {multifactor-0.2.0 → multifactor-0.2.2}/pyproject.toml +1 -1
  3. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_momentum.py +8 -6
  4. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_quality.py +2 -1
  5. multifactor-0.2.2/src/MultiFactor/us_stockinfo.py +53 -0
  6. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_value.py +2 -1
  7. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/PKG-INFO +1 -1
  8. multifactor-0.2.0/src/MultiFactor/us_stockinfo.py +0 -35
  9. {multifactor-0.2.0 → multifactor-0.2.2}/README.md +0 -0
  10. {multifactor-0.2.0 → multifactor-0.2.2}/setup.cfg +0 -0
  11. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/__init__.py +0 -0
  12. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/core.py +0 -0
  13. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/momentum.py +0 -0
  14. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/momentum_one.py +0 -0
  15. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/quality.py +0 -0
  16. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/quality_one.py +0 -0
  17. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/score.py +0 -0
  18. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/score_adj_weight.py +0 -0
  19. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/stockinfo.py +0 -0
  20. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/us_core.py +0 -0
  21. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/value.py +0 -0
  22. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor/value_one.py +0 -0
  23. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/SOURCES.txt +0 -0
  24. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/dependency_links.txt +0 -0
  25. {multifactor-0.2.0 → multifactor-0.2.2}/src/MultiFactor.egg-info/requires.txt +0 -0
  26. {multifactor-0.2.0 → multifactor-0.2.2}/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.0
3
+ Version: 0.2.2
4
4
  Summary: 멀티팩터 기반 주식 데이터 수집 패키지
5
5
  Author-email: HANHO <hanhoman@gmail.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  # 1. PyPI에 등록될 배포 이름 (pip install MultiFactor)
7
7
  name = "MultiFactor"
8
- version = "0.2.0"
8
+ version = "0.2.2"
9
9
  authors = [
10
10
  { name="HANHO", email="hanhoman@gmail.com" },
11
11
  ]
@@ -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[['Adj Close', 'Volume']].xs(ticker, axis=1, level=1)
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]['Adj Close'] / df.iloc[-2]['Adj Close'] - 1 ) * 100 # 전일
32
- mom_1w = ( df.iloc[-1]['Adj Close'] / df.iloc[-5]['Adj Close'] - 1 ) * 100 # 주간
33
- mom_1m = ( df.iloc[-1]['Adj Close'] / df.iloc[-20]['Adj Close'] - 1 ) * 100 # 월간
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]['Adj Close'] / df.iloc[-60]['Adj Close'] - 1 ) * 100
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]['Adj Close'] / df.iloc[-250]['Adj Close'] - 1 ) * 100
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
- result_fin = []
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
- result = []
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiFactor
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: 멀티팩터 기반 주식 데이터 수집 패키지
5
5
  Author-email: HANHO <hanhoman@gmail.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -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