fix: support KRX OpenAPI ticker fields

This commit is contained in:
머니페니 2026-05-13 22:05:09 +09:00
parent da9abd3e93
commit de5ff34db6
4 changed files with 48 additions and 8 deletions

View File

@ -48,6 +48,16 @@ class ETFCollector(BaseCollector):
else:
return AssetClass.MIXED.value
def _get_openapi_ticker(self, row) -> str:
"""Extract 6-digit ticker from KRX Open API rows."""
ticker = row.get("ISU_SRT_CD", row.get("ISU_CD", ""))
if pd.isna(ticker):
return ""
if isinstance(ticker, float):
return str(int(ticker)).zfill(6)
ticker = str(ticker).strip()
return ticker.zfill(6) if ticker.isdigit() else ticker
def _fetch_etf_data_openapi(self) -> pd.DataFrame:
"""Fetch ETF data via KRX Open API."""
client = get_krx_client()
@ -96,8 +106,8 @@ class ETFCollector(BaseCollector):
"""Parse Open API response DataFrame into ETF records."""
records = []
for _, row in df.iterrows():
ticker = row.get("ISU_SRT_CD")
name = row.get("ISU_ABBRV")
ticker = self._get_openapi_ticker(row)
name = row.get("ISU_ABBRV", row.get("ISU_NM"))
if not ticker or pd.isna(ticker) or not name or pd.isna(name):
continue
@ -114,8 +124,8 @@ class ETFCollector(BaseCollector):
"""Parse pykrx response DataFrame into ETF records."""
records = []
for _, row in df.iterrows():
ticker = row.get("ISU_SRT_CD")
name = row.get("ISU_ABBRV")
ticker = self._get_openapi_ticker(row)
name = row.get("ISU_ABBRV", row.get("ISU_NM"))
if not ticker or pd.isna(ticker) or not name or pd.isna(name):
continue

View File

@ -55,6 +55,16 @@ class ETFPriceCollector(BaseCollector):
except (ValueError, TypeError):
return None
def _get_openapi_ticker(self, row) -> str:
"""Extract 6-digit ticker from KRX Open API rows."""
ticker = row.get("ISU_SRT_CD", row.get("ISU_CD", ""))
if pd.isna(ticker):
return ""
if isinstance(ticker, float):
return str(int(ticker)).zfill(6)
ticker = str(ticker).strip()
return ticker.zfill(6) if ticker.isdigit() else ticker
def _collect_openapi(self) -> int:
"""Collect ETF prices via KRX Open API (date-based bulk fetch)."""
client = get_krx_client()
@ -79,7 +89,7 @@ class ETFPriceCollector(BaseCollector):
records = []
for _, row in df.iterrows():
ticker = str(row.get("ISU_SRT_CD", ""))
ticker = self._get_openapi_ticker(row)
if not ticker or ticker not in ticker_set:
continue

View File

@ -55,6 +55,16 @@ class PriceCollector(BaseCollector):
except (ValueError, TypeError):
return None
def _get_openapi_ticker(self, row) -> str:
"""Extract 6-digit ticker from KRX Open API rows."""
ticker = row.get("ISU_SRT_CD", row.get("ISU_CD", ""))
if pd.isna(ticker):
return ""
if isinstance(ticker, float):
return str(int(ticker)).zfill(6)
ticker = str(ticker).strip()
return ticker.zfill(6) if ticker.isdigit() else ticker
def _collect_openapi(self) -> int:
"""Collect stock prices via KRX Open API (date-based bulk fetch)."""
client = get_krx_client()
@ -79,7 +89,7 @@ class PriceCollector(BaseCollector):
records = []
for _, row in df.iterrows():
ticker = str(row.get("ISU_SRT_CD", ""))
ticker = self._get_openapi_ticker(row)
if not ticker or ticker not in ticker_market:
continue

View File

@ -53,6 +53,16 @@ class StockCollector(BaseCollector):
except (ValueError, TypeError):
return None
def _get_openapi_ticker(self, row) -> str:
"""Extract 6-digit ticker from KRX Open API rows."""
ticker = row.get("ISU_SRT_CD", row.get("ISU_CD", ""))
if pd.isna(ticker):
return ""
if isinstance(ticker, float):
return str(int(ticker)).zfill(6)
ticker = str(ticker).strip()
return ticker.zfill(6) if ticker.isdigit() else ticker
def _collect_openapi(self) -> int:
"""Collect stock data via KRX Open API."""
client = get_krx_client()
@ -73,12 +83,12 @@ class StockCollector(BaseCollector):
trade_map = {}
if trade_df is not None and not trade_df.empty:
for _, row in trade_df.iterrows():
ticker = str(row.get("ISU_SRT_CD", ""))
ticker = self._get_openapi_ticker(row)
if ticker:
trade_map[ticker] = row
for _, row in base_df.iterrows():
ticker = str(row.get("ISU_SRT_CD", ""))
ticker = self._get_openapi_ticker(row)
name = str(row.get("ISU_ABBRV", ""))
if not ticker or not name:
continue