Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save KimMyungSam/204dbfe0ba07d465423c3dc6013eddc2 to your computer and use it in GitHub Desktop.
Save KimMyungSam/204dbfe0ba07d465423c3dc6013eddc2 to your computer and use it in GitHub Desktop.
종목코드 조회로 가져오지 않고 날자별 전체종목 가격을 가져옴
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# 시가총액 순위 정보\n",
"## 시장정보 → 주식 → 순위정보 → 시가총액 상/하위 정보로 가격 데이터 구축\n",
"- 일별 전 종목 가격을 가져 올수있어, 네이버 전종목 가격데이타 구축보다 효율적임\n",
"- DB만들때 INT 크기 신경써야 하고 DOUBLE 형으로도 필요함\n",
"- 각 컬럼의 기본값을 Null로 설정해야 함.\n",
"\n",
"* http://marketdata.krx.co.kr/contents/MKD/04/0404/04040200/MKD04040200.jsp\n",
"* 일별: 종목코드, 종목명, 현재가, 등락률, 거래량, 거래대금, 시가총액, 시가총액비중(%), 상장주식수(천주), 외국인, 보유주식수, 외국인, 지분율(%)\n",
"* 1995-05-02 부터 현재까지 일자별\n",
"<img src=\"KRX_DB_컬럼및속성.jpg\">"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# stock_master_krx()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from datetime import datetime, timedelta\n",
"import requests\n",
"from io import BytesIO\n",
"import mysql.connector\n",
"import sqlalchemy\n",
"from sqlalchemy import create_engine\n",
"\n",
"def stock_master_krx(date_str=None):\n",
" # 시가총액순위 정보를 DataFrame으로 반환\n",
" if date_str == None:\n",
" date_str = datetime.today().strftime('%Y%m%d')\n",
"\n",
" # STEP 01: Generate OTP\n",
" gen_otp_url = 'http://marketdata.krx.co.kr/contents/COM/GenerateOTP.jspx'\n",
" gen_otp_data = {\n",
" 'name':'fileDown',\n",
" 'filetype':'xls',\n",
" 'url':'MKD/04/0404/04040200/mkd04040200_01',\n",
" 'market_gubun':'ALL', #시장구분: ALL=전체\n",
" 'indx_ind_cd':'',\n",
" 'sect_tp_cd':'',\n",
" 'schdate': date_str,\n",
" 'pagePath':'/contents/MKD/04/0404/04040200/MKD04040200.jsp',\n",
" }\n",
" \n",
" r = requests.post(gen_otp_url, gen_otp_data)\n",
" code = r.content\n",
" \n",
" # STEP 02: download\n",
" down_url = 'http://file.krx.co.kr/download.jspx'\n",
" down_data = {\n",
" 'code': code,\n",
" }\n",
" \n",
" r = requests.post(down_url, down_data)\n",
" try:\n",
" df = pd.read_excel(BytesIO(r.content), header=0, thousands=',', converters={'종목코드': str})\n",
" except:\n",
" print (date_str,\"파일이 손상되었습니다.\") #2009.9.3 파일은 손상됨.csv로 읽어도 에러남.\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"if __name__ == \"__main__\":\n",
" pwd = 'rlaehgus1'\n",
" engine = create_engine('mysql+mysqlconnector://root:'+pwd+'@localhost/findb',echo=False)\n",
" connector = engine.connect()\n",
"\n",
" start = datetime(1996, 1, 3) # 주식시장 첫 거래일 지정\n",
" end = datetime.today() - timedelta(days=1) # yearterday\n",
" dates = pd.date_range(start=start, end=end)\n",
" \n",
" # db에 저장된 가장 최근 날짜 or \n",
" begin_date = str(datetime(1969, 1, 3))\n",
"\n",
" sql = 'SELECT date FROM krx_stock_price WHERE code = 005930 ORDER BY date DESC LIMIT 1' #가장 최신date, 쿼리 정확도를 위해 삼성전자 사용\n",
" result = connector.execute(sql)\n",
" imsi_day = result.fetchone()\n",
"\n",
" if imsi_day is not None:\n",
" latest_date = imsi_day[0].strftime('%Y%m%d')\n",
" elif imsi_day is None:\n",
" latest_date = datetime(1969, 1, 3).strftime('%Y%m%d')\n",
"\n",
" # start date 찾기\n",
" for date in dates:\n",
" \n",
" if date.strftime('%Y%m%d') <= latest_date:\n",
" continue\n",
" \n",
" date_str = date.strftime('%Y%m%d')\n",
" df = stock_master_krx(date_str)\n",
" # df.set_index('date', inplace=True)\n",
" print(date_str,'count: ', len(df))\n",
" df.rename(columns={'등락률': '등락률(%)','거래량': '거래량(주)','상장주식수(천주)': '상장주식수',\\\n",
" '외국인 보유주식수': '외국인보유수량'}, inplace=True)\n",
" df['date'] = date.strftime('%Y%m%d') #date는 날짜 형식 YYYY-mm-dd로 변경함.\n",
" \n",
" # int64_to_mysql error 발생함.\n",
" if len(df) != 0:\n",
" df.fillna(0, inplace = True) #nan 값은 0으로 변경\n",
" for i in range(0,len(df)):\n",
" varlist = df.iloc[i].values\n",
" values = []\n",
" for var in varlist:\n",
" if isinstance( var, np.int64 ):\n",
" var = int(var)\n",
" values.append(var)\n",
" elif isinstance(var, np.float64):\n",
" var = float(var)\n",
" values.append(var)\n",
" else:\n",
" values.append(var)\n",
" try:\n",
" sql = \"\"\"INSERT INTO krx_stock_price (code,name,close,대비,`등락률(%)`,`거래량(주)`,거래대금,\\\n",
"open,high,low,시가총액,`시가총액비중(%)`,상장주식수,외국인보유수량,`외국인 지분율(%)`,date)\\\n",
"VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)\"\"\"\n",
" connector.execute(sql, values)\n",
" except:\n",
" print ('데이터 오류=',values)\n",
" \n",
" connector.close()\n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"- to_sql로 저장시,특정 컬럼에서 데이타 오류가 있을때 데이타 오류로 저장안됨\n",
"- insert into로 각 row마다 mysql에 저장하고 특정 값오류시에는 해당 값만 처리하지 않음."
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment