Skip to content

Instantly share code, notes, and snippets.

@KimMyungSam
Created July 29, 2017 02:18
Show Gist options
  • Save KimMyungSam/35c32b3c3ad1d75073945f8f40731406 to your computer and use it in GitHub Desktop.
Save KimMyungSam/35c32b3c3ad1d75073945f8f40731406 to your computer and use it in GitHub Desktop.
전체종목에 대해서 SRIM 결과를 이미지로 저장
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### S-RIM\n",
"- 기존 RIM에 사용되는 Beta를 사용하지 않고 ROE를 사용하는 RIM\n",
"\n",
"##### 변경사항\n",
"- RIM 할인율 미적용\n",
"- save img svg형식으로 D디렉토리에 저장"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import font_manager, rc\n",
"import mysql.connector\n",
"import sqlalchemy\n",
"from sqlalchemy import create_engine\n",
"import pandas as pd\n",
"import numpy as np\n",
"from pandas import DataFrame, Series\n",
"from datetime import datetime\n",
"from copy import copy\n",
"from pandas_datareader import data, wb\n",
"from dateutil.relativedelta import relativedelta # 상대적인 월(달) 구하기 위해서"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 요구수익률, NPV 계산, 종목 Code 찾기"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 요구수익률 가져오기 (BBB- 5년 금리)\n",
"def get_required_rate_of_return():\n",
" sql = 'SELECT * FROM bond ORDER BY date DESC LIMIT 1'\n",
" result = connector.execute(sql)\n",
" required = result.fetchone()\n",
" return (required[1])\n",
"\n",
"def get_npv(rate, values):\n",
" values = np.asarray(values)\n",
" return (values / (1+rate)**np.arange(1,len(values)+1)).sum(axis=0)\n",
"\n",
"def get_code_name():\n",
" sql = 'SELECT code, name FROM listed_company'\n",
" df_code_name = pd.read_sql(sql,con = engine)\n",
" return (df_code_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### S-RIM 지속성장, 10년, 5년 성장에 따른 RIM 구하기"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_roe_date(code, coefficient,required_rate_of_return, ref_year,df_stock, type):\n",
" # ref_year = datetime.date.today() # date type\n",
" # ref_year = ref_year.year - 1 # 현재 년도 실적 ROE는 없음으로 직전 년도를 기준으로 함.\n",
" # required_rate_of_return는 현재 BBB- 5년를 사용하지만, 업종별, 종목별, 시장환경에 맞게 변경하여 판단이 필요함.\n",
" try:\n",
" year_capital = df_stock.loc['capital', ref_year]\n",
" year_roe = df_stock.loc['roe',ref_year] / 100 # 단위 % 환산\n",
" spread = year_roe - required_rate_of_return # 단위 % - % 계산임으로 spread변수도 값이 %가 됨.\n",
" \n",
" # 테이블 계산을 위한 기본 setting \n",
" index = ['coefficient','roe','net_profit','earing','capital']\n",
" df_table = pd.DataFrame({ref_year:[1, year_roe, 0, 0, year_capital]},index = index) \n",
"\n",
" # 적정가치 구하기\n",
" roe_max_len = len(df_stock.columns) # 년도가 있는 컬럼의 최대 길이 구함\n",
" year_index = df_stock.columns.values.tolist() #array자료형을 list형으로 변환\n",
" year_index = year_index.index(ref_year) # ref_year를 기준으로 컬럼에서 위치 찾음\n",
" year_roe_count = roe_max_len - year_index\n",
" year = copy(ref_year) # ref_year를 year로 copy하여 별도 변수로 사용 a is b로 테스트\n",
" calculated_coefficient = 0\n",
" calculated_roe = 0\n",
" calculated_net_profit = 0\n",
" calculated_earing = 0\n",
" calculated_capital = 0\n",
" \n",
" for year_count in range(1,11): #10년 동안 계산\n",
" calculated_coefficient = df_table.loc['coefficient',year] - coefficient # dataframe에서 직전년도 roe와 계산\n",
" if calculated_coefficient < 0.0: #roe 0 이하이면 0으로 세팅\n",
" calculated_coefficient = 0.0\n",
" \n",
" # 기준년을 참조하여 table상의 roe그대로 사용하고, roe참조가 끝나면 계산함.\n",
" '''\n",
" if year_roe_count >= year_count:\n",
" calculated_roe = df_stock.loc['roe',year] / 100 # 단위 % 환산\n",
" else:\n",
" calculated_roe = spread * calculated_coefficient + required_rate_of_return # spread와 required_rate_of_return는 %단위로 환산되어있음.\n",
" '''\n",
" calculated_roe = spread * calculated_coefficient + required_rate_of_return # spread와 required_rate_of_return는 %단위로 환산되어있음.\n",
" calculated_net_profit = df_table.loc['capital',year] * calculated_roe\n",
" calculated_earing = calculated_net_profit - df_table.loc['capital',year] * required_rate_of_return # 단위 % 환산\n",
" calculated_capital = df_table.loc['capital',year] + calculated_net_profit\n",
" \n",
" if type == 'year':\n",
" year = year + 1 # 1년 증가\n",
" elif type == 'quarter':\n",
" year_month = datetime.strptime(year,'%Y%m')\n",
" year_month = year_month + relativedelta(months=+3)\n",
" year = year_month.strftime('%Y%m')\n",
" \n",
" seri_table = pd.Series([calculated_coefficient,calculated_roe,calculated_net_profit,\\\n",
" calculated_earing,calculated_capital],name=year,index = index)\n",
" df_table = pd.concat([df_table, seri_table],axis=1)\n",
"\n",
" # NPV구하기\n",
" pv_val = df_table.loc['earing'].values.tolist()\n",
" pv_val = pv_val[1:]\n",
" \n",
" # pv = get_npv(required_rate_of_return, pv_val) #초기 투자금액은 0,np.npv(0.281,[-0, 39, 59, 55, 20])\n",
" pv = np.npv(required_rate_of_return, pv_val)\n",
" rim = year_capital + pv\n",
" \n",
" # 적정주가 구하기\n",
" '''\n",
" stock_date = stock.loc['date',ref_year] # date type\n",
" today = datetime.date.today() # date type\n",
" date_delta = stock_date - today # timedelta type\n",
" date_delta = date_delta.days # int type\n",
" \n",
" stock_value를 구할때 할인율의 산출일 기준으로 자승으로 곱하여 남은 날짜만큼 구하고 있음.\n",
" 그러나, 이것은 과거데이타 이용 및 현재 가치 판단시에 과한것으로 판단되어 일단, 사용하지 않음\n",
" 또한, 기준날짜 - 현재날짜 일때 ...컨센서스 데이타가 없을 때는 (-)값이 나와 엉뚱하게 과하게 나옴.\n",
" stock_value1 = rim / (1 + required_rate_of_return)**(date_delta/365)\n",
" '''\n",
" \n",
" # RIM 값을 구한후 미래가치에 대해 spread값만큼 자승하여 현재 가치를 구함\n",
" # calculated_rim = rim / (1 + required_rate_of_return) roe를 해당 Year것을 사용하여 할인율 미적용함.\n",
" share_outstanding = df_stock.loc['share_outstanding',ref_year] # ROE가 계산되는 year의 보통주식수\n",
" value_per_share = int((rim / share_outstanding) * 100000000) # 단위:억원 환산, 정수처리\n",
" '''\n",
" # 자승하여 현재가지치구하지 않고 현재 year 기준으로 모든것을 구했음으로 미래가치 -> 현재가지 부분을 제외\n",
" share_outstanding = df_stock.loc['share_outstanding',ref_year] # ROE가 계산되는 year의 보통주식수\n",
" value_per_share = int((rim / share_outstanding) * 100000000) # 단위:억원 환산, 정수처리\n",
" '''\n",
" except :\n",
" return (000000) # 종목정보 오류는 000000으로 세팅\n",
" else:\n",
" return (value_per_share)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### SRIM DB만들기\n",
"- code, date, year, close\n",
"- value_per_share10, value_per_share5, value_per_share10"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def insert_srim(icode, ref_year, value_per_share10, value_per_share5, value_per_share,type):\n",
" # ref_year = ref_year + 1 #RIM은 현재 값이 아닌 과거값이여서 현재는 현재-1 임.\n",
" if type == 'quarter':\n",
" '''\n",
" ref_year3month = datetime.strptime(ref_year,'%Y%m')\n",
" ref_year3month = ref_year3month + relativedelta(months=+2)\n",
" ref_year3month = ref_year3month.strftime('%Y%m')\n",
" '''\n",
" \n",
" ref_year3month = datetime.strptime(ref_year,'%Y%m') # string type를 date type으로 변환\n",
" ref_year3month = ref_year3month + relativedelta(months=-2) #직전 2개월 앞의 달을 구함, 왜냐하면? 분기 실적은 직전3개월 실적\n",
" ref_year3month = ref_year3month.strftime('%Y%m') # date type를 string type으로 변환\n",
" \n",
" if type == 'year':\n",
" # WHERE .. AND NOT ... 조건 사용. 두개 table 사용\n",
" sql = 'INSERT INTO srim_year (code, date, close, year)\\\n",
" SELECT code, date, close, YEAR(date) FROM krx_stock_price WHERE code = %s AND YEAR(date) = %s\\\n",
" AND NOT EXISTS (SELECT * FROM srim_year WHERE code = %s AND YEAR(date) = %s)'\n",
" connector.execute(sql, icode, ref_year, icode, ref_year)\n",
" \n",
" # 위 sql에서 WHERE ... AND NOT ... 조건 이면 update는 시행됨.\n",
" sql = 'UPDATE srim_year SET value_per_share10 = %s, value_per_share5 = %s, value_per_share = %s\\\n",
" WHERE year = %s AND code = %s'\n",
" connector.execute(sql, value_per_share10, value_per_share5, value_per_share, ref_year, icode)\n",
" \n",
" sql = 'UPDATE srim_year SET roe = (SELECT `ROE(%)` FROM naverfs_y WHERE code = %s AND YEAR(date) = %s)\\\n",
" WHERE year = %s AND code = %s'\n",
" connector.execute(sql, icode, ref_year,ref_year, icode)\n",
" elif type == 'quarter':\n",
" # 분기별로 구하것으로 year포맷을 YYYYmm으로 쿼리\n",
" # 3개월 단위로 데이터 사용하기...\n",
" sql = 'INSERT INTO srim_quarter (code, date, close, year)\\\n",
" SELECT code, date, close, date_format(date,\"%Y%m\") FROM krx_stock_price WHERE code = %s AND\\\n",
" date_format(date,\"%Y%m\") BETWEEN %s AND %s\\\n",
" AND NOT EXISTS (SELECT * FROM srim_quarter WHERE code = %s AND date_format(date,\"%Y%m\") BETWEEN %s AND %s)'\n",
" connector.execute(sql, icode, ref_year3month, ref_year, icode, ref_year3month, ref_year)\n",
"\n",
" # 위 sql에서 WHERE ... AND NOT ... 조건 이면 update는 시행됨.\n",
" sql = 'UPDATE srim_quarter SET value_per_share10 = %s, value_per_share5 = %s, value_per_share = %s\\\n",
" WHERE year BETWEEN %s AND %s AND code = %s'\n",
" connector.execute(sql, value_per_share10, value_per_share5, value_per_share, ref_year3month, ref_year, icode)\n",
" \n",
" sql = 'UPDATE srim_quarter SET roe = (SELECT `ROE(%)` FROM naverfs_q WHERE code = %s AND date_format(date,\"%Y%m\") = %s)\\\n",
" WHERE year BETWEEN %s AND %s AND code = %s'\n",
" connector.execute(sql, icode, ref_year, ref_year3month, ref_year , icode)\n",
" \n",
" return None\n",
"\n",
"def get_bond_kospi(start_year):\n",
" # 국채 3년 금리 구하기\n",
" sql = 'SELECT date, national_bond_3y FROM bond WHERE date > %(start_year)s'\n",
" df_bond = pd.read_sql(sql, con=engine, params = {'start_year':start_year})\n",
" df_bond = df_bond.set_index('date')\n",
" # KOSPI 지수 구하기\n",
" df_kospi = data.DataReader(\"KRX:KOSPI\", 'google', start_year)\n",
" # 두 dataframe 합치기\n",
" df_bond_kospi = df_kospi.join(df_bond, how = 'inner')\n",
" \n",
" return (df_bond_kospi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### SRIM, CLOSE등 그래프 그리기"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def plt_year_srim(icode,iname, bond_kospi):\n",
" font_name = font_manager.FontProperties(fname=\"c:/Windows/Fonts/malgun.ttf\").get_name()\n",
" rc('font', family=font_name)\n",
" try:\n",
" fig = plt.figure(figsize=(15,12))\n",
" ax1 = plt.subplot2grid((5,5), (0,0), colspan=5,rowspan=2) #종합지수,국채\n",
" ax2 = plt.subplot2grid((5,5), (2,0), colspan=5,rowspan=3) #SRIM 6년\n",
"\n",
" \n",
" # 종합주가지수, 국채3년금리 그리기, 이중 그래프\n",
" ax1_index = pd.to_datetime(bond_kospi.index,format='%Y-%m')\n",
" ax1.plot(ax1_index, bond_kospi.loc[:,'Close'].values, 'black', label = 'KOSPI')\n",
" ax1.set_ylabel('KOSPI')\n",
" for label in ax1.get_yticklabels():\n",
" label.set_color(\"black\")\n",
"\n",
" ax11 = ax1.twinx()\n",
" ax11.plot(ax1_index, bond_kospi.loc[:,'national_bond_3y'].values, 'darkgreen', label = 'national_bond_3y')\n",
" ax11.set_ylabel('national_bond_3y')\n",
" for label in ax11.get_yticklabels():\n",
" label.set_color(\"darkgreen\")\n",
"\n",
" \n",
" # subplot에 정보 표기\n",
" # text box\n",
" text_str = 'National_bond_3y=%s\\nKOSPI=%s'\\\n",
" % (bond_kospi.loc[:,'national_bond_3y'].iloc[-1],bond_kospi.loc[:,'Close'].iloc[-1])\n",
" ax1.text(0.20, 0.80, text_str, transform = ax1.transAxes, color = 'red')\n",
" # 타이틀\n",
" ax1.set_title('KOSPI & National_bond_3y')\n",
" # 레이블\n",
" ax1.set_xlabel('Date')\n",
" ax1.set_ylabel('KOSPI & National_bond')\n",
" #그리드\n",
" ax1.grid(True)\n",
" # 법례\n",
" ax1.legend(loc=3)\n",
" ax11.legend(loc=2)\n",
" \n",
" # SRIM 6년 그래프 그리기\n",
" sql = 'SELECT * FROM srim_year WHERE code = %(code)s ORDER BY date' # ORDER BY date 미시행시 그래프 깨짐, 순서틀어짐\n",
" df_srim = pd.read_sql(sql, con=engine, params = {'code':icode})\n",
" srim = df_srim[['date', 'value_per_share','value_per_share10','value_per_share5','close', 'roe']]\n",
" srim = srim.fillna(method='ffill') # NaN는 앞의 값을 가지고 채우기\n",
"\n",
" # 5, 20일 이동평균선\n",
" srim.loc[:,'MA_5'] = srim.loc[:,'close'].rolling(center=False,window=5).mean()\n",
" srim.loc[:,'MA_20'] = srim.loc[:,'close'].rolling(center=False,window=20).mean()\n",
" srim.loc[:,'diff'] = srim.loc[:,'MA_5'] - srim.loc[:,'MA_20']\n",
" #\n",
" ax2_index = pd.to_datetime(srim.loc[:,'date'].values,format='%Y-%m')\n",
" ax2.plot(ax2_index, srim.loc[:,'value_per_share'].values, 'red', label='value_per_share')\n",
" ax2.plot(ax2_index, srim.loc[:,'value_per_share10'].values, 'green', label='value_per_share10')\n",
" ax2.plot(ax2_index, srim.loc[:,'value_per_share5'].values, 'blue', label='value_per_share5')\n",
" ax2.plot(ax2_index, srim.loc[:,'close'].values, 'black', label='close')\n",
" ax2.plot(ax2_index, srim.loc[:,'MA_5'].values, 'cyan', label='MA_5')\n",
" ax2.plot(ax2_index, srim.loc[:,'MA_20'].values, 'magenta', label='MA_20')\n",
" \n",
" \n",
" #5일, 20일 골드,데드 표기하기\n",
" '''\n",
" prev_key = prev_val = 0\n",
" for key, val in srim.loc[:,'diff'].iteritems():\n",
" if val == 0:\n",
" continue\n",
" \n",
" if val * prev_val < 0 and val > prev_val:\n",
" ax2.annotate('Golden', xy=(key, srim.loc[:,'MA_20'][key]), xytext=(10,-30),\\\n",
" textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))\n",
" elif val * prev_val < 0 and val < prev_val:\n",
" ax2.annotate('Dead', xy=(key, srim.loc[:,'MA_20'][key]), xytext=(10,30),\\\n",
" textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))\n",
" prev_key, prev_val = key, val\n",
" '''\n",
" # tight_layout하지 않으면 두개 그래프 겹침\n",
" # fig.tight_layout()\n",
" \n",
"\n",
" # ROE subplot에 정보 표기\n",
" ax22 = ax2.twinx()\n",
" # ax22.plot(ax2_index, srim.loc[:,'roe'].values, 'magenta', label = 'ROE', linestyle = ':')\n",
" ax22.plot(ax2_index, srim.loc[:,'roe'].values, 'black', label = 'ROE', linestyle = ':')\n",
" ax22.set_ylabel('ROE(%)')\n",
" for label in ax22.get_yticklabels():\n",
" label.set_color(\"black\")\n",
" \n",
" # subplot에 정보 표기\n",
" text_str = 'code=%s\\ncode_name=%s\\nvalue_per_share=%s\\nvalue_per_share10=%s\\nvalue_per_share5=%s\\nclose=%s\\ndate=%s\\n'\\\n",
" %(icode,iname, srim['value_per_share'].iloc[-1], srim['value_per_share10'].iloc[-1], srim['value_per_share5'].iloc[-1], srim['close'].iloc[-1],srim['date'].iloc[-1])\n",
"\n",
" ax2.text(0.20, 0.60, text_str, transform = ax2.transAxes, color = 'red')\n",
" # 타이틀\n",
" ax2.set_title('S-RIM_'+iname)\n",
" # 레이블\n",
" ax2.set_xlabel('Date')\n",
" ax2.set_ylabel('Close')\n",
" #그리드\n",
" ax2.grid(True)\n",
" # 법례\n",
" ax2.legend(loc=2)\n",
" ax22.legend(loc=3)\n",
" \n",
" dir ='D://srim//jpg//'\n",
" fig.savefig(dir+'YearSrim_'+icode+'_'+iname+'.svg') # svg 포맷으로 저장, 디스크 용량문제로 D:에 저장함.\n",
" except :\n",
" return None\n",
" else:\n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plt_quarter_srim(icode,iname):\n",
" font_name = font_manager.FontProperties(fname=\"c:/Windows/Fonts/malgun.ttf\").get_name()\n",
" rc('font', family=font_name)\n",
" try:\n",
" fig = plt.figure(figsize=(15,5))\n",
" ax1 = plt.subplot2grid((5,5), (0,0), colspan=5,rowspan=5)\n",
" \n",
" # SRIM 6년 그래프 그리기\n",
" sql = 'SELECT * FROM srim_quarter WHERE code = %(code)s ORDER BY date' # ORDER BY date 미시행시 그래프 깨짐, 순서틀어짐\n",
" df_srim = pd.read_sql(sql, con=engine, params = {'code':icode})\n",
" srim = df_srim[['date', 'value_per_share','value_per_share10','value_per_share5','close', 'roe']]\n",
" srim = srim.fillna(method='ffill') # NaN는 앞의 값을 가지고 채우기\n",
"\n",
" # 5, 20일 이동평균선\n",
" srim.loc[:,'MA_5'] = srim.loc[:,'close'].rolling(center=False,window=5).mean()\n",
" srim.loc[:,'MA_20'] = srim.loc[:,'close'].rolling(center=False,window=20).mean()\n",
" srim.loc[:,'diff'] = srim.loc[:,'MA_5'] - srim.loc[:,'MA_20']\n",
" #\n",
" ax1_index = pd.to_datetime(srim.loc[:,'date'].values,format='%Y-%m')\n",
" ax1.plot(ax1_index, srim.loc[:,'value_per_share'].values, 'red', label='value_per_share')\n",
" ax1.plot(ax1_index, srim.loc[:,'value_per_share10'].values, 'green', label='value_per_share10')\n",
" ax1.plot(ax1_index, srim.loc[:,'value_per_share5'].values, 'blue', label='value_per_share5')\n",
" ax1.plot(ax1_index, srim.loc[:,'close'].values, 'black', label='close')\n",
" ax1.plot(ax1_index, srim.loc[:,'MA_5'].values, 'cyan', label='MA_5')\n",
" ax1.plot(ax1_index, srim.loc[:,'MA_20'].values, 'magenta', label='MA_20')\n",
" \n",
" \n",
" #5일, 20일 골드,데드 표기하기\n",
" '''\n",
" prev_key = prev_val = 0\n",
" for key, val in srim.loc[:,'diff'].iteritems():\n",
" if val == 0:\n",
" continue\n",
" \n",
" if val * prev_val < 0 and val > prev_val:\n",
" ax2.annotate('Golden', xy=(key, srim.loc[:,'MA_20'][key]), xytext=(10,-30),\\\n",
" textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))\n",
" elif val * prev_val < 0 and val < prev_val:\n",
" ax2.annotate('Dead', xy=(key, srim.loc[:,'MA_20'][key]), xytext=(10,30),\\\n",
" textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))\n",
" prev_key, prev_val = key, val\n",
" '''\n",
" # tight_layout하지 않으면 두개 그래프 겹침\n",
" # fig.tight_layout()\n",
" \n",
"\n",
" # ROE subplot에 정보 표기\n",
" ax11 = ax1.twinx()\n",
" # ax22.plot(ax2_index, srim.loc[:,'roe'].values, 'magenta', label = 'ROE', linestyle = ':')\n",
" ax11.plot(ax1_index, srim.loc[:,'roe'].values, 'black', label = 'ROE', linestyle = ':')\n",
" ax11.set_ylabel('ROE(%)')\n",
" for label in ax11.get_yticklabels():\n",
" label.set_color(\"black\")\n",
" \n",
" # subplot에 정보 표기\n",
" text_str = 'code=%s\\ncode_name=%s\\nvalue_per_share=%s\\nvalue_per_share10=%s\\nvalue_per_share5=%s\\nclose=%s\\ndate=%s\\n'\\\n",
" %(icode,iname, srim['value_per_share'].iloc[-1], srim['value_per_share10'].iloc[-1], srim['value_per_share5'].iloc[-1], srim['close'].iloc[-1],srim['date'].iloc[-1])\n",
"\n",
" ax1.text(0.20, 0.60, text_str, transform = ax1.transAxes, color = 'red')\n",
" # 타이틀\n",
" ax1.set_title('S-RIM_'+iname)\n",
" # 레이블\n",
" ax1.set_xlabel('Date')\n",
" ax1.set_ylabel('Close')\n",
" #그리드\n",
" ax1.grid(True)\n",
" # 법례\n",
" ax1.legend(loc=2)\n",
" ax11.legend(loc=3)\n",
" \n",
" dir ='D://srim//jpg//'\n",
" fig.savefig(dir+'QuarterSrim_'+icode+'_'+iname+'.svg') # svg 포맷으로 저장, 디스크 용량문제로 D:에 저장함.\n",
" plt.close('all') #close하지 않으면 max20 open RuntimeWarning발생하여 더이상 fig open이 안됨.\n",
" except :\n",
" return None\n",
" else:\n",
" return None"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Main Start"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"if __name__ == \"__main__\":\n",
" value_per_share10 = 0\n",
" value_per_share5 = 0\n",
" value_per_share = 0\n",
" ref_year = 0\n",
" \n",
" pwd = 'rlaehgus1'\n",
" engine = create_engine('mysql+mysqlconnector://root:'+pwd+'@localhost/findb', echo=False)\n",
" connector = engine.connect()\n",
"\n",
" #요구수익률 가져오기\n",
" required_rate_of_return = get_required_rate_of_return() \n",
" required_rate_of_return = required_rate_of_return / 100 # 단위 % 환산\n",
" \n",
" #국채 금리구하기\n",
" sql = 'SELECT * FROM naverfs_y ORDER BY date LIMIT 1'\n",
" result = connector.execute(sql)\n",
" s_year = result.fetchone()\n",
" \n",
" s_year = s_year[0]\n",
" df_bond_kospi = get_bond_kospi(s_year)\n",
"\n",
" df_code_name = get_code_name()\n",
" '''\n",
" li_code = df_code_name.loc[:,'code'] # 전체 종목에 대해서 조회\n",
" li_name = df_code_name.loc[:,'name']\n",
" '''\n",
" li_code = ['005930'] # 특정 종목에 대해서 조회\n",
" li_name = ['삼성전자']\n",
" \n",
" \n",
" for i in range(0,len(li_code)):\n",
" icode = li_code[i]\n",
" icode = icode.zfill(6)\n",
" iname = li_name[i]\n",
" \n",
" #------------------------------------------ 년간 SRIM 구하기\n",
" # naverfs_y에서 RIM작성을 위한 데이터 추출\n",
" sql = 'SELECT code, date, `roe(%)`, `자본총계(지배)`, `발행주식수(보통주)` \\\n",
" FROM naverfs_y WHERE code = %s ORDER BY date'\n",
" result = connector.execute(sql, icode)\n",
" stock = result.fetchall()\n",
"\n",
" columns = ['code','date','roe','capital','share_outstanding']\n",
" index = list() #index만들기 위해 선언해 놓음\n",
" df_stock = DataFrame(stock, columns = columns)\n",
" \n",
" # date를 기준으로 정력하고 year만을 취하여 index함.\n",
" # df_stock = df_stock.sort_values(by='date')\n",
" for i in range(0,len(df_stock)):\n",
" index.append(df_stock.loc[i,'date'].year)\n",
" last_year = index[len(index) - 1]\n",
" # start_year = df_stock.loc[0,'date']\n",
" df_stock = DataFrame(stock, columns = columns, index = index)\n",
" df_stock = df_stock.fillna(method='ffill') # NaN는 앞의 값을 가지고 채우기\n",
" df_stock = df_stock.T # 행,렬 바뀌기\n",
" #\n",
"\n",
" sql = 'SELECT date FROM naverfs_y WHERE code = %s ORDER BY date '\n",
" imsi_result = connector.execute(sql, icode)\n",
" li_date = imsi_result.fetchall()\n",
" \n",
" for i in range(0,len(li_date)):\n",
" ref_year = li_date[i][0].year \n",
" #년 단위 SRIM 계산\n",
" coefficients = [0.0, 0.1, 0.2]\n",
" for coefficient in coefficients: # 0.0 - 지속, 0.1 - 10%, 10년, 0.2 - 20%, 5년:\n",
" r_value_per_share = get_roe_date(icode, coefficient, required_rate_of_return,ref_year,df_stock, 'year')\n",
" if coefficient == 0.0: # 지속성장\n",
" value_per_share = r_value_per_share\n",
" elif coefficient == 0.1: #10년 성장\n",
" value_per_share10 = r_value_per_share\n",
" elif coefficient == 0.2: #5년 성장\n",
" value_per_share5 = r_value_per_share\n",
" # 년도별 srim 테이블 만들기\n",
" insert_srim(icode, ref_year, value_per_share10, value_per_share5, value_per_share, 'year')\n",
" # srim 전체 그래프 그리기\n",
" plt_year_srim(icode, iname, df_bond_kospi)\n",
" \n",
" #----------------------------------------- 분기별 SRIM 구하기\n",
" # naverfs_q에서 RIM작성을 위한 데이터 추출\n",
" sql = 'SELECT code, date, `roe(%)`, `자본총계(지배)`, `발행주식수(보통주)` \\\n",
" FROM naverfs_q WHERE code = %s ORDER BY date'\n",
" result = connector.execute(sql, icode)\n",
" stock = result.fetchall()\n",
"\n",
" columns = ['code','date','roe','capital','share_outstanding']\n",
" index = list() #index만들기 위해 선언해 놓음\n",
" df_stock = DataFrame(stock, columns = columns)\n",
"\n",
" # date를 기준으로 정력하고 Year + Month 인덱스 만들기\n",
" # df_stock = df_stock.sort_values(by='date')\n",
" for i in range(0,len(df_stock)):\n",
" index.append(df_stock.loc[i,'date'].strftime('%Y%m'))\n",
" last_year = index[len(index) - 1]\n",
" # start_year = df_stock.loc[0,'date']\n",
" df_stock = DataFrame(stock, columns = columns, index = index)\n",
" df_stock = df_stock.fillna(method='ffill') # NaN는 앞의 값을 가지고 채우기\n",
" df_stock = df_stock.T # 행,렬 바뀌기\n",
" #\n",
" sql = 'SELECT date FROM naverfs_q WHERE code = %s ORDER BY date '\n",
" imsi_result = connector.execute(sql, icode)\n",
" li_date = imsi_result.fetchall()\n",
" \n",
" for i in range(0,len(li_date)):\n",
" ref_month = li_date[i][0].strftime('%Y%m')\n",
" #분기 단위 SRIM 계산\n",
" coefficients = [0.0, 0.1, 0.2]\n",
" for coefficient in coefficients: # 0.0 - 지속, 0.1 - 10%, 10년, 0.2 - 20%, 5년:\n",
" r_value_per_share = get_roe_date(icode, coefficient, required_rate_of_return,ref_month, df_stock, 'quarter')\n",
" if coefficient == 0.0: # 지속성장\n",
" value_per_share = r_value_per_share\n",
" elif coefficient == 0.1: #10년 성장\n",
" value_per_share10 = r_value_per_share\n",
" elif coefficient == 0.2: #5년 성장\n",
" value_per_share5 = r_value_per_share\n",
"\n",
" # 년도별 srim 테이블 만들기\n",
" insert_srim(icode, ref_month, value_per_share10, value_per_share5, value_per_share, 'quarter')\n",
" # srim 전체 그래프 그리기\n",
" plt_quarter_srim(icode, iname)\n",
" \n",
" connector.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"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": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment