본문 바로가기

카테고리 없음

두 번째 미니 프로젝트 돌아보기 - (데이터 분석으로 본) 대통령과 주가

얻은 게 많은 프로젝트였다. 판다스 시리즈와 데이터프레임를 변형하며 마주친 오류를 해결하는 과정에서 인덱스를 이해할 수 있었다. 표에 자료를 입력하고 생성, 병합하는 것도 익숙해졌다. 데이터를 만지며 새로운 아이디어가 떠오르고 다시 데이터로 검증하는 과정이 꽤 흥미로웠다. 주식에 투자할 때마다 다른 사람들의 얘기를 반신반의하며 따라했었는데 처음으로 직접 투자 방법을 하나 만들어냈다. 대통령 임기에 맞춰 5년에 한 번 코스피 지수에 투자하고 수익률이 나면 분포 기간 비율만큼 매도한다. 논리가 매우 단순하고 명쾌하다. 따라하기도 간편하고 신경 쓸 것도 별로 없어 수시로 주가 그래프를 확인할 일도 없다. 그저 본업에 몰두하면 된다. 남은 문제는 데이터가 제시한 대로 따라할 수 있는 용기와 인내를 갖고 있는냐에 달려있다. 이 방법이 들어 맞을지 앞으로 5년이 기대된다.

 

1. 프로젝트 제목 : (데이터 분석으로 본) 대통령과 주가

2. 팀원 : 3명
3. 주제 선정 : 대통령 취임 후 1, 2년 혹은 임기말 주가를 비교하는 언론 기사와 대통령이 투자한 펀드 수익률 기사를 보고 이를 검증해보고자 제안했다. 혹시 쓸만한 투자 방법을 찾을 수 있지 않을까 하는 기대도 했다.
4. 기간 : 2022년 5월 25일 - 5월 27일
5. 진행 : 첫 번째 프로젝트보다 준비 기간을 많이 주었다. 월요일 수업 말미에 주제를 정하도록 한 시간을 주었다. 수요일에는 개별 상담이 진행되어 20분 정도의 상담 시간 외에는 자유롭게 프로젝트를 준비할 수 있었고, 목요일 하루와 금요일 오전까지 여유가 있어 지난 번보다 좋은 결과를 내고 싶었다. 한 시간 동안 얘기해도 매력적인 주제가 떠오르지 않아 각자 생각해 보고 다음 날 다시 얘기하기로 했다. 집에 돌아가는 전철에서 전에 대통령 재임기간 별로 주가 그래프를 그려봤던 기억이 나서 그것을 발전시켜보면 좋겠다고 생각해 카톡방에 올렸더니 모두 좋다고 했다. financeDataReader로 주가를 불러오는 소스를 팀원에게 전달하고 각자 전처리 하고 분석을 해보도록 했다. 분석 결과를 슬라이드로 만든 후 내가 발표했다. 발표 전 잘한 팀을 투표로 선정했는데 우리 팀이 1등을 했다. 투자하는 데 도움이 될 것 같다는 얘기도 들었다.
6. 데이터 선정

  1. 주가는 finaceDataReader 라이브러리를 사용해 가져왔다.
  2. 라이브러리 개발자가 제공한 Tutorial 소스 코드가 필요한 데이터를 가져오는 소스를 작성하는 데 큰 도움이 되었다.

7. 데이터 전처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
presidents = [['노태우','1988-02-25','1993-02-24'],
              ['김영삼','1993-02-25','1998-02-24'],
              ['김대중','1998-02-25','2003-02-24'],
              ['노무현','2003-02-25','2008-02-24'],
              ['이명박','2008-02-25','2013-02-24'],
              ['박근혜','2013-02-25','2017-03-10'],
              ['문재인','2017-05-10','2022-05-09'],
              ['윤석열','2022-05-10',date.today().isoformat()]]
 
# 주가 자료 가져오기 - 대통령 재임기간 별 종가
kospi = [ fdr.DataReader('ks11', start, end)['Close'for name, start, end in presidents ]
 
# 리스트 내의 시리즈를 데이터프레임으로 변환
# 1. 리스트 길이만큼 동적으로 변수 생성
# 2. 시리즈 => 데이터프레임 => 생성된 변수에 저장
for i in range(len(kospi)):
    globals()['p_'+str(i+1)]=pd.DataFrame(kospi[i])
 
# 동적으로 생성한 데이터프레임의 날짜 인덱스를 Date 컬럼으로 저장
for i in range(len(kospi)):
    temp_df = globals()['p_'+str(i+1)]
    temp_df['Date']=temp_df.index 
 
# 동적으로 생성한 데이터프레임의 인덱스를 순번으로 초기화
# 컬럼명 변경
for i in range(len(kospi)):
    temp_df = globals()['p_'+str(i+1)]
    temp_df.index = range(len(temp_df))
    temp_df.columns = [[presidents[i][0]+'date',presidents[i][0]]]
 
# 동적으로 생성한 데이터프레임 합치기
# 1. 각각의 데이터 프레임을 리스트로 합치기
# 2. pd.concat을 이용해 list => 데이터프레임
temp_list = []
for i in range(len(kospi)):
    temp_df = globals()['p_'+str(i+1)]
    temp_list.append(temp_df)
 
df_all = pd.concat(temp_list,axis=1)
cs
  1. 노태우 정부 이후 KOSPI 종가를 가져와 대통령 재임기간과 날짜별 종가를 컬럼으로 만들었다.
  2. 수익률 비교를 위해 취임 후 첫 날 주가를 0으로 설정했다. 수식: ( 종가 / 첫날 종가 ) - 1
  3. 부딪힌 문제와 대응
    1. 판다스는 인덱스를 기준으로 데이터를 입력하고 테이블을 병합한다는 것을 몰랐다. 원자료의 인덱스가 날짜로 되어 있고 대통령 임기마다 인덱스가 모두 다르기 때문에 컬럼으로 붙지 않았다.
    2. 처음에는 원자료에 컬럼을 하나 덧붙이고 대통령 임기에 해당하는 날짜에 해당 대통령 이름을 넣으려고 시도했다. 하지만 새로운 컬럼을 만들며 일부 행에만 자료를 넣는 것은 되지 않았다. 새로운 컬럼을 만들 때는 모두 비어 있던지, 모두 채워져 있어야 했다. 
    3. 먼저 새로운 컬럼을 결측치로 만들고 나서 재임기간 행에 해당 대통령 이름을 입력하면 쉽게 해결되는 데 당시에는 이걸 몰랐다.
    4. 튜토리얼에 나온 코드를 활용해 재임기간별 종가를 리스트로 받아오고 바로 데이터프레임으로 변환하려고 했으나 되지 않았다. 이유는 역시 인덱스가 다르기 때문이었다. 
    5. financdDataReader로 가져온 자료는 시리즈로 되어 있고, 인덱스가 모두 날짜로 되어있기 때문이었다. 해결책은 인덱스를 컬럼으로 바꾸고 단순 나열된 번호로 인덱스를 재설정하는 것이었다. 
    6. 하지만, 인덱스를 컬럼으로 바꾸려면 시리즈를 데이터프레임으로 바꾸어야 하고 그때마다 데이터프레임 변수를 생성해야 한다. 즉 동적으로 변수를 만드는 방법을 알아햐 했다. 선생님께 질문해 해결했다. globals()[]를 이용하면 된다.
    7. 동적으로 생성한 데이터프레임을 다시 리스트로 묶고 pd.concat()으로 병합해 위 표를 완성했다.
    8. 이후론 멀티 인덱스를 만날 때까지는 별다른 문제 없이 착착 진행되었다.

8. 분석 1 - 대통령 재임기간에서 공통된 패턴을 찾는 것은 실패했다. 하지만 취임 직후에 매수하면 수익 낼 기회는 많다는 것을 발견했다.

  1. 대통령 재임기간 별 패턴 분석: 아래 도표에 나타나듯이 일정한 패턴을 발견할 수 없다.(그림-1)
  2. 겹쳐 놓고 봐도 일년씩 나누어 봐도 일정한 패턴이 없어 보인다.(그림-2)
  3. 하지만, 취임 직후에 매수했다면 수익을 낼 수 있는 기회는 많았다.(그림-3)

그림-1
그림-2 대통령 임기 주가 수익률 그래프와 임기 1년차 그래프
그림-3

9. 분석 2 - 대통령이 펀드 투자한 시점에 KOSPI 지수를 매수하면 70% 이상의 수익을 낼 수 있다. 단, 매도 시점을 잘 찾아야 한다.

  1. 대통령 펀드 투자일 종가와 이후 최고점까지의 기간과 수익률을 구했다.
  2. 최고점 1년 후 종가와 수익률을 구해보니  매도 시점이 얼마나 중요한지를 볼 수 있었다.

10. 분석 3 - 재임기간 내 수익률별 기간 분포를 비율로 계산 하여 비율 별 분할 매도 방법 제안

  1. 수익률 별 영업일 수 분포를 표로 집계 후 백분률로 변환
  2. 대통령 별로 수익률 기간 분포를 파이 차트와 막대 그래프로 표시
  3. 전체적으로 보면 대통령 취임 직후에 주식을 매수하면
    • 10% 이상 수익을 낼 기회는 51.4%나 된다.
    • 20% 이상 수익을 낼 기회도 39.2%나 된다.
    • 반대로 손해를 볼 경우는 28.4%.
  4. 최종 결론은 이 글 맨 위에 있다.

11. 배운 점 및 차후 과제

  1. 판다스를 자유롭게 사용할 수 있어야 원하는 모양으로 표를 만들 수 있다. 판다스가 움직이는 원리를 알아야 예상치 못한 오류를 내뿜는 것을 막을 수 있다. 판다스만을 다룬 책을 찾아 공부해야겠다.
  2. 원리를 모르고 시각화 도구를 사용하니 원하는 모양으로 만들어지지 않았다. 구글링도 원리를 알아야 활용할 수 있다. 프로젝트 준비 시간을 주느라고 matplotlib 수업이 줄어든 게 무척 아쉽다. 주말을 이용해 유튜브 강의나 책으로 공부해야겠다.
  3. 모든 걸 파이썬으로 해결하려 하지 말자. 데이터를 엑셀로 보내 엑셀에서 그래프를 그리는 게 편리할 때도 있다. 파이 차트에서 숫자가 겹쳐 제대로 보이지 않는 것을 코드로 조정하는 게 무척 번거롭다. 엑셀에서 마우스로 움직이는 게 더 나았다. 필요에 따라 도구를 적절히 사용하자. 주객이 전도되면 안 된다.