안녕하세요!!
Bright_Ocean 입니다.
지난번 포스팅에서는 investing.com에서 제공하는
stock screener를 통해서
자신이 원하는 전략에 맞는
주식을 스크리닝 하는 방법을 알아 보았습니다.
그러나 그 스크리너 안에는 제가 원하는 지표들도 많이 없었고,
다양한 년도를 백테스트하기는 불가능 하여
모든 주식 재무정보를 자동으로 가져오는 프로그램을 만들기로 하였습니다.
호주 주식에서도 저 PBR 저 PER 전략을 한번 시도해 보고 싶었거든요..
물론 파이썬을 이용하여 만들었습니다. 지난번 한국주식데이터를 끌어올때는
BeautifulSoup과 Request만으로도 쉽게 크롤링을 할 수 있었는데,
invesing.com은 동적 웹페이지라 URL이 변하지 않는게 많아서
셀레니움을 이용하여 자동으로 클릭하면서 스크래핑을 하면서 설계 되도록 하였습니다.
코드는 아래와 같습니다.
import pandas as pd
import numpy as np
import requests
import re
from bs4 import BeautifulSoup
import time
from selenium import webdriver as wd
from selenium.webdriver.common.keys import Keys
driver = wd.Chrome(executable_path = 'chromedriver.exe')
url = 'https://au.investing.com/equities/australia'
driver.get(url)
driver.implicitly_wait(5)
#select all australia ordinaries
select_box = driver.find_element_by_xpath('//*[@id="stocksFilter"]').click()
time.sleep(2)
select_all_stock = driver.find_element_by_xpath('//*[@id="all"]').click()
time.sleep(10)
#click all companies to get data
companies_table = driver.find_element_by_xpath('//*[@id="cross_rate_markets_stocks_1"]/tbody')
time.sleep(2)
tr_list = companies_table.find_elements_by_tag_name('tr')
time.sleep(2)
result_df = pd.DataFrame()
for tr in tr_list:
try:
link = tr.find_element_by_css_selector('td.bold.left.noWrap.elp.plusIconTd')
link = link.find_element_by_tag_name('a')
#open the company info page on new browser
link.send_keys(Keys.CONTROL + "\n")
driver.switch_to.window(driver.window_handles[1])
#goes to fianace section
fianace_section = driver.find_element_by_xpath('//*[@id="pairSublinksLevel1"]/li[4]/a').click()
time.sleep(2)
#income data
income = driver.find_element_by_xpath('//*[@id="pairSublinksLevel2"]/li[2]/a').click()
time.sleep(2)
annual_income = driver.find_element_by_xpath('//*[@id="leftColumn"]/div[8]/div[1]/a[1]').click()
time.sleep(2)
income_table = driver.find_element_by_xpath('//*[@id="excol"]').click()
time.sleep(2)
df_income = pd.read_html(driver.page_source)[0].dropna()
time.sleep(2)
#balance data
balance = driver.find_element_by_xpath('//*[@id="pairSublinksLevel2"]/li[3]/a').click()
time.sleep(2)
annual_balance = driver.find_element_by_xpath('//*[@id="leftColumn"]/div[8]/div[1]/a[1]').click()
time.sleep(2)
balance_table = driver.find_element_by_xpath('//*[@id="excol"]').click()
time.sleep(2)
df_balance = pd.read_html(driver.page_source)[0].dropna()
time.sleep(2)
#cash flow
cash_flow = driver.find_element_by_xpath('//*[@id="pairSublinksLevel2"]/li[4]/a').click()
time.sleep(2)
annual_cash_flow = driver.find_element_by_xpath('//*[@id="leftColumn"]/div[8]/div[1]/a[1]').click()
time.sleep(2)
cash_flow_table = driver.find_element_by_xpath('//*[@id="excol"]').click()
time.sleep(2)
df_cash_flow = pd.read_html(driver.page_source)[0].dropna()
df_cash_flow.columns = df_cash_flow.columns.droplevel(level = 1)
time.sleep(2)
#dataframe
df = df_income.append(df_balance, ignore_index= True)
df = df.append(df_cash_flow, ignore_index = True)
df = df.set_index('Period Ending:')
df.index.name = None
df.columns = ['2019', '2018', '2017', '2016']
stacked_df = pd.DataFrame(df.stack())
index = stacked_df.index.to_flat_index()
stacked_df.index = index
stacked_df = stacked_df.T
company_name = driver.find_element_by_xpath('//*[@id="leftColumn"]/div[1]/h1').text
name_df = pd.DataFrame([{'Company': company_name}])
company_df = pd.concat([name_df,stacked_df], axis = 1)
result_df = result_df.append(company_df, ignore_index = True)
#close company info page
driver.close()
#go back to company list page
driver.switch_to.window(driver.window_handles[0])
time.sleep(2)
except:
#close company info page
driver.close()
#go back to company list page
driver.switch_to.window(driver.window_handles[0])
time.sleep(2)
이 크롤러는 자동으로 invesing.com 에 접속한뒤 australia stock 의 section을 Australia all stock으로 바꾸어준 뒤
아래 테이블에 보이는 모든 호주 주식들을 하나하나 클릭하여 안에 있는
재무 데이터를 모아 하나의 파일로 만들어 줍니다.
이렇게 접속을 한 뒤
맨 첫 번째인 Ardiden 이란 회사를 자동으로 클릭하여
새창으로 연 뒤에 financials 섹션으로 이동합니다.
이동이 되었다면
Income statement 와 Balance Sheet, Cash Flow들을 차래로 이동하면서 테이블들을
모아 하나의 데이터로 만들어줍니다.
모든 데이터가 모아졌다면 다음 회사로 넘어가서 같은 일을 반복 수행하게 됩니다.
저는 현재 호주에 거주 하고 있고 아무래도 호주 인터넷이 한국보다는
느리기 때문에 (가장 빠른 속도를 쓰지만...ㅜㅜ 그래도 느려요)
time.sleep()을 2초나 걸었지만 한국이였다면 1초정도만 걸어도 충분해 보입니다.
모든 코드가 돌아가게되면 아래와 같은 테이블을 얻게 됩니다.
아무래도 재무 데이터를 그대로 끌어와서
PER 이나 PBR지표들을 따로 계산을 해줘야 할 것 같습니다...
오늘 저녁에 조금 데이터를 둘러보니 저 PER 저 PBR 전략을 호주에 적용하는것은
조금 고민을 해봐야할 것 같습니다.
너무 페니스탁들도 많은 것 같고.. 한국시장과 다르게 제조업회사들보다는
캐피탈이나... 다양한 펀드관련 회사들이 엄청 잡히네요.
중대형주들을 효율적으로 투자할 수 있는 전략들을 고민해 봐야겠습니다.
그럼 모두모두 성투하세요 !
'경제적 독립하기 > [투자] Project tatabox' 카테고리의 다른 글
호주 ETF 들의 가격 연관성은 어떻게 될까? 상관계수를 통해 분석해보자 (0) | 2020.07.12 |
---|---|
듀얼 모멘텀(VAA)전략을 이용한 호주 ETF 매수매도 백테스팅 해보기 (0) | 2020.07.10 |
계량투자를 위한 호주 주식 스크리닝 하기 (0) | 2020.07.01 |
네이버 금융 사이트에서 코스피 코스닥 전 종목 재무제표를 가져오자 (계량투자의 시작) (2) | 2020.06.29 |
나쁜 바이러스 시즌 마무리 투자정리 2월 부터 6월 (0) | 2020.06.29 |