본문 바로가기

프로젝트/캡스톤

[캡스톤] 재무 데이터 분석을 위한 전처리 - Fnguide 활용

지금까지는 수익률 데이터를 바탕으로만 주가 수익률 변동 가중치를 예측(?) 아니 평가를 하였다.

하지만 과거 수익률 데이터만 가지고 주가를 평가하는것은 상당히 논란의 여지가 있는 부분이다 - 약형 EMH

https://muyahoyamuyaho.tistory.com/26 -> 포스팅 참조

 

(트레이딩머신) 방향과 배경, 이론 - 효율적 시장가설, CAPM, 회귀분석

아마 방학동안 본격적으로 프론트든 서버사이드든 데이터 처리부분이든 개발에 들어갈 것 같은데, 학기중에 해야하는 일은 아무래도 기본적인 방향을 잡아놓고 관련된 논의나 공부를 조금씩

muyahoyamuyaho.tistory.com

아무튼 그렇기 때문에 블랙 리터만에 포함될 선행 지표 및 가중치를 계산할 때 과거의 주가 흐름만으로는 데이터를 예측하는것은 상당히 설득력이 떨어질 수 있다고 생각했다.

그렇다면 다음과 같은 선택지가 있다

1. 중강형 - > 재무데이터 및 기업 가치를 데이터화 시켜(기본적 분석)

2. 강형 -> 기업 내부정보 및 미공개 정보를 활용해보자

 

당연하겠지만 2번 같은 경우는 일반인은 알 수 없다. 기업 내부자가 아닌 이상 대외비를 알 수 없고 대외비라고 하더라도 일반인인 나의 귀까지 들린 소식이면 이미 시장에 다 반영되고 난 후일 것이다.

 

그러므로 현재 내가 할 수 있는 최선의 선택은 재무 데이터를 활용하여 주가의 가중치 평가에 반영시키는 것이다.

 

+ 물론 재무 데이터를 모델에 반영한다고 해서 주가를 정확하게 예측할 수 있는 것은 아니다(이게 가능하면 누구나 돈벌었지). 하지만 수익률에 대해 우량성을 평가하는 것으로 충분하다고 생각하고 모델 설계를 진행하였다.

 

재무데이터는 상당히 방대하다. 

https://www.fnspace.com/

 

FnSpace - Intro

Who is the API for? 대학, 투자자 및 스타트업이 국내외 금융데이터를 API를 통해 쉽고 편리하게 활용하여 심도있는 연구를 진행하고, 금융전략을 수립할 수 있도록 돕습니다. Academy 금융 및 데이터

www.fnspace.com

 

여기 API를 활용하였다. 재무데이터는 10년치를 보려면 한달에 10만원 내야한다.

학생에게는 큰 돈이기 때문에 우리 학교 LINC 사업단에서 지원하는 돈을 활용하였다.

내 돈 아니라서 좋다~!!

headers = {
    "key": "ㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌ",
    "format": "json",
    "success": "true",
    "errcd": "",
    "errmsg": "",
    "code": "A005930,A055550,A009200,A024110,A253590",
    "item": "M111000,M113000,M122700,M221100,M312000,M314000,M382100",
    "consolgb": "M",
    "annualgb": "QQ",
    "accdategb": "C",
    "fraccyear": "201203",
    "toaccyear": "202209"
}

이런식으로 헤더를 만들고 get Request를 날리면

{'CODE': 'A005930',
 'NAME': '삼성전자',
 'DATA': [{'DATE': '201203',
   'YYMM': '201203',
   'FS_YEAR': 2012,
   'FS_MONTH': 3,
   'FS_QTR': '1Q',
   'MAIN_TERM': '연결',
   'M111000': 160156621000,
   'M113000': 54649928000,
   'M122700': 5048461000,
   'M221100': 51.798,
   'M312000': 571.423621,
   'M314000': 13715.76499,
   'M382100': 44.6254},
  {'DATE': '201206',
   'YYMM': '201206',
   'FS_YEAR': 2012,
   'FS_MONTH': 6,
   'FS_QTR': '2Q',
   'MAIN_TERM': '연결',
   'M111000': 166300009000,
   'M113000': 56035900000,
   'M122700': 5193420000,
   'M221100': 50.82,
   'M312000': 593.541406,
   'M314000': 14313.38929,
   'M382100': 40.46895},
  {'DATE': '201209',
   'YYMM': '201209',
   'FS_YEAR': 2012,
   'FS_MONTH': 9,
   'FS_QTR': '3Q',
   'MAIN_TERM': '연결',
   'M111000': 176727146000,
   'M113000': 60188312000,
   'M122700': 6564927000,
   'M221100': 51.647,
   'M312000': 755.277449,
   'M314000': 14910.28826,
   'M382100': 35.64255},
  {'DATE': '201212',
   'YYMM': '201212',
   'FS_YEAR': 2012,
   'FS_MONTH': 12,
   'FS_QTR': '4Q',
   'MAIN_TERM': '연결',
   'M111000': 181071570000,
   'M113000': 59591364000,
   'M122700': 7038477000,
   'M221100': 49.054,
   'M312000': 805.320132,
   'M314000': 15539.85178,
   'M382100': 37.79865},

이런식으로 데이터가 날아온다.

재무 데이터를 시계열로 뽑아왔으니 이제 주가 데이터와 재무 데이터를 합쳐야 한다.

다만 다음과 같은 제약이 있다

1. 주가 시계열 데이터는 매일 발생한다

2. 재무 데이터는 길어야 3개월에 한번 갱신된다.

3. 현재 시점에서 재무 데이터는 아직 결산되지 않았다(3개월 말 마다 공시)

 

따라서 이 시간 텀을 어떻게 잘 메꿀지 생각해볼 필요가 있다.

일단은 주가별 시계열 데이터를 3개월마다 바뀌는걸로 생각해놨다.

for j in tmp.index:
        if j.month >= 1 and j.month <= 3 : tmpj = pd.Timestamp(year=j.year,month=3,day=1)
        if j.month >= 4 and j.month <= 6 : tmpj = pd.Timestamp(year=j.year,month=6,day=1)
        if j.month >= 7 and j.month <= 9 : tmpj = pd.Timestamp(year=j.year,month=9,day=1)
        if j.month >= 10 and j.month <= 12 : tmpj = pd.Timestamp(year=j.year,month=12,day=1)
        try:
            restmp.loc[j,fc.columns] = tmpfinanceinfo.loc[tmpj]
        except:
            pass

예를들어 2012-12-03 자료에 대응하는 재무 자료는 2012-12-01, 즉 2012년 12월에 결산된 재무제표 데이터를 매칭시켜 준다. 그렇게 원하는 데이터 몇개를 모아서

다음과 같은 정형 테이블을 만들어 준다.

이 기법을 이제 모듈화 시켜서 모델에 활용하면 된다.

 

BlackLittermanWithFinance 모듈을 추가하고 BoostingRegressor를 상속한 FinanceBoosting 모듈을 사용한다

BoostingRegressor에서 사용하는 데이터 + Fnguide 재무 데이터 이기 때문에 BoostingRegressor에 있는 코드의 많은 부분이 겹친다. 그래서 상속관계를 만들어줬다.

그리고 Fnguide Api를 사용하는 모듈과 다음과 같은 Dependency를 가진다. has a 관계? 까지는 아닌데 아무튼 기능적으로 dependent 하다.

 

FinanceBoosting 클래스 구현은 현재 완료하였고

이제 BlackLittermanWithFinance 모듈을 만들면 된다. 기능적으로 다 분류해놨으니 그냥 틀만 짜면 될것 같다.