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 지수 데이터를 사용하여 분석하기 1 본문

코딩/데이터분석

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

수빈박 2023. 3. 16. 18:01

https://dacon.io/competitions/official/235980/codeshare/6634

 

KOSPI 와 외국지수 상관관계 분석 및 CAPM 기반 포트폴리오 작성

월간 데이콘 KOSPI 기반 분석 시각화 경진대회

dacon.io

 

위 게시글의 코드를 따라 치면서 헷갈렸거나 몰랐던 내용을 기록하려 한다.

추후 목표는 나만의 분석도 해서 의미있는 결론 도출하기

 

 

1.  야후파이낸스에서 원하는 종목의 데이터 가져오기

(pandas datareader를 사용하여 데이터 가져올 때, string indices must be integers 에러 발생한다면 첫번째 줄 시도)

# yf.pdr_override()

sap = pdr.get_data_yahoo('^GSPC', start = '1981-04-30', end = '2022-09-01')
sap

 

 

결과는 아래와 같이 나온다.

[*********************100%***********************]  1 of 1 completed
			Open	High	Low	Close	Adj Close	Volume
Date						
1981-04-30	0.000000	134.440002	131.850006	132.809998	132.809998	47970000
1981-05-01	0.000000	134.169998	131.429993	132.720001	132.720001	48360000
1981-05-04	0.000000	131.779999	129.610001	130.669998	130.669998	40430000
1981-05-05	0.000000	131.330002	128.929993	130.320007	130.320007	49000000
1981-05-06	0.000000	132.380005	130.089996	130.779999	130.779999	47100000
...	...	...	...	...	...	...
2022-08-25	4153.259766	4200.540039	4147.589844	4199.120117	4199.120117	3566870000
2022-08-26	4198.740234	4203.040039	4057.659912	4057.659912	4057.659912	3832750000
2022-08-29	4034.580078	4062.989990	4017.419922	4030.610107	4030.610107	3396510000
2022-08-30	4041.250000	4044.979980	3965.209961	3986.159912	3986.159912	3835860000
2022-08-31	4000.669922	4015.370117	3954.530029	3955.000000	3955.000000	4542490000
10424 rows × 6 columns

 

 

2. Pandas 데이터프레임 병합

pd.concat 를 사용하여 병합한다. (import pandas as pd)

axis=0 행 방향 병합(default)

axis=1 열 방향으로 병합

result_data = pd.concat([df, nasdaq, sap, df1, usa_treasury, japan], axis=1)
result_data.fillna(result_data.mean(), inplace=True)  # 결측치 대체
result_data = round(result_data, 2)
result_data
		KOSPI	NASDAQ	S&P	Dollar	USA_TREASURY	Nikkei
Date						
1981-05-01	0.98	-0.03	-0.07	0.10	-0.43	-1.28
1981-05-02	-0.08	0.05	0.04	0.01	0.00	0.02
1981-05-04	-2.35	-1.55	-1.54	0.00	2.99	0.02
1981-05-05	0.04	-0.83	-0.27	0.00	1.52	0.02
1981-05-06	0.08	0.20	0.35	0.07	-0.88	-1.46
...	...	...	...	...	...	...
2022-08-25	1.22	1.67	1.41	-0.47	-2.58	0.58
2022-08-26	0.15	-3.94	-3.37	0.56	0.30	0.57
2022-08-29	-2.18	-1.02	-0.67	0.28	2.47	-2.66
2022-08-30	0.99	-1.12	-1.10	0.31	0.00	1.14
2022-08-31	0.86	-0.56	-0.78	-0.64	0.74	-0.37
11628 rows × 6 columns

 

 

 

3. K-means 클러스터링(군집분석)

3-1. 최적의 군집 개수 찾기

inertia: 군집화가 된 후에, 각 중심점에서 군집의 데이터 간의 거리를 합산한 것(=군집의 응집도)

(출처: https://bcho.tistory.com/1203)

 

ks = range(1,10)

inertias = []

for k in ks:
    model = KMeans(n_clusters=k, random_state=42)  # 클러스터 개수 1에서 10까지 돌려봄
    model.fit(x)
    inertias.append(model.inertia_)

# Plot ks vs inertias
plt.plot(ks, inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.xticks(ks)
plt.show()

 

 

N=4로 군집분석 진행

 

 

 

4. t-SNE를 통한 차원축소 진행

- t-SNE(t-distributed stochastic neighbor embedding)란?

  • t 분포 따름(적은 표본으로 모집단의 평균을 추정하고, 모표준편차 모를 때 사용)
  • 차원축소로 유명한 PCA(주성분 분석)와 비슷하지만 데이터가 뭉개진다는 단점을 보완한 차원축소 방법
  • 시각화에는 좋지만 PCA와 달리 매번 값이 바뀌기 때문에 머신러닝에는 적용이 불편하다는 단점이 있음

출처: https://amazelimi.tistory.com/13

https://gaussian37.github.io/ml-concept-t_sne/

 

import time
from sklearn.manifold import TSNE

n_sne = x.shape[0]
n_sne  # 11628

 

 

군집 분류를 위한 학습

TSNE arguements

n_components=2  2차원으로 축소
verbose=1  학습 진행 상황 보여줌
n_iter 학습 1000번 마다 출력
perplexity, angle 알고 싶지 않음
time_start = time.time()

# 모델 생성
tsne = TSNE(n_components=2, verbose=1, perplexity=32, n_iter=1000, random_state=0, angle=0.5)

# 학습한 결과
tsne_results = tsne.fit_transform(x)

print('t-SNE done! Time elapsed: {} seconds'.format(time.time() - time_start))

 

군집 시각화(hue=y_kmeans)

 

5. 클러스터링 결과 해석

cluster_total

원글 작성자 분에 따르면

군집0을  Dollar, 미국 국채 10년이 메인으로 이루어진 군집

군집1을 위험자산(KOSPI, NASDAQ, S&P)으로 이루어진 군집

군집2를  Dollar로 이루어진 군집

군집3을 위험자산 + 미국 국채로 이루어진 군집

 

이라고 명명,

 

금융시장에서의 수익률(return)은 위험자산 > 국채 > 달러

금융시장에서의 표준편차(std, 위험)은 달러 > 국채 > 위험자산

 

값이 큰 것이  해당 군집의 특성이라고 볼 수 있겠다.

 

 

 

 

Comments