MultiFactor 0.2.6__tar.gz → 0.2.8__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 (25) hide show
  1. {multifactor-0.2.6 → multifactor-0.2.8}/PKG-INFO +9 -9
  2. {multifactor-0.2.6 → multifactor-0.2.8}/README.md +8 -8
  3. {multifactor-0.2.6 → multifactor-0.2.8}/pyproject.toml +1 -1
  4. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/us_stockinfo.py +28 -2
  5. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor.egg-info/PKG-INFO +9 -9
  6. {multifactor-0.2.6 → multifactor-0.2.8}/setup.cfg +0 -0
  7. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/__init__.py +0 -0
  8. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/core.py +0 -0
  9. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/momentum.py +0 -0
  10. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/momentum_one.py +0 -0
  11. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/quality.py +0 -0
  12. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/quality_one.py +0 -0
  13. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/score.py +0 -0
  14. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/score_adj_weight.py +0 -0
  15. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/stockinfo.py +0 -0
  16. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/us_core.py +0 -0
  17. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/us_momentum.py +0 -0
  18. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/us_quality.py +0 -0
  19. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/us_value.py +0 -0
  20. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/value.py +0 -0
  21. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor/value_one.py +0 -0
  22. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor.egg-info/SOURCES.txt +0 -0
  23. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor.egg-info/dependency_links.txt +0 -0
  24. {multifactor-0.2.6 → multifactor-0.2.8}/src/MultiFactor.egg-info/requires.txt +0 -0
  25. {multifactor-0.2.6 → multifactor-0.2.8}/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.6
3
+ Version: 0.2.8
4
4
  Summary: 멀티팩터 기반 주식 데이터 수집 패키지
5
5
  Author-email: HANHO <hanhoman@gmail.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -748,7 +748,7 @@ mf_kr = MultiFactorKR(N=100)
748
748
  df = mf_kr.get_score()
749
749
 
750
750
  # 가치성장 전략 적용
751
- df = mf.get_score_adj_weight(df, weight='가치성장')
751
+ df = mf_kr.get_score_adj_weight(df, weight='가치성장')
752
752
 
753
753
  df[['scode', 'sname', '종합점수', '종합순위']].head()
754
754
  ```
@@ -810,7 +810,7 @@ mf_us = MultiFactorUS(N=100)
810
810
  df = mf_us.get_score()
811
811
 
812
812
  # 가치성장 전략 적용
813
- df = mf.get_score_adj_weight(df, weight='가치성장')
813
+ df = mf_us.get_score_adj_weight(df, weight='가치성장')
814
814
 
815
815
  df[['scode', 'sname', '종합점수', '종합순위']].head()
816
816
  ```
@@ -875,7 +875,7 @@ mf_kr = MultiFactorKR(N=100)
875
875
  df = mf_kr.get_score()
876
876
 
877
877
  # 추세성장 전략 적용
878
- df = mf.get_score_adj_weight(df, weight='추세성장')
878
+ df = mf_kr.get_score_adj_weight(df, weight='추세성장')
879
879
 
880
880
  df[['scode', 'sname', '종합점수', '종합순위']].head()
881
881
  ```
@@ -938,7 +938,7 @@ mf_us = MultiFactorUS(N=100)
938
938
  df = mf_us.get_score()
939
939
 
940
940
  # 추세성장 전략 적용
941
- df = mf.get_score_adj_weight(df, weight='추세성장')
941
+ df = mf_us.get_score_adj_weight(df, weight='추세성장')
942
942
 
943
943
  df[['scode', 'sname', '종합점수', '종합순위']].head()
944
944
  ```
@@ -1003,7 +1003,7 @@ mf_kr = MultiFactorKR(N=100)
1003
1003
  df = mf_kr.get_score()
1004
1004
 
1005
1005
  # 역발상 전략 적용
1006
- df = mf.get_score_adj_weight(df, weight='역발상')
1006
+ df = mf_kr.get_score_adj_weight(df, weight='역발상')
1007
1007
 
1008
1008
  df[['scode', 'sname', '종합점수', '종합순위']].head()
1009
1009
  ```
@@ -1063,7 +1063,7 @@ mf_us = MultiFactorUS(N=100)
1063
1063
  df = mf_us.get_score()
1064
1064
 
1065
1065
  # 역발상 전략 적용
1066
- df = mf.get_score_adj_weight(df, weight='역발상')
1066
+ df = mf_us.get_score_adj_weight(df, weight='역발상')
1067
1067
 
1068
1068
  df[['scode', 'sname', '종합점수', '종합순위']].head()
1069
1069
  ```
@@ -1128,7 +1128,7 @@ mf_kr = MultiFactorKR(N=100)
1128
1128
  df = mf_kr.get_score()
1129
1129
 
1130
1130
  # 종합점수 상위 순 10개 그룹으로 분류
1131
- mf.get_Ngroup(df, Ngroup=10)
1131
+ mf_kr.get_Ngroup(df, Ngroup=10)
1132
1132
 
1133
1133
  # [출력 결과]
1134
1134
  # 1 : SK스퀘어, SK하이닉스, 삼성E&A, HD현대, 에이피알, 한국금융지주, 삼성전자, LG이노텍, 키움증권, LS ELECTRIC
@@ -1151,7 +1151,7 @@ mf_us = MultiFactorUS(N=100)
1151
1151
  df = mf_us.get_score()
1152
1152
 
1153
1153
  # 종합점수 상위 순 10개 그룹으로 분류
1154
- mf.get_Ngroup(df, Ngroup=10)
1154
+ mf_us.get_Ngroup(df, Ngroup=10)
1155
1155
 
1156
1156
  # [출력 결과]
1157
1157
  #1 : Micron Technology, Morgan Stanley, Goldman Sachs, BlackRock, Citigroup, Nvidia, AppLovin, Microsoft, Dell Technologies, Charles Schwab Corporation
@@ -731,7 +731,7 @@ mf_kr = MultiFactorKR(N=100)
731
731
  df = mf_kr.get_score()
732
732
 
733
733
  # 가치성장 전략 적용
734
- df = mf.get_score_adj_weight(df, weight='가치성장')
734
+ df = mf_kr.get_score_adj_weight(df, weight='가치성장')
735
735
 
736
736
  df[['scode', 'sname', '종합점수', '종합순위']].head()
737
737
  ```
@@ -793,7 +793,7 @@ mf_us = MultiFactorUS(N=100)
793
793
  df = mf_us.get_score()
794
794
 
795
795
  # 가치성장 전략 적용
796
- df = mf.get_score_adj_weight(df, weight='가치성장')
796
+ df = mf_us.get_score_adj_weight(df, weight='가치성장')
797
797
 
798
798
  df[['scode', 'sname', '종합점수', '종합순위']].head()
799
799
  ```
@@ -858,7 +858,7 @@ mf_kr = MultiFactorKR(N=100)
858
858
  df = mf_kr.get_score()
859
859
 
860
860
  # 추세성장 전략 적용
861
- df = mf.get_score_adj_weight(df, weight='추세성장')
861
+ df = mf_kr.get_score_adj_weight(df, weight='추세성장')
862
862
 
863
863
  df[['scode', 'sname', '종합점수', '종합순위']].head()
864
864
  ```
@@ -921,7 +921,7 @@ mf_us = MultiFactorUS(N=100)
921
921
  df = mf_us.get_score()
922
922
 
923
923
  # 추세성장 전략 적용
924
- df = mf.get_score_adj_weight(df, weight='추세성장')
924
+ df = mf_us.get_score_adj_weight(df, weight='추세성장')
925
925
 
926
926
  df[['scode', 'sname', '종합점수', '종합순위']].head()
927
927
  ```
@@ -986,7 +986,7 @@ mf_kr = MultiFactorKR(N=100)
986
986
  df = mf_kr.get_score()
987
987
 
988
988
  # 역발상 전략 적용
989
- df = mf.get_score_adj_weight(df, weight='역발상')
989
+ df = mf_kr.get_score_adj_weight(df, weight='역발상')
990
990
 
991
991
  df[['scode', 'sname', '종합점수', '종합순위']].head()
992
992
  ```
@@ -1046,7 +1046,7 @@ mf_us = MultiFactorUS(N=100)
1046
1046
  df = mf_us.get_score()
1047
1047
 
1048
1048
  # 역발상 전략 적용
1049
- df = mf.get_score_adj_weight(df, weight='역발상')
1049
+ df = mf_us.get_score_adj_weight(df, weight='역발상')
1050
1050
 
1051
1051
  df[['scode', 'sname', '종합점수', '종합순위']].head()
1052
1052
  ```
@@ -1111,7 +1111,7 @@ mf_kr = MultiFactorKR(N=100)
1111
1111
  df = mf_kr.get_score()
1112
1112
 
1113
1113
  # 종합점수 상위 순 10개 그룹으로 분류
1114
- mf.get_Ngroup(df, Ngroup=10)
1114
+ mf_kr.get_Ngroup(df, Ngroup=10)
1115
1115
 
1116
1116
  # [출력 결과]
1117
1117
  # 1 : SK스퀘어, SK하이닉스, 삼성E&A, HD현대, 에이피알, 한국금융지주, 삼성전자, LG이노텍, 키움증권, LS ELECTRIC
@@ -1134,7 +1134,7 @@ mf_us = MultiFactorUS(N=100)
1134
1134
  df = mf_us.get_score()
1135
1135
 
1136
1136
  # 종합점수 상위 순 10개 그룹으로 분류
1137
- mf.get_Ngroup(df, Ngroup=10)
1137
+ mf_us.get_Ngroup(df, Ngroup=10)
1138
1138
 
1139
1139
  # [출력 결과]
1140
1140
  #1 : Micron Technology, Morgan Stanley, Goldman Sachs, BlackRock, Citigroup, Nvidia, AppLovin, Microsoft, Dell Technologies, Charles Schwab Corporation
@@ -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.6"
8
+ version = "0.2.8"
9
9
  authors = [
10
10
  { name="HANHO", email="hanhoman@gmail.com" },
11
11
  ]
@@ -3,6 +3,30 @@ import FinanceDataReader as fdr
3
3
  import pandas as pd
4
4
  import numpy as np
5
5
 
6
+ def clean_us_symbol(symbol):
7
+ """
8
+ 미국 주식 심볼 표준화 (yfinance 호환 및 데이터 병합 일관성을 위해)
9
+ 예: BRK.B, BRK/B, BRKB -> BRK-B
10
+ BF.B, BF/B, BFB -> BF-B
11
+ """
12
+ if not isinstance(symbol, str):
13
+ return symbol
14
+ symbol = symbol.strip().upper()
15
+ symbol = symbol.replace('/', '-').replace('.', '-')
16
+
17
+ # yfinance에서 하이픈(-) 구분자를 사용하는 대표적인 클래스 주식의 루트 심볼 목록
18
+ # 구분자 없이 붙어있는 경우(예: BRKB, BFB)만 선별적으로 변환하여
19
+ # ALB(알베말), APA(APA Corp), BA(보잉), FOXA(폭스), NWSA(뉴스콥) 등의 오탐지를 방지합니다.
20
+ hyphen_roots = {'BRK', 'BF', 'LEN', 'STZ', 'HEI', 'JW', 'MOG'}
21
+
22
+ for root in hyphen_roots:
23
+ if symbol == f"{root}A":
24
+ return f"{root}-A"
25
+ elif symbol == f"{root}B":
26
+ return f"{root}-B"
27
+
28
+ return symbol
29
+
6
30
  def get_us_stockinfo(N=500):
7
31
  """
8
32
  미국 종목정보 추출 (GitHub 시가총액 데이터 + FDR 상세정보 병합)
@@ -12,6 +36,7 @@ def get_us_stockinfo(N=500):
12
36
  try:
13
37
  # 1. GitHub에서 최신 S&P 500 데이터 로드 (시가총액 등 순위용)
14
38
  df = pd.read_csv(url)
39
+ df['symbol'] = df['symbol'].astype(str).apply(clean_us_symbol)
15
40
 
16
41
  # 2. FDR에서 KR/US 전체 상장 종목 정보 로드 (명칭 일관성 유지)
17
42
  df_sp500 = fdr.StockListing('S&P500')
@@ -20,6 +45,7 @@ def get_us_stockinfo(N=500):
20
45
 
21
46
  # 3. FDR 데이터 병합 및 중복 제거
22
47
  fdr_stocks = pd.concat([df_sp500, df_nasdaq, df_nyse])
48
+ fdr_stocks['Symbol'] = fdr_stocks['Symbol'].astype(str).apply(clean_us_symbol)
23
49
  fdr_stocks = fdr_stocks.drop_duplicates(subset='Symbol')
24
50
 
25
51
  # 4. Symbol 기준으로 조인하여 FDR의 Name을 사용
@@ -56,9 +82,9 @@ def get_us_stockinfo(N=500):
56
82
  if 'Symbol' in df.columns:
57
83
  df = df.rename(columns={'Symbol': 'Code'})
58
84
 
59
- # 7. 종목코드 클렌징 (yfinance 호환을 위해 / 를 - 로 변경. 예: BRK/B -> BRK-B)
85
+ # 7. 종목코드 클렌징 (yfinance 호환을 위해 표준화 적용)
60
86
  if 'Code' in df.columns:
61
- df['Code'] = df['Code'].str.replace('/', '-', regex=False)
87
+ df['Code'] = df['Code'].astype(str).apply(clean_us_symbol)
62
88
 
63
89
  # 8. 상위 N개 추출 및 인덱스 초기화
64
90
  df = df.head(N).reset_index(drop=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiFactor
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Summary: 멀티팩터 기반 주식 데이터 수집 패키지
5
5
  Author-email: HANHO <hanhoman@gmail.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -748,7 +748,7 @@ mf_kr = MultiFactorKR(N=100)
748
748
  df = mf_kr.get_score()
749
749
 
750
750
  # 가치성장 전략 적용
751
- df = mf.get_score_adj_weight(df, weight='가치성장')
751
+ df = mf_kr.get_score_adj_weight(df, weight='가치성장')
752
752
 
753
753
  df[['scode', 'sname', '종합점수', '종합순위']].head()
754
754
  ```
@@ -810,7 +810,7 @@ mf_us = MultiFactorUS(N=100)
810
810
  df = mf_us.get_score()
811
811
 
812
812
  # 가치성장 전략 적용
813
- df = mf.get_score_adj_weight(df, weight='가치성장')
813
+ df = mf_us.get_score_adj_weight(df, weight='가치성장')
814
814
 
815
815
  df[['scode', 'sname', '종합점수', '종합순위']].head()
816
816
  ```
@@ -875,7 +875,7 @@ mf_kr = MultiFactorKR(N=100)
875
875
  df = mf_kr.get_score()
876
876
 
877
877
  # 추세성장 전략 적용
878
- df = mf.get_score_adj_weight(df, weight='추세성장')
878
+ df = mf_kr.get_score_adj_weight(df, weight='추세성장')
879
879
 
880
880
  df[['scode', 'sname', '종합점수', '종합순위']].head()
881
881
  ```
@@ -938,7 +938,7 @@ mf_us = MultiFactorUS(N=100)
938
938
  df = mf_us.get_score()
939
939
 
940
940
  # 추세성장 전략 적용
941
- df = mf.get_score_adj_weight(df, weight='추세성장')
941
+ df = mf_us.get_score_adj_weight(df, weight='추세성장')
942
942
 
943
943
  df[['scode', 'sname', '종합점수', '종합순위']].head()
944
944
  ```
@@ -1003,7 +1003,7 @@ mf_kr = MultiFactorKR(N=100)
1003
1003
  df = mf_kr.get_score()
1004
1004
 
1005
1005
  # 역발상 전략 적용
1006
- df = mf.get_score_adj_weight(df, weight='역발상')
1006
+ df = mf_kr.get_score_adj_weight(df, weight='역발상')
1007
1007
 
1008
1008
  df[['scode', 'sname', '종합점수', '종합순위']].head()
1009
1009
  ```
@@ -1063,7 +1063,7 @@ mf_us = MultiFactorUS(N=100)
1063
1063
  df = mf_us.get_score()
1064
1064
 
1065
1065
  # 역발상 전략 적용
1066
- df = mf.get_score_adj_weight(df, weight='역발상')
1066
+ df = mf_us.get_score_adj_weight(df, weight='역발상')
1067
1067
 
1068
1068
  df[['scode', 'sname', '종합점수', '종합순위']].head()
1069
1069
  ```
@@ -1128,7 +1128,7 @@ mf_kr = MultiFactorKR(N=100)
1128
1128
  df = mf_kr.get_score()
1129
1129
 
1130
1130
  # 종합점수 상위 순 10개 그룹으로 분류
1131
- mf.get_Ngroup(df, Ngroup=10)
1131
+ mf_kr.get_Ngroup(df, Ngroup=10)
1132
1132
 
1133
1133
  # [출력 결과]
1134
1134
  # 1 : SK스퀘어, SK하이닉스, 삼성E&A, HD현대, 에이피알, 한국금융지주, 삼성전자, LG이노텍, 키움증권, LS ELECTRIC
@@ -1151,7 +1151,7 @@ mf_us = MultiFactorUS(N=100)
1151
1151
  df = mf_us.get_score()
1152
1152
 
1153
1153
  # 종합점수 상위 순 10개 그룹으로 분류
1154
- mf.get_Ngroup(df, Ngroup=10)
1154
+ mf_us.get_Ngroup(df, Ngroup=10)
1155
1155
 
1156
1156
  # [출력 결과]
1157
1157
  #1 : Micron Technology, Morgan Stanley, Goldman Sachs, BlackRock, Citigroup, Nvidia, AppLovin, Microsoft, Dell Technologies, Charles Schwab Corporation
File without changes