Created
July 29, 2017 02:18
-
-
Save KimMyungSam/35c32b3c3ad1d75073945f8f40731406 to your computer and use it in GitHub Desktop.
전체종목에 대해서 SRIM 결과를 이미지로 저장
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": {}, | |
"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