You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.5 KiB

5 years ago
  1. import requests
  2. import pandas as pd
  3. from bs4 import BeautifulSoup
  4. import numpy as np
  5. import datetime
  6. pd.set_option('display.expand_frame_repr', False)
  7. import re
  8. def get_financial_statements(code):
  9. # 인증값 추출
  10. re_enc = re.compile("encparam: '(.*)'", re.IGNORECASE)
  11. re_id = re.compile("id: '([a-zA-Z0-9]*)' ?", re.IGNORECASE)
  12. url = "http://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd={}".format(code)
  13. html = requests.get(url, verify=False).text
  14. search = re_enc.search(html)
  15. if search is None:
  16. return {}
  17. encparam = re_enc.search(html).group(1)
  18. encid = re_id.search(html).group(1)
  19. # 스크래핑
  20. url = "http://companyinfo.stock.naver.com/v1/company/ajax/cF1001.aspx?cmp_cd={}&fin_typ=0&freq_typ=A&encparam={}&id={}".format(
  21. code, encparam, encid)
  22. headers = {"Referer": "HACK"}
  23. html = requests.get(url, headers=headers, verify=False).text
  24. soup = BeautifulSoup(html, "html5lib")
  25. dividend = soup.select("table:nth-of-type(2) tr:nth-of-type(31) td span")
  26. years = soup.select("table:nth-of-type(2) th")
  27. dividend_dict = {}
  28. for i in range(len(dividend)):
  29. dividend_dict[years[i + 3].text.strip()[:4]] = dividend[i].text
  30. return dividend_dict
  31. def get_3year_treasury():
  32. url = "http://www.index.go.kr/strata/jsp/showStblGams3.jsp?stts_cd=107301&idx_cd=1073&freq=Y&period=1997%3A2021"
  33. html = requests.get(url, verify=False).text
  34. soup = BeautifulSoup(html, 'html5lib')
  35. td_data = soup.select("tr td")
  36. treasury_3year = {}
  37. start_year = 1998
  38. for x in td_data:
  39. treasury_3year[start_year] = x.text
  40. start_year += 1
  41. if start_year == datetime.datetime.now().year:
  42. break
  43. return treasury_3year
  44. def get_dividend_yield(code):
  45. url = "http://companyinfo.stock.naver.com/company/c1010001.aspx?cmp_cd=" + code
  46. html = requests.get(url, verify=False).text
  47. soup = BeautifulSoup(html, 'html5lib')
  48. dt_data = soup.select("td dl dt")
  49. dividend_yield = dt_data[-2].text
  50. dividend_yield = dividend_yield.split(' ')[1]
  51. dividend_yield = dividend_yield[:-1]
  52. return dividend_yield
  53. def get_estimated_dividend_yield(code):
  54. dividend_yield = get_financial_statements(code)
  55. if len(dividend_yield) == 0:
  56. return 0
  57. dividend_yield = sorted(dividend_yield.items())[-1]
  58. return dividend_yield[1]
  59. def get_current_3year_treasury():
  60. url = "http://finance.naver.com/marketindex/interestDailyQuote.nhn?marketindexCd=IRR_GOVT03Y&page=1"
  61. html = requests.get(url, verify=False).text
  62. soup = BeautifulSoup(html, 'html5lib')
  63. td_data = soup.select("tr td")
  64. return td_data[1].text
  65. def get_previous_dividend_yield(code):
  66. dividend_yield = get_financial_statements(code)
  67. now = datetime.datetime.now()
  68. cur_year = now.year
  69. previous_dividend_yield = {}
  70. for year in range(cur_year - 5, cur_year):
  71. if str(year) in dividend_yield:
  72. previous_dividend_yield[year] = dividend_yield[str(year)]
  73. return previous_dividend_yield
  74. if __name__ == "__main__":
  75. estimated_dividend_yield = get_estimated_dividend_yield("058470")
  76. print(estimated_dividend_yield)
  77. current_3year_treasury = get_current_3year_treasury()
  78. print(current_3year_treasury)
  79. estimated_dividend_to_treasury = float(estimated_dividend_yield) / float(current_3year_treasury)
  80. print(estimated_dividend_to_treasury)
  81. # print(get_estimated_dividend_yield('058470'))
  82. # print(get_current_3year_treasury())
  83. # print(get_previous_dividend_yield('058470'))