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에 현금흐름표, 손익계산서, 재무상태표 등이 저장되게 됩니다. 아래 이미지와 같이 같은 값을 가지고 오는 것을 확인 할 수 있습니다.
3. 외부 경제 변수
소비자 물가와 같은 외부 경제 변수는 한국은행경제통계시스템 ECOS API를 활용하여 가지고 오도록 하겠습니다. 저는 한국은행 OPEN API 서비스 홈페이지와 아래 두 개의 블로그를 활용하여, ECOS API 활용법을 익혔습니다.
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 데이터를 활용하는 방법도 있겠지만, 주가와 재무정보 및 외부 경제변수만을 가지고도 엄청나게 많은 변수를 만들어내고 활용하고 검증을 해볼 수 있기 때문에 이를 이용해서 추가적인 분석을 해보도록 하겠습니다.
'금융 데이터 분석' 카테고리의 다른 글
Alpha Factor 탐색 > Value Factor (0) | 2023.07.20 |
---|---|
Alpha Factor 탐색 > Momentum (0) | 2023.07.03 |
LSTM을 활용한 주가 예측 (0) | 2020.08.02 |
CNN을 활용한 주가 방향 예측 (1) | 2020.07.30 |
SVM(서포트 벡터 머신)을 활용한 주가 방향 예측 (0) | 2020.07.28 |