Alpha를 찾아서 > 금융 데이터 불러오기

2023. 6. 27. 00:03금융 데이터 분석

반응형

취미로, 재미로  금융 데이터를 분석한다고 해도 금융 데이터를 기반으로 무언가를 예측하고 분석한다는 것은 결국 시장의 움직임을 이겨내 수익을 창출할 수 있는 그 무언가를 찾아 내고자 하는 것이라고 생각합니다.

그 중에서 어떻게 보면 기술적으로는 누구나 할 수 있는 것이 Alpha Factor를 찾아내는 과정일 것입니다. 기업가치를 측정할 때 PER, PBR, EV/EBITDA와 같은 재무지표를 활용하는 것도 어떻게 보면 Alpha Factor을 찾아서 활용하는 것으로 볼 수 있을 것 같습니다. 이런관점에서 보면 결국 Alpha Factor를 찾아내는 과정은 Feature Engineering과 흡사할 것이고 가설과 검증을 통해서 어떤 요소가 Alpha Factor인지 판단해 볼 수 있을 것입니다. 물론 제가 현재 작성하고 있는 글에서는 어떻게 Alpha를 찾을지 방법론은 고민해보겠지만 Alpha Factor를 찾을 수 있을 지는 잘 모르겠습니다.

먼저 주가와 재무 데이터를 가지고 오는 방법에 대해서 정리해보도록 하겠습니다. 주가정보와 같은 경우는 정말 많은 Source와 API들이 제공되고 있어, 아무거나 골라서 활용하면 될 것 같습니다.

 

1. 주가데이터

저는 개인적으로 주가데이터를 불러오기 위해서 FinanceDataReader 패키지를 주로 활용하고 있습니다. 사용하기가 상당히 직관적인 것 같습니다. 해당 패키지 Github에서 User guide를 확인 하실 수 있습니다.

https://github.com/financedata-org/FinanceDataReader

해당 패키지를 설치한 이후, 주가 정보를 가지고 오면 됩니다. 저 같은 경우 카카오 주가를 가지고 와보겠습니다. kospi list에서 카카오의 종목코드를 찾은 후 해당 종목코드를 활용하여 주가를 불러오면 됩니다.

import FinanceDataReader as fdr
import pandas as pd

kospi_list = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&marketType=stockMkt', header=0)[0]
ss = kospi_list.loc[kospi_list["회사명"].str.contains('카카오')][["회사명","종목코드"]]
df = fdr.DataReader('035720','2021-01-01', '2023-06-29')
df["Close"].head(10)

 

2. 재무데이터

재무 데이터의 경우 Dart API를 활용하고 있습니다. 기업들마다 공시하는 재무항목이 상이하기 때문에 기업을 분석할 때마다 직접 눈으로 항목들을 확인하는 과정이 필요할 것 같습니다.

Dart API를 활용함에 있어서 이 API를 좀더 편리하게 이용할 수 있는 라이브러리가 있습니다. 저는 OpenDartReader라는 라이브러리를 활용하고 있습니다. 이에 대한 활용법도 해당 라이브러리 Github에서 확인하실 수 있습니다.

https://github.com/FinanceData/OpenDartReader

import OpenDartReader
import requests
from bs4 import BeautifulSoup
import os



api_key='Your API key'
dart = OpenDartReader(api_key)
df_fs = dart.finstate_all('035720', 2022, reprt_code='11011') ## '11013':'1Q', '11012':'Half-year', '11014':'3Q', '11011':'Annual'
df_fs

해당 라이브러리를 활용하여 위와 같이 22년 카카오 Annual Report를 가지고 오게 되면 df_fs에  현금흐름표, 손익계산서, 재무상태표 등이 저장되게 됩니다. 아래 이미지와 같이 같은 값을 가지고 오는 것을 확인 할 수 있습니다.

Dart에서 확인한 카카오 유동자산
API로 가지고오는 카카오 유동자산

 

 

3. 외부 경제 변수

소비자 물가와 같은 외부 경제 변수는 한국은행경제통계시스템 ECOS API를 활용하여 가지고 오도록 하겠습니다. 저는 한국은행 OPEN API 서비스 홈페이지와 아래 두 개의 블로그를 활용하여, ECOS API 활용법을 익혔습니다.

https://bohemihan.tistory.com/entry/%ED%95%9C%EA%B5%AD%EC%9D%80%ED%96%89-%EA%B2%BD%EC%A0%9C%ED%86%B5%EA%B3%84%EC%8B%9C%EC%8A%A4%ED%85%9C-OpenAPI-%EC%9D%B4%EC%9A%A9%EB%B0%A9%EB%B2%95

https://mokeya.tistory.com/161

ECOS API 사용 예시 코드는 다음과 같습니다.

ecos_api_key = 'your API Key'
url = "http://ecos.bok.or.kr/api/KeyStatisticList/{}/json/kr/1/100".format(ecos_api_key)
resp = requests.get(url)
data = resp.json()
rdata = data['KeyStatisticList']['row']
df_ecos = pd.DataFrame(rdata)
print(df_ecos)

stat_cd = '521Y001'
period = 'D'
start_date ='20220101'
end_date ='20221231'
url2 = "http://ecos.bok.or.kr/api/StatisticSearch/{}/xml/kr/1/30000/{}/{}/{}/{}"\
                        .format(ecos_api_key ## 인증키
                                ,stat_cd ## 통계지표코드
                                ,period ## 기간
                                ,start_date ## 데이터 시작일
                                ,end_date) ## 데이터 종료일                      

resp2 = requests.get(url2).content.decode('utf-8')
xml_obj = BeautifulSoup(resp2, 'lxml-xml')
rows = xml_obj.findAll("row")

rows에 xml 형식으로 데이터가 저장되게 되고 find 기능을 이용해서 value를 가지고 올 수 있습니다.

## value 추출 예시

stat_code_list = []
stat_list = []
item_code_list = []
name_list = []
unit_list = []
time_list = []
value_list = []
for i in range(len(rows)):
    stat_code_list.append(rows[i].find("STAT_CODE").text)
    stat_list.append(rows[i].find("STAT_NAME").text)
    item_code_list.append(rows[i].find("ITEM_CODE1").text)
    name_list.append(rows[i].find("ITEM_NAME1").text)
    unit_list.append(rows[i].find("UNIT_NAME").text)
    time_list.append(rows[i].find("TIME").text)
    value_list.append(rows[i].find("DATA_VALUE").text)

 

이제 기본적으로 주가,재무정보 및 외부환경 정보를 가지고 올 수 있게 되었습니다. 뉴스나 SNS 데이터를 활용하는 방법도 있겠지만, 주가와 재무정보 및 외부 경제변수만을 가지고도 엄청나게 많은 변수를 만들어내고 활용하고 검증을 해볼 수 있기 때문에 이를 이용해서 추가적인 분석을 해보도록 하겠습니다.

반응형