레이블이 Korean stuffs인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Korean stuffs인 게시물을 표시합니다. 모든 게시물 표시
STRUCTURE

#Replace some special characters
def find_value(text, unit):

#Draw figure of cashflows
def draw_cashflow_figure(income_list, income_list2, year_list, op_cashflow_list, fcf_list, div_list, stock_close):

#Draw figure of net income & assets
def draw_corp_history(year_list, asset_sum_list, liability_sum_list, equity_sum_list, sales_list, op_income_list, net_income_list):

#Write financial statements to Excel file
def write_excel_file(workbook_name, dart_post_list, cashflow_list, balance_sheet_list, income_statement_list, corp, stock_code, stock_cat):

#Get data of balance statements
def scrape_balance_sheet(balance_sheet_table, year, unit):

#Get data of cashflows statements
def scrape_cashflows(cashflow_table, year, unit):

#Get data of income statements
def scrape_income_statement(income_table, year, unit, mode):

#Main
def main():
import urllib.request
#Extensible library for opening URLs
import urllib.parse
#Parse URLs into components
import xlsxwriter
#Writing files in the Excel 2007+ XLSX file format.
import os
#Miscellaneous operating system interfaces 
import time
#Time access and conversions
import sys
#System-specific parameters and functions
import getopt
#C-style parser for command line options
from datetime import datetime, timedelta
#Basic date and time types
from bs4 import BeautifulSoup
import re
#Regular expression operations
import xlrd
#presenting all text strings as Python unicode objects.
import pandas_datareader
import numpy as np
import matplotlib.pyplot as plt

전 편에 이어서 포스팅 하도록 하겠습니다.
못 보신 분들을 위해 링크 걸겠습니다.

전자공시시스템(DART) 오픈API 이용하여 재무제표 크롤링하기 with 파이썬 (1)

여기서 크롤링이란 무엇일까요?

우리가 흔히 부르는 크롤링(crawling) 혹은 스크래핑(scraping)이라고 하는 것은,
웹 페이지를 그대로 가져와 데이터를 추출해 내는 행위입니다.
이러한 작업을 하는 소프트웨어를 크롤러(crawler)라고 부릅니다.



우리는 종목 코드와 원하는 기간동안의 보고서를 DataFrame으로 저장하여 손 쉽게 핸들링 할 수 있도록 만들었습니다. 지금부터는 보고서에 있는 재무제표를 크롤링 하겠습니다.


STEP 1. 페이지 분석 및 링크 확인

재무제표를 크롤링하기 위해서는 페이지를 분석을 해야합니다.
저는 과거에 위키피디아를 크롤링 해본적이 있습니다.
크롤링을 위해서는 html이나 javascript에 대한 이해가 필요한데, 저도 이 부분은 아는 바가 거의 전혀 없기 때문에 구글링하면서 하나하나 해결해나가도록 하겠습니다.
거듭 강조드리지만 문제를 해결하는 능력을 기르는 것이 중요합니다.

우선 저는 크롬을 사용하기 때문에 크롬의 기준에서 말씀드리겠습니다.
크롬에서 [도구 더 보기] - [개발자 도구]를 선택하면 개발자 도구를 사용할 수 있습니다.
다른 브라우저에서도 비슷한 도구들이 있으니 찾아보시기 바랍니다.


그러면 이런 형태의 창이 나옵니다.
위와 같이 HTML의 형태를 확인했으니 원하는 정보를 뽑아 올 것입니다.

웹 사이트의 데이터를 수집하는데 있어서는 2가지의 단계가 있습니다.

1. 스크래핑(Scraping) : 데이터를 가져오는 작업

2. 파싱(Parsing) : 가져온 데이터를 추출하는 작업

하지만 그 전에 해야 할 것은 바로 웹페이지에 접속하는 것이겠죠.
우리는 재무제표를 스크래핑 하기 전에 우선 재무제표의 url을 알아야합니다.


저기 [Network] 탭이 보이실 겁니다. 누르면 위와 같은 창이 나타납니다.
우측에 네트워크 탭을 선택하고 링크를 누르면 시간초 별로 서버에서 응답하는 목록을 확인할 수 있습니다. 우리는 이 기능을 통해서 url을 알아내도록 하겠습니다.
이제 웹페이지에 있는 재무제표를 누르시면 됩니다.

그러면 위와 같은 반응이 하나 나올 겁니다.
오른쪽 클릭 [Copy] - [Copy link address] 해봅시다.

저는 아래와 같은 주소가 나왔습니다. 


이 url이 재무제표로 넘어가는 url임을 알 수 있습니다.
여기서 우리는 rcpNo는 손쉽게 알 수 있었지만 dcmNo은 알기가 어렵습니다.
우리가 실제로 클릭하는 공시창의 왼쪽 부분의 페이지 소스 코드에는 없었거든요. 

참고로 저는 지금 실제로 하나하나 해결해가면서 포스팅 중입니다. 
미리 해본 것이 아닙니다.
왜 이런 말을 하나면! 사실 여기서 저는 urllib을 선택한 것을 후회했습니다.
왜냐하면 저는 재무제표를 클릭하기 전에는 dcmNo를 알 수가 없다고 생각합니다.
하지만 그걸 지금까지 몰랐습니다. 그래서 urllib으로 간단하게 하려고 했는데,
urllib는 onclick 기능(즉, 클릭해주는 기능)이 서칭해보니까 없는 것 같더라구요. 
(사실 있을수도 있습니다.) 
그래서 저는 과감하게 urllib을 버리고 requests와 lxml과 re 모듈을 사용하겠습니다.
지금까지 따라오시느라 배신감이 드시겠지만, 어쩔 수 없습니다. 
이런 과정들도 다 도움이 될 거라는 생각에 1편은 안 바꾸도록 하겠습니다.

최종 코드는 이렇습니다. (아직 수정 중입니다. 내일 중에 완성 될 듯 싶네요.)
참고로 1편에 썼던 urllib모듈의 메소드들은 requests모듈로 바꿨습니다.
하나하나 비교해보면서 배우시는 것도 좋을 것 같네요.
그러면 차근차근 분석해보도록 하겠습니다. 천천히 따라오세요.


우리는 request모듈의 get()메소드를 사용해서 응답을 요청했습니다.
그 다음 .text로 html코드를 획득한 뒤에
여기서 lxml모듈을 사용합니다.
lxml모듈의 설명은 아래와 같습니다.

lxml comes with a dedicated Python package for dealing with HTML: lxml.html. It is based on lxml's HTML parser, but provides a special Element API for HTML elements, as well as a number of utilities for common HTML processing tasks.

우리는 여기서 fromstring이라는 메소드를 사용 할 것입니다.


fromstring(string):
Returns document_fromstring or fragment_fromstring, based on whether the string looks like a full document, or just a fragment.

그 다음 우리는 Xpath라는 개념에 대해 알아봐야 합니다.

Xpath란?

XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어이다. XML 표현보다 더 쉽고 약어로 되어 있으며, XSL 변환(XSLT)과 XML 지시자 언어(XPointer)에 쓰이는 언어이다. XPath는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있다.

XML 예제 문서


  
     name="Wikipedia" launch="2001-01-05">
      
         language="English">en.wikipedia.org
         language="German">de.wikipedia.org
         language="French">fr.wikipedia.org
         language="Polish">pl.wikipedia.org
      
name="Wiktionary" launch="2002-12-12"> language="English">en.wiktionary.org language="French">fr.wiktionary.org language="Vietnamese">vi.wiktionary.org language="Turkish">tr.wiktionary.org
아래의 XPath 식은
/wikimedia/projects/project/@name
모든 project 요소의 name 속성을 선택하고, 아래의 XPath 식은
/wikimedia/projects/project/editions/edition[@language="English"]/text()
모든 영문 Wikimedia 프로젝트의 주소(language 속성이 English인 모든 edition 요소의 문자열)를 선택하고, 아래의 XPath 식은
/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()
모든 위키백과의 주소(Wikipedia의 이름 특성을 가진 project 요소 아래에 존재하는 모든 edition 요소의 문자열)를 선택한다.

이런 개념입니다. 저도 자세하게는 모르겠네요. 깊게 알고 싶지도 않습니다.
구글링의 도움을 빌려 코드를 빌려왔습니다. 필요하신 분들은 더 알아보시면 됩니다.

이 다음에는 re라는 파이썬의 기본 모듈을 사용합니다.
이 모듈은 파이썬에서 정규 표현식을 지원하도록 해줍니다.

정규 표현식이란?

정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용된다. 정규 표현식을 배우는 것은 파이썬을 배우는 것과는 또 다른 영역의 과제입니다.
배울 게 너무 많네요. 우리는 스킵하고 코드만 가져가도록 하죠.

우리는 결국 이러한 과정들을 통해 dcmNo를 구했습니다.
이 부분들이 너무 방대한 분량이라서 이해하기에는 무리가 있습니다.
일단 이런 것들이 있구나 하고 넘어가시면 되겠습니다.

STEP 2. 스크래핑(Scraping)

이제 해당 url에서 우리가 가져오고자 하는 표가 어디에 있는지 확인하겠습니다.
다시 [개발자 도구]에서 이번엔 [Elements] 탭을 선택합니다.
저기 초록색 버튼이 보이시나요?
저 버튼을 누르면 원하는 element를 검사하게 됩니다.
저걸 누른 뒤에 재무제표를 아무데나 눌러봅시다.


여기서 HTML에 대해 간단히 알아보도록 하겠습니니다.

HTML의 구조는 대략 이렇습니다.

    
    
    
        
            Here's a paragraph of text!
            Learn Data Science Online
        
Here's a second paragraph of text! Python
그러면 우리가 앞에서 검사한 element를 볼까요?
td라고 하는 태그에 파란 불이 켜진 것을 확인 할 수 있습니다.
td 옆에 tr tbody table 등 있는 것들은 모두 td의 상위 태그들입니다.

왼쪽에 있을수록 상위 태그이므로 하나하나 눌러서 확인해보면
table이라는 태그가 내가 선택한 표라는 것을 확인할 수 있습니다.
재무제표에는 여러 table들이 있네요.라는 태그를 상속받은 태그를 사용한다는 것을 인지하고 확인해봅시다.



우리가 아까 전에 간단히 알아본 XPath라는 개념을 여기서 다시 사용합니다.
오른쪽 버튼을 누르고 [Copy] - [Copy XPath] 를 눌러서 XPath를 알아봅시다.
규칙성을 확인해보기 위해서 3개 정도를 알아보도록 하겠습니다.
저는 1번째, 2번째, 그리고 12번째 값의 Xpath를 알아보았습니다.

/html/body/table[2]/tbody/tr[2]/td[2]
/html/body/table[2]/tbody/tr[3]/td[2]
/html/body/table[2]/tbody/tr[13]/td[2]

이런 식의 규칙성을 보이고 있네요.
이렇게 웹페이지의 규칙적인 정보는 대부분 아파트와 같은 구조를 가지고 있습니다.
우리는 이 규칙성을 이용해서 컴퓨터에게 데이터에 접근하도록 할 것입니다.











오픈API란?

오픈 API(Open Application Programming Interface, Open API, 공개 API)는 누구나 사용할 수 있도록 공개된 API를 말한다.

구글맵이 대표적인 예이다. 지도 서비스 및 다양한 서비스들에서 시도되고 있으며 누구나 접근하여 사용할 수 있다는 장점이 있다. 메타블로그들도 오픈 API를 사용하여 만드는 것들이다.

전자공시시스템이란?

전자공시시스템(DART ; Data Analysis, Retrieval and Transfer System)은 상장법인 등이 공시서류를 인터넷으로 제출하고, 투자자 등 이용자는 제출 즉시 인터넷을 통해 조회할 수 있도록 하는 종합적 기업공시 시스템입니다.



현재 DART에서는 검색API기업개황API, 2가지API를 제공 중입니다.
개발가이드를 참고 하실 분들은 아래 링크를 이용 바랍니다.

현재 직접적으로 재무제표를 제공하는 API는 없기 때문에 검색API를 통해 재무제표 정보를 확인 하도록 하겠습니다.

우선 DART에 접속해서 인증키를 신청하시면 아래와 같이 발급 받을 수 있습니다.
이 인증키는 개인마다 다른 번호로 발급됩니다.
개인용은 일일 사용량은 10,000건으로 제한 되어 있습니다.


API를 이용하여 정보를 요청 할 때, 형식에 맞게 url을 만들어 요청하면 됩니다.
우선 url에 본인이 확인하고 싶은 종목의 종목 코드를 넣으면 됩니다.

저는 제가 지금 보유중인 기업은행 종목코드(024110)를 넣겠습니다.

우리가 재무제표를 보기 위해 확인해야 할 공시는 정기공시입니다.
아래는 정기공시에서도 우리가 사용할 정기공시의 종류입니다.

1. 사업보고서
기업들의 연간 결산에 대한 내용들을 담은 보고서.
사업연도말 경과 후 90일 이내에 사업보고서를 금융위원회와 한국거래소에 제출. (즉, 12월 결산 기업은 3월31일 이내)

2. 분기보고서
분기·반기보고서의 기재사항은 사업보고서를 표준으로 함.
* 분기 결산후 45일 이내 고시. (1분기 실적 결산 후면 4월 15일까지)

3. 반기보고서
반기보고서는 사업연도가 1년인 상장법인이나 코스닥 등록법인이 그 사업연도 개시일부터 6개월째 되는 날에 가결산을 하여 재무상태와 6개월 동안의 경영성과를 요약한 서류.
* 반기보고서는 반기 결산기 말로부터 45일 내에 제출

위의 3가지 보고서를 토대로 재무제표를 크롤링 하도록 하겠습니다.

검색API는 xml 응답과 json 응답을 받을 수 있습니다.
요청 주소에 따라 달라지는데 우리는 친숙한 xml 형식으로 되어있는 xml 응답 주소에
요청 하도록 하겠습니다.


그 다음에 우리는 요청 변수가 어떤 것들이 있는지 확인 해보도록 하겠습니다.
우리가 저 주소에 요청할 수 있는 변수는 아래와 같습니다. (개발가이드 참고)


필수라고 되어있는 인증키는 당연히 필수로 입력해야 합니다.
그래서 지금 우리가 사용할 변수는 

인증키 auth
종목코드  crp_cd
검색종료 접수일자 end_dt
검색시작 접수일자 start_dt
공시종류 dsp_tp
세부공시종류 bsn_tp
정도입니다.
위에 명시되어 있는 변수 형태로 코드를 입력한뒤 응답 요청하도록 하겠습니다.
코드는 아래와 같습니다.





과정은 이렇습니다. 천천히 이해하면서 따라오시기 바랍니다.

STEP 1. 필요한 모듈 import

STEP 2. 인증키, 종목 코드, 시작 날짜 변수화

STEP 3. 요청 변수를 조합하여 요청할 url 변수화

STEP 4. url연 뒤에 읽어오기

우리는 from urllib.request import urlopen 을 통해 urllib.request에 있는 urlopen을 import 했습니다. urllib은 URL handling modules입니다. 
우리가 사용한 urllib.request는 urllib.request for opening and reading URLs이라고 설명되어 있습니다. 쉽게 말해 스타크래프트 확장팩과 같은 구조라고 보시면 됩니다.

아래는 urlopen 메소드의 구조입니다.
이런 문서를 읽을 줄 알아야 파이썬의 진가가 발휘되므로 영어에 익숙해 지셔야 합니다.
(https://docs.python.org/3/library/urllib.request.html#module-urllib.request 참조)


urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

Open the URL url, which can be either a string or a Request object.
If the URL does not have a scheme identifier, or if it has file: as its scheme identifier, this opens a local file (without universal newlines); otherwise it opens a socket to a server somewhere on the network. If the connection cannot be made the IOError exception is raised. If all went well, a file-like object is returned. This supports the following methods: read()readline()readlines()fileno(),close()info()getcode() and geturl(). It also has proper support for the iterator protocol. One caveat: the read() method, if the size argument is omitted or negative, may not read until the end of the data stream; there is no good way to determine that the entire stream from a socket has been read in the general case.

위에를 보시면 a file-like object 가 리턴됩니다. 여기서 우리는 read() 메소드를 사용하여  객체를 읽어올 것입니다. (위의 메소드 설명들은 파이썬2버전의 문서에서 가져왔습니다. 한 문서에 모든 것들이 다 설명되어 있지 않은 경우가 있기 때문에 검색하는 능력을 길러야 합니다.)

STEP 5. 데이터 뽑아오기(정제과정)

우리가 위에서 import한 bs4의 BeautifulSoup의 설명은 아래와 같습니다.
Beautiful Soup is a Python library for pulling data out of HTML and XML files.

Beautiful Soup에는 파싱하는 여러가지 방법들이 있습니다. 

This table summarizes the advantages and disadvantages of each parser library:
ParserTypical usageAdvantagesDisadvantages
Python’s html.parserBeautifulSoup(markup, "html.parser")
  • Batteries included
  • Decent speed
  • Lenient (as of Python 2.7.3 and 3.2.)
  • Not very lenient (before Python 2.7.3 or 3.2.2)
lxml’s HTML parserBeautifulSoup(markup, "lxml")
  • Very fast
  • Lenient
  • External C dependency
lxml’s XML parserBeautifulSoup(markup, "lxml-xml")BeautifulSoup(markup, "xml")
  • Very fast
  • The only currently supported XML parser
  • External C dependency
html5libBeautifulSoup(markup, "html5lib")
  • Extremely lenient
  • Parses pages the same way a web browser does
  • Creates valid HTML5
  • Very slow
  • External Python dependency


여러 장단점들이 있지만 우리는 html.parser를 사용하겠습니다.
만들어진 xmlsoup 객체는 정보가 list tag단위로 저장되게 됩니다.
우리는 이 객체를 list단위로 슬라이싱하여 저장 한 뒤에 for문을 사용하여 
한 줄씩 dataframe으로 저장하고 합치겠습니다.

STEP 6. 파싱한 데이터를 데이터프레임으로 변환 

pandas의 dataframe이라는 데이터형식은 데이터 핸들링을 용이하고 빠르게 만들어줍니다.
이 부분은 방대한 양이므로 따로 공부바랍니다. 반드시 필요한 부분입니다.
빈 DataFrame을 만든 뒤에 BeautifulSoup의 findAll() 메소드를 사용합니다.
(높은 버전에서는 find_all()로 바뀐 것 같습니다.)

find_all()의 시그니처입니다.
find_all(nameattrsrecursivestringlimit**kwargs)
The find_all() method looks through a tag’s descendants and retrieves all descendants that match your filters. 


우리는 list로 나뉜 정보를 모두 찾은 뒤에 차곡차곡 DataFrame에 넣었습니다.
각 컬럼마다 보고서가 한 개씩 들어있는 구조가 됩니다.

STEP 7. 인덱스 수정 

현재 print(data)를 해보면 컬럼 인덱스가 0으로 되어 있는 것을 확인 하실 수 있습니다.
이것을 pandas의 reset_index()메소드를 사용하여 리셋 하겠습니다.

OPTIONAL STEP. 원하는 보고서 오픈

우리는 webbrowser라는 모듈을 import했었습니다.
아래는 설명입니다.
The webbrowser module provides a high-level interface to allow displaying Web-based documents to users.
우리는 만들었던 DataFrame을 이용해 새로운 user_url이라는 url을 만들어서 이를 이용하겠습니다. 
webbrowser의 open메소드를 사용하면 간편하게 웹페이지를 오픈 할 수 있습니다.

다음 편에서는 보고서에서 재무제표에 해당하는 부분을 크롤링 해오도록 하겠습니다.

======

참고 웹사이트 : http://tariat.tistory.com/31 (테리엇의 디지털 놀이터)

산업 분석 - <현대건설>

시가 총액 : 4조 4205억원 (건설업 2위)




수정 PER은 7.01로서 동종업계에서 상당히 낮은 수치이다.

또한 PBR은 0.63로서 삼성물산, 대우건설, 대림산업 등의 5대 건설사 중 낮은 편에 속한다.


건설업


건설업은 토목, 건축, 플랜트로 나뉘며 토목은 도로, 댐 등의 공공시설을 만드는 것이고 건축은 주택, 건물 등의 건축물을, 플랜트는 발전소나 유전설비 등의 설비를 건설하는 것을 말한다. 
건설업의 특성상 공사 기간이 길어 공사 진행률이 바뀌거나 계약상황이 변화하기 때문에 제조원가 계산이 어렵다. 
2013~2015년 부동산 경기 호황이 있어 공급량이나 주택 가격이 모두 좋았으며 해외 건설의 경우 2008년 글로벌 금융위기 이후 부동산 경기 침체로 대형 건설사들이 해외로 눈을 돌려 플랜트 건설에 주력했다. 
하지만 과거 과도한 경쟁으로 저가 수주를 받아 공사를 진행하였기 때문에 원가율이 악화되었다는 문제가 있었다. 
또한 중동에서 주로 이루어지는 플랜트 발주는 산유국의 재정 상태에 영향을 받으며, 산유국의 재정 상태는 유가 동향과 밀접한 관련이 있기 때문에 유가는 건설사의 해외 영업 실적에 영향을 미친다.


(2017년 3분기 실적 기준)

현재 현대건설은 국내 건설/주택 사업과 해외 플랜트의 매출이 가장 크다 (플랜트,건축>토목). 
현재 새 정부 출범 이후 강력해진 부동산 규제로 인해 공급과 가격 상승에 제한이 걸릴 것으로 예상되므로 모멘텀 부재의 우려가 있다. 
최근 CIS지역 및 신흥국의 대형 플랜트 인프라 투자 증가로 인해 해외 수주는 지속적으로 유지되므로 국내 수주가 줄더라도 당장은 망하지 않는다. 
(수 년째 건설업이 불황이라는 투자자의 낮은 기대와 맞물려 저평가가 예상된다). 
하지만 최근 2017년도 저가 수주로 인해 원가율이 악화되고 현대건설의 신흥국 플랜트 공사 매출이 일시적으로 축소되었다. 따라서 주가는 앞으로 더 하락할 것으로 예상된다. 

PBR은 하락세이다. PBR 밴드를 보면,


2012~2013년 건설업 호황 시 1.5가 넘었던 PBR은 이후 지속적으로 하락하며 현재 0.7로서 역사적 저점에 다다르고 있다. (올해 예상보다 좋지 않은 해외 영업 상황에 따라 당분간은 계속 하락할 전망이다)




투자 포인트 1 - 하지만 생각만큼 나쁘지 않다?

비록 매출액이 2017년 일시적으로 감소했지만 계속해서 꾸준한 매출을 뽑아내고 있다. 이는 영업력의 문제라기보다, 원가율의 변수가 많은 해외 수주상황에 의해 불가피하게 발생한 결과다. 최근 3분기 잠정 실적에 발표에 따르면 해외 의존도가 낮고 국내 주택사업의 영향을 받는 타 대형 건설사의 실적은 양호했다. (http://biz.newdaily.co.kr/news/article.html?no=10145403). 따라서 상대적으로 좋지 않은 실적을 낸 현대건설이 과도하게 저평가 되고 있을 가능성이 있다. 양호한 매출액을 유지했던 과거 실적을 참고한다면 현대건설의 일시적인 매출액 감소는 충분히 개선 가능하다. 또한 자본금은 꾸준히 늘고 있으며 부채총액과 부채비율은 감소하면서 안정적인 추세를 보인다.

영업활동 현금흐름 또한 지속적으로 양의 수치를 보인다. 

투자 포인트 2 - 유가 동향
현대건설의 주식 가격은 국제 유가와 동행한다. 우리나라 건설사는 중동 산유국들의 신뢰를 얻고 있으며 중동 지역에서 상대적으로 많은 수주를 받는다. 국제 유가 하락은 산유국의 재정 상황에 악영향을 주고 이에 따라 산유국들의 신규 건설 발주를 어렵게 한다. 따라서 반대로 유가가 상승한다면 중동 산유국으로부터의 플랜트 수주는 늘어나며 이는 국내 건설사의 이익률을 증가시킨다. 최근 늘어나는 CIS 및 신흥국 플랜트 투자가 낮아지고 있는 현대건설의 주가를 그나마 지탱하는 요인이라면, 유가 상승을 통한 중동 수주 증가는 현대건설의 주가를 반등시키는 요인이 될 수 있다. 지난해부터 OPEC의 연이은 감산 합의와 이에 대한 산유국의 높은 준수율은 유가를 지속적으로 상승시켰다. 따라서 해외 수주 개선이 기대되는 상황이다.

(최근 두바이유 가격 상승 추이) 

중동의 지정학적 리스크에 따른 투자 심리
최근 사우디 아라비아에서 모하마드 빈살만 알사우드 왕세자의 왕위 계승을 위한 권력다툼으로 인해 대규모숙청이 일어난 상태다. 빈살만 왕세자는 OPEC의 감산을 지지하는 입장이며 OPEC의 감산은 곧 유가 상승을 의미한다 (원유는 비탄력적 공급). 또한 사우디는 최근 이란의 예맨 반군 지원 의혹과 관련하여 이란과 갈등을 맺는 모습을 보였는데, 이러한 중동 지역의 지정학적 리스크는 안정적인 원유 생산에 대한 기대감을 낮추어 유가를 상승시키는 요인이 된다. 이에 전문가들은 4분기 유가가 최대 70달러까지 증가할 것이라 전망했고 평균 60달러에서 움직일 것이라 예상했다. 중동 산유국의 재정 균형 유가가 60달러대임을 고려할 때, 유가가 60달러를 넘어서면 이는 재정 개선으로 이어져 중동 수주 비중이 높은 국내 건설사의 호재로 이어질 가능성이 높다.

http://biz.chosun.com/site/data/html_dir/2017/11/14/2017111401696.html

리스크 포인트 1 - 셰일 오일 공급 및 감산 합의 연장 가능성
최근 유가상승이 감산합의의 사각지대에 있는 러시아와 브라질, 미국의 셰일오일 기업들의 공급량 확대를 야기하여 유가가 소폭 하락한 상태다. 또한 11월 30일에 열리는 OPEC 총회에서 원유 감산 연장안이 통과될지의 여부 역시 불분명하다. 셰일오일 기업의 생산이 계속 증가하거나 감산 합의에 실패한다면 유가의 성장은 다시 정체되며 이에 따라 건설사의 해외 수주도 부정적 영향을 받을 것으로 예상된다.

http://www.newsis.com/view/?id=NISX20171116_0000149548&cID=10101&pID=10100

http://www.asiae.co.kr/news/view.htm?idxno=2017111506530712499

리스크 포인트 2 – 건설 규제
2017년 새 정부 출범 이후로 강력해진 부동산 규제에 의해 주택시장이 침체될 것이라는 우려가 있다. 부동산 규제 강화는 건설주에 단기적으로 부정적인 영향을 미친다. 하지만 2008년과 달리 수급 면에서 초과 공급에 따른 미분양 사태가 심각하지 않고, 분양가나 금리 역시 안정적이라는 점에서 과거처럼 급격한 주택 가격의 하락은 없을 것이다.


하지만 우리나라의 경우 주택 수급에 대한 정부 부동산 정책의 영향력이 상당히 크다. 그래프에서 2008년 규제 이후 수년간 건설업 침체가 지속되었다는 것을 참고한다면, 장기적으로 건설주는 주택 가격 안정을 위한 부동산 규제의 방향성대로 움직일 가능성이 높다. 따라서 주가를 반등시킬 모멘텀의 부재가 가장 우려되는 상황이다.

정리하면, 
1. 거대한 시가총액 규모와 
2. 건설업 불황이라는 시장심리와 낮은 PER, PBR수치, 
3. 그럼에도 안정적인 과거 매출과 부채, 자본, 현금 흐름, 
4. 유가 변동에 따른 주가 반등 가능성을 고려했을 때 현대건설은 투자 고려 대상으로서 적합하다. 하지만 유가 하락 가능성이나 부동산 규제 리크스도 존재하는 상황이므로 조금 더 상황을 지켜볼 필요가 있다. 역사적 PBR을 참고한다면, 양호한 매출 실적을 보였던 2014년 기준으로 PBR은 상방 0.89까지 잡을 수 있다. 이때 자본 변동이 없다고 가정하면 수익률은 27.14%이며, 건설업이 경기 의존도가 높다는 점을 고려했을 때 해외 플랜트 투자 상황에 따라 수익률은 상향 조정 가능하다. (현재 신흥국 플랜트 투자 늘리는 추세, 지정학적 리스크로 유가 상승 조짐). 2017년 실적에 따라 추가적인 주가 하락이 예상되므로 당장 구입하기는 힘들지만, 앞으로의 현대건설의 해외 영업 성과와 유가 동향에 주목하여 저점에서 적정 진입 타이밍 찾을 수 있다.