열정, 근면, 성장
[클론 코딩] KOSPI 지수 데이터를 사용하여 분석하기 1 본문
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))
5. 클러스터링 결과 해석
원글 작성자 분에 따르면
군집0을 Dollar, 미국 국채 10년이 메인으로 이루어진 군집
군집1을 위험자산(KOSPI, NASDAQ, S&P)으로 이루어진 군집
군집2를 Dollar로 이루어진 군집
군집3을 위험자산 + 미국 국채로 이루어진 군집
이라고 명명,
금융시장에서의 수익률(return)은 위험자산 > 국채 > 달러
금융시장에서의 표준편차(std, 위험)은 달러 > 국채 > 위험자산
값이 큰 것이 해당 군집의 특성이라고 볼 수 있겠다.
'코딩 > 데이터분석' 카테고리의 다른 글
KOSPI를 포함한 지수 및 자산 군집 분석 (1) | 2023.05.19 |
---|---|
[클론 코딩] KOSPI 지수 데이터를 사용하여 분석하기 2 (0) | 2023.03.25 |
공부 계획2 (0) | 2023.03.04 |
공부 목표 (0) | 2023.02.03 |