Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
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
Archives
Today
Total
관리 메뉴

열정, 근면, 성장

[클론 코딩] KOSPI 지수 데이터를 사용하여 분석하기 2 본문

코딩/데이터분석

[클론 코딩] KOSPI 지수 데이터를 사용하여 분석하기 2

수빈박 2023. 3. 25. 02:32

 

[클론 코딩] KOSPI 지수 데이터를 사용하여 분석하기 1

https://dacon.io/competitions/official/235980/codeshare/6634 KOSPI 와 외국지수 상관관계 분석 및 CAPM 기반 포트폴리오 작성 월간 데이콘 KOSPI 기반 분석 시각화 경진대회 dacon.io 위 게시글의 코드를 따라 치면서

growing-sub.tistory.com

이전 게시물


클러스터링 결과 해석까지 했다.

 

 

 

 

 

 

 

 

1. matplotlib.pyplot 활용(산점도)

 

01. Matplotlib 기본 사용

![](https://wikidocs.net/images/page/92071/basics_00.png) Matplotlib 라이브러리를 이용해서 그래프를 그리는 일반적인 방…

wikidocs.net

(출처: https://wikidocs.net/92071)

 

 

 

 

 

matplotlib는 그래프를 그릴 때 사용한다.

  • plt.xlabel: 그래프의 x축 레이블
  • plt.ylabel: 그래프의 y축 레이블
  • plt.title: 그래프의 타이틀
  • plt.scatter: 산점도 그리기

 

 

 

산점도는 두 변수의 상관 관계를 직교 좌표계의 평면에 점으로 표현하는 그래프다.

따라서 plt.scatter(cluster_total.std(), cluster_total.mean())은 x축은 군집의 표준편차, y축은 군집별의평균수익률을 나타내는 산점도를 만드는 코드다.

 

 

 

  • plt.figure: 그래프 이미지에 관한 파라미터

figsize 인자로 이미지의 크기를 설정한다 figsize(8인치, 6인치)

 

 

  • plt.rcParams: 그래프의 스타일 관련

여러 개의 그래프를 한 이미지에 넣고 각 그래프마다 스타일을 다르게 하고 싶을 때 사용한다.

['axes.unicode_minus'] = False는 마이너스(-) 기호 깨짐을 방지하기 위한 코드다.

# 군집별 수익률 대비 risk를 시각화
plt.figure(figsize=(8,6))
plt.scatter(cluster_total.std(), cluster_total.mean())
plt.xlabel('risk')
plt.ylabel('return')
rc('font', family= 'Batang')
plt.rcParams['axes.unicode_minus']=False
plt.title('평균수익률 및 표준편차')

 

 

  • plt.annotate: 주석 달기

plt.annotate(

label 주석 내용
xy=(x, y) 주석 x좌표, y좌표
xytext=(30, -30) xy에서 x축으로 30 더 가고 y축으로 30 내려가라
textcoords = 'offset points' offset points 는 xy에서부터 xytext offset 위치(단위 point)에 출력
ha = 'right' horizontal alignment 우
va = 'bottom' vertical alignment 하단에
bbox 텍스트 박스
arrowprops 화살표 특성

)

for label, x, y in zip(cluster_total.columns, cluster_total.std(), cluster_total.mean()):
    plt.annotate(label, xy=(x,y), xytext=(30, -30),
                textcoords = 'offset points',
                ha = 'right', va = 'bottom',
                bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
                arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

 

 

 

 

 

실행결과

 

 

 

 

2. 상관관계 분석

히트맵&상관관계 산점도 그래프를 통해 KOSPI와 나머지 변수들의 상관관계를 확인한다.

 

 

 

2.1 히트맵

dataframe_name.corr()을 통해 변수별 상관계수를 쉽게 확인할 수 있다.

df2 = df1.corr()  # df1은 result_data, 각 지수 데이터를 합친 데이터프레임이다.
df2

 

 

 

 

 

seaborn을 이용한 heatmap 그리기

 

  • sns.heatmap 인자
result_data.corr() 히트맵 만들고자 하는 데이터
annot = True 각 셀에 숫자 표기 = True
fmt = '.2f' 해당 셀에 표기할 데이터 형식 = 소숫점 둘째 자리까지
linewidths = 5 셀 사이의 선 width
cmap = 'Blues' 히트맵 표현할 색깔 = 파란색

 

plt.figure(figsize=(10,10))
sns.heatmap(result_data.corr(), annot=True, fmt='.2f', linewidths=5, cmap='Blues')

 

 

 

히트맵

 

 

 

 

 

2.2 상관관계 계수 확인하기

idx, vals = [], []

for ix, i in enumerate(result_data.columns.values):
    for j in result_data.columns.values[ix + 1:]:  # 중복 방지
        idx.append((i,j))
        vals.append(result_data.corr()[i][j])

*enumerate는 인덱스와 인수를 동시에 루프 돌리는 python 내장함수이다.

idx에 (i,j) 튜플 형식으로 append 했다.

 

 

 

pandas의 Series 자료구조를 사용하여 지수(혹은 자산)별 상관관계 출력

ser = pd.Series(data=vals, index=idx)
ser_ord = ser.sort_values(ascending=False)
ser_ord

*pandas Series 자료구조와 list의 차이

: list는 인덱싱을 숫자로 해야 하지만 [0], [3]... Series는 인덱스를 정의할 수 있다. ['2021-02-05']...

 

 

 

 

 

 

 

2.3 산점도 그래프

여러 개의 연속형의 변수들을 한눈에 확인하기 쉽게 산점도 그래프로 표시할 수 있다.

sns.set(font_scale=1.1)  # 폰트 사이즈
sns.set_style('ticks') # 축 눈금 표시
data = result_data[["KOSPI", "NASDAQ", "S&P", "Dollar", "USA_TREASURY", "Nikkei"]]
sns.pairplot(data, diag_kind=None)
plt.show()

diag_kind=None는 산점도 그래프의 대각선(변수 그 자체만을 표현하는 칸)에 어떤 그래프 형식을 표시할 지 할당하는 인자이다. diag_kind의 default는 히스토그램이다.

 

 

 

 

산점도 그래프

 

 

 

 


클론코딩은 여기까지 하려고 한다.

그 뒤의 최적화를 위한 cvoxpt library는 접하지 못한 개념이 너무 많아서, 시간이 꽤 걸릴 것 같다.

 

 

이후로는 이 코드를 기반으로 약간의 변주를 주어 다시 분석해보려고 한다.

Comments