Created
July 29, 2017 02:43
-
-
Save KimMyungSam/204dbfe0ba07d465423c3dc6013eddc2 to your computer and use it in GitHub Desktop.
종목코드 조회로 가져오지 않고 날자별 전체종목 가격을 가져옴
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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