경제적 독립하기/[투자] Project tatabox

호주 ASX 모든 주식 재무 데이터 자동으로 가져오기

Bright_Ocean 2020. 7. 5. 00:26
반응형

 

 

안녕하세요!!

 

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 전략을 호주에 적용하는것은

조금 고민을 해봐야할 것 같습니다.

 

 

 

 

너무 페니스탁들도 많은 것 같고.. 한국시장과 다르게 제조업회사들보다는 

캐피탈이나... 다양한 펀드관련 회사들이 엄청 잡히네요.

 

 

중대형주들을 효율적으로 투자할 수 있는 전략들을 고민해 봐야겠습니다.

 

그럼 모두모두 성투하세요 !

 

반응형