105 lines
4.4 KiB
Python
105 lines
4.4 KiB
Python
'''코스닥주식종목코드(kosdaq_code.mst) 정제 파이썬 파일'''
|
|
|
|
import pandas as pd
|
|
import urllib.request
|
|
import ssl
|
|
import zipfile
|
|
import os
|
|
|
|
base_dir = os.getcwd()
|
|
|
|
def kosdaq_master_download(base_dir, verbose=False):
|
|
|
|
cwd = os.getcwd()
|
|
if (verbose): print(f"current directory is {cwd}")
|
|
ssl._create_default_https_context = ssl._create_unverified_context
|
|
|
|
urllib.request.urlretrieve("https://new.real.download.dws.co.kr/common/master/kosdaq_code.mst.zip",
|
|
base_dir + "\\kosdaq_code.zip")
|
|
|
|
os.chdir(base_dir)
|
|
if (verbose): print(f"change directory to {base_dir}")
|
|
kosdaq_zip = zipfile.ZipFile('kosdaq_code.zip')
|
|
kosdaq_zip.extractall()
|
|
|
|
kosdaq_zip.close()
|
|
|
|
if os.path.exists("kosdaq_code.zip"):
|
|
os.remove("kosdaq_code.zip")
|
|
|
|
def get_kosdaq_master_dataframe(base_dir):
|
|
file_name = base_dir + "\\kosdaq_code.mst"
|
|
tmp_fil1 = base_dir + "\\kosdaq_code_part1.tmp"
|
|
tmp_fil2 = base_dir + "\\kosdaq_code_part2.tmp"
|
|
|
|
wf1 = open(tmp_fil1, mode="w")
|
|
wf2 = open(tmp_fil2, mode="w")
|
|
|
|
with open(file_name, mode="r", encoding="cp949") as f:
|
|
for row in f:
|
|
rf1 = row[0:len(row) - 222]
|
|
rf1_1 = rf1[0:9].rstrip()
|
|
rf1_2 = rf1[9:21].rstrip()
|
|
rf1_3 = rf1[21:].strip()
|
|
wf1.write(rf1_1 + ',' + rf1_2 + ',' + rf1_3 + '\n')
|
|
rf2 = row[-222:]
|
|
wf2.write(rf2)
|
|
|
|
wf1.close()
|
|
wf2.close()
|
|
|
|
part1_columns = ['단축코드','표준코드','한글종목명']
|
|
df1 = pd.read_csv(tmp_fil1, header=None, names=part1_columns, encoding='cp949')
|
|
|
|
field_specs = [2, 1,
|
|
4, 4, 4, 1, 1,
|
|
1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 9,
|
|
5, 5, 1, 1, 1,
|
|
2, 1, 1, 1, 2,
|
|
2, 2, 3, 1, 3,
|
|
12, 12, 8, 15, 21,
|
|
2, 7, 1, 1, 1,
|
|
1, 9, 9, 9, 5,
|
|
9, 8, 9, 3, 1,
|
|
1, 1
|
|
]
|
|
|
|
part2_columns = ['증권그룹구분코드','시가총액 규모 구분 코드 유가',
|
|
'지수업종 대분류 코드','지수 업종 중분류 코드','지수업종 소분류 코드','벤처기업 여부 (Y/N)',
|
|
'저유동성종목 여부','KRX 종목 여부','ETP 상품구분코드','KRX100 종목 여부 (Y/N)',
|
|
'KRX 자동차 여부','KRX 반도체 여부','KRX 바이오 여부','KRX 은행 여부','기업인수목적회사여부',
|
|
'KRX 에너지 화학 여부','KRX 철강 여부','단기과열종목구분코드','KRX 미디어 통신 여부',
|
|
'KRX 건설 여부','(코스닥)투자주의환기종목여부','KRX 증권 구분','KRX 선박 구분',
|
|
'KRX섹터지수 보험여부','KRX섹터지수 운송여부','KOSDAQ150지수여부 (Y,N)','주식 기준가',
|
|
'정규 시장 매매 수량 단위','시간외 시장 매매 수량 단위','거래정지 여부','정리매매 여부',
|
|
'관리 종목 여부','시장 경고 구분 코드','시장 경고위험 예고 여부','불성실 공시 여부',
|
|
'우회 상장 여부','락구분 코드','액면가 변경 구분 코드','증자 구분 코드','증거금 비율',
|
|
'신용주문 가능 여부','신용기간','전일 거래량','주식 액면가','주식 상장 일자','상장 주수(천)',
|
|
'자본금','결산 월','공모 가격','우선주 구분 코드','공매도과열종목여부','이상급등종목여부',
|
|
'KRX300 종목 여부 (Y/N)','매출액','영업이익','경상이익','단기순이익','ROE(자기자본이익률)',
|
|
'기준년월','전일기준 시가총액 (억)','그룹사 코드','회사신용한도초과여부','담보대출가능여부','대주가능여부'
|
|
]
|
|
|
|
df2 = pd.read_fwf(tmp_fil2, widths=field_specs, names=part2_columns)
|
|
|
|
df = pd.merge(df1, df2, how='outer', left_index=True, right_index=True)
|
|
|
|
# clean temporary file and dataframe
|
|
del (df1)
|
|
del (df2)
|
|
os.remove(tmp_fil1)
|
|
os.remove(tmp_fil2)
|
|
|
|
print("Done")
|
|
|
|
return df
|
|
|
|
kosdaq_master_download(base_dir)
|
|
df = get_kosdaq_master_dataframe(base_dir)
|
|
|
|
df.to_excel('kosdaq_code.xlsx',index=False) # 현재 위치에 엑셀파일로 저장
|
|
df
|