0%

20200630

GDP 상위 10개국의 환율과 GDP 11위인 대한민국의 KOSPI/KOSDAQ 상관관계


데이터 수집

  • 네이버 증권 페이지에서 GDP 상위 10개국 환율과 대한민국 KOSPI/KOSDAQ 크롤링
  • 100일 분량

KOSPI

1
import requests
1
2
3
4
5
def get_stock_data(code, page_size=100, page=1):
url = "https://m.stock.naver.com/api/json/sise/dailySiseIndexListJson.nhn?code={}&pageSize={}&page={}".format(code, page_size, page)
response = requests.get(url)
datas = response.json()['result']['siseList']
return pd.DataFrame(datas)
1
2
kosdaq_df = get_stock_data("KOSDAQ")
kosdaq_df.tail(2)

cd dt ncv cv cr ov hv lv
98 KOSDAQ 20200207 672.63 -0.06 -0.01 673.11 674.03 667.93
99 KOSDAQ 20200206 672.69 11.37 1.72 665.94 672.69 665.88
1
2
kospi_df = get_stock_data("KOSPI")
kospi_df.tail(2)

cd dt ncv cv cr ov hv lv
98 KOSPI 20200207 2211.95 -15.99 -0.72 2221.49 2223.92 2198.14
99 KOSPI 20200206 2227.94 62.31 2.88 2184.77 2229.99 2182.25
1
2
3
4
5
df_kor = pd.merge(kospi_df, kosdaq_df, left_on="dt", right_on="dt")
df_kor = df_kor.rename(columns={"ncv_x": "kospi", "ncv_y": "kosdaq"})
df_kor = df_kor[["dt", "kospi", "kosdaq"]]
df_kor = df_kor.set_index('dt')
df_kor.tail(2)

kospi kosdaq
dt
20200207 2211.95 672.63
20200206 2227.94 672.69

환율

1
2
3
4
5
6
7
8
9
10
11
12
def get_currency_data(code, page_size=100, page=1):
url = "https://m.stock.naver.com/api/json/marketindex/marketIndexDay.nhn?marketIndexCd={}&pageSize={}&page={}".format(code, page_size, page)
params = {
"cookie": "NNB=ITGWQQXTH6IV4; NRTK=ag#all_gr#1_ma#-2_si#0_en#0_sp#0; ASID=d3db6cfa0000017292952d4c00006e70; nx_ssl=2; notice_new_account_171101=1; MM_NEW=1; NFS=2; MM_NOW_COACH=1; page_uid=UYoLesprvh8ssZHPceGssssssLl-298586; nid_inf=-1468512193; NID_AUT=RzrySnbsg4az0Z1kbSBCoLIC+oPS+1qfJCrnfq+S6eQVpRQOk2a/c8WWUJySQubY; NID_JKL=mueUVlznsILAKlGNEEOZL2gSa7GClv2m/wy+sWHeJP8=; NID_SES=AAABf7yRp/MIC8NRjyN8FNZm5ZIzE6EmXPjzoT8h5j5Tk6qVf38M4x3lGhbka33XB1/8dRoxW10UNBGHVSCOLiorv+O/Huw4fvZ6wkg8sXn6GD2QoxhPliJuh2e6WWXKTRRQq+pQRa/T1glGGsCR4PUMM7OlQ/p7ORm9ByQSdvLKvXbBBk0b6l/YSPZugdtVi44zKevugHN6UhOa/YfPNVa/ppkZ7MUh9Z2PK9F7SL1u7DmKpHAPREqDOgadvt7BPCWGhzmpZLycXPnMxsP4c3+Vf9u4Uw87TGtst/0xbetORWritqcMQV+9UW+zmb+pEnxBhLLQUEYp8jBtu8NRN/wCRj++ryNMaVdk5/uOdRcImcjbRlYuZ6xQsF+l2f6L470CNqlM9SJKFEZ9N/0X2yk+al75Jmqgpxw6WjmcX+G2lqoyobjBja0LzXW/Eks/EqatKybMe2DrqFjgpW1EKwjb180PaqehezYvyRRe2QSlMmzxe1FGhZNUfok90ZXGhp5yKQ==; XSRF-TOKEN=ca183283-9562-4e61-817f-db7653bb0636; JSESSIONID=767616970B529D565974D21FBE89A761; BMR="
}
response = requests.get(url, headers=params)
datas = response.json()['result']['marketIndexDay']
df = pd.DataFrame(datas)
df = df[["dt", "nv"]]
exec('df.columns = ["dt", "{}_nv"]'.format(code))
df = df.set_index('dt')
return df
1
2
3
# 미국
usd_df = get_currency_data("FX_USDKRW")
#usd_df.tail(2)
1
2
3
# 중국
cny_df = get_currency_data("FX_CNYKRW")
# cny_df.tail(2)
1
2
3
# 일본
jpy_df = get_currency_data("FX_JPYKRW")
# jpy_df.tail(2)
1
2
3
# 유로 (독일, 프랑스, 이탈리아)
eur_df = get_currency_data("FX_EURKRW")
# eur_df.tail(2)
1
2
3
# 인도
inr_df = get_currency_data("FX_INRKRW")
# inr_df.tail(2)
1
2
3
# 영국
gbp_df = get_currency_data("FX_GBPKRW")
# gbp_df.tail(2)
1
2
3
# 브라질
brl_df = get_currency_data("FX_BRLKRW")
# brl_df.tail(2)
1
2
3
# 캐나다
cad_df = get_currency_data("FX_CADKRW")
# cad_df.tail(2)

데이터 정리

1
2
3
cur = pd.concat([usd_df, cny_df, jpy_df, eur_df, inr_df, gbp_df, brl_df, cad_df], axis=1, ignore_index=True)
cur.columns = ['usd', 'cny', 'jpy', 'eur', 'inr', 'gbp', 'brl', 'cad']
cur

usd cny jpy eur inr gbp brl cad
dt
20200630 1202.3 170.01 1115.88 1348.56 15.92 1476.48 222.50 878.59
20200629 1200.5 169.78 1120.03 1354.34 15.90 1479.98 218.84 879.00
20200626 1200.0 169.41 1123.02 1347.48 15.87 1489.86 223.85 879.96
20200625 1203.5 169.94 1122.20 1349.42 15.92 1497.52 225.03 883.69
20200624 1202.5 170.27 1128.63 1359.55 15.90 1505.89 233.38 886.41
... ... ... ... ... ... ... ... ...
20200212 1180.0 169.27 1072.97 1288.21 16.53 1531.99 272.40 889.19
20200211 1184.5 169.82 1077.95 1293.30 16.62 1530.97 273.90 891.20
20200210 1187.0 170.04 1081.40 1299.88 16.64 1534.55 274.73 893.15
20200207 1193.5 170.50 1087.17 1307.06 16.71 1543.08 278.70 896.66
20200206 1184.0 169.85 1078.28 1302.87 16.63 1535.59 279.56 891.50

100 rows × 8 columns

1
2
3
kor_vs_cur = pd.concat([df_kor, cur], axis=1, ignore_index=True)
kor_vs_cur.columns = ['kospi', 'kosdaq', 'usd', 'cny', 'jpy', 'eur', 'inr', 'gbp', 'brl', 'cad']
kor_vs_cur.tail()

kospi kosdaq usd cny jpy eur inr gbp brl cad
dt
20200212 2238.38 686.59 1180.0 169.27 1072.97 1288.21 16.53 1531.99 272.40 889.19
20200211 2223.12 682.34 1184.5 169.82 1077.95 1293.30 16.62 1530.97 273.90 891.20
20200210 2201.07 676.07 1187.0 170.04 1081.40 1299.88 16.64 1534.55 274.73 893.15
20200207 2211.95 672.63 1193.5 170.50 1087.17 1307.06 16.71 1543.08 278.70 896.66
20200206 2227.94 672.69 1184.0 169.85 1078.28 1302.87 16.63 1535.59 279.56 891.50

상관관계 확인을 위해 그래프 그리기

1
from sklearn.preprocessing import minmax_scale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
plt.figure(figsize=(40, 10))
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kospi"]), "r*:", label="kospi")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kosdaq"]), "bo--", label="kosdaq")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["usd"]), "g^-", label="usd")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cny"]), "y^-", label="cny")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["jpy"]), "k--", label="jpy")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["eur"]), "m*:", label="eur")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["inr"]), "c^-", label="inr")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["gbp"]), "go--", label="gbp")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["brl"]), "y*:", label="brl")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cad"]), "g*:", label="cad")

# label 데이터
plt.legend(loc=0)

# xtick이 항상 10개 출력되도록 - 아래 x축 label
step = len(kor_vs_cur) // 10
plt.xticks(kor_vs_cur.index[::step])

plt.show()

output_26_0


상관계수 확인 - KOSPI

1
2
3
4
5
6
7
8
9
10
#상관계수 확인 - "KOSPI"
print("KOSPI vs KOSDAQ : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["kosdaq"])[0, 1]))
print("KOSPI vs USDKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["usd"])[0, 1]))
print("KOSPI vs CNYKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["cny"])[0, 1]))
print("KOSPI vs JPYKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["jpy"])[0, 1]))
print("KOSPI vs EURKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["eur"])[0, 1]))
print("KOSPI vs INRKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["inr"])[0, 1]))
print("KOSPI vs GBPKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["gbp"])[0, 1]))
print("KOSPI vs BRLKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["brl"])[0, 1]))
print("KOSPI vs CADKRW : {}".format(np.corrcoef(kor_vs_cur["kospi"], kor_vs_cur["cad"])[0, 1]))
KOSPI vs KOSDAQ : 0.8689701457832764
KOSPI vs USDKRW : -0.7474526625164396
KOSPI vs CNYKRW : -0.8299251745227267
KOSPI vs JPYKRW : -0.6105987487442344
KOSPI vs EURKRW : -0.2986694402889244
KOSPI vs INRKRW : -0.09305307626089275
KOSPI vs GBPKRW : 0.4807979987407145
KOSPI vs BRLKRW : 0.267607616153946
KOSPI vs CADKRW : 0.6836357941585803

KOSPI - Negative Correlation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
plt.figure(figsize=(40, 10))
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kospi"]), "r*:", label="kospi")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kosdaq"]), "bo--", label="kosdaq")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["usd"]), "g^-", label="usd")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cny"]), "y^-", label="cny")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["jpy"]), "k--", label="jpy")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["eur"]), "m*:", label="eur")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["inr"]), "c^-", label="inr")

# label 데이터
plt.legend(loc=0)

# xtick이 항상 10개 출력되도록 - 아래 x축 label
step = len(kor_vs_cur) // 10
plt.xticks(kor_vs_cur.index[::step])

plt.show()

output_31_0


상관계수 확인 - “KOSDAQ”

1
2
3
4
5
6
7
8
9
print("KOSDAQ vs KOSDAQ : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["kospi"])[0, 1]))
print("KOSDAQ vs USDKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["usd"])[0, 1]))
print("KOSDAQ vs CNYKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["cny"])[0, 1]))
print("KOSDAQ vs JPYKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["jpy"])[0, 1]))
print("KOSDAQ vs EURKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["eur"])[0, 1]))
print("KOSDAQ vs INRKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["inr"])[0, 1]))
print("KOSDAQ vs GBPKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["gbp"])[0, 1]))
print("KOSDAQ vs BRLKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["brl"])[0, 1]))
print("KOSDAQ vs CADKRW : {}".format(np.corrcoef(kor_vs_cur["kosdaq"], kor_vs_cur["cad"])[0, 1]))
KOSDAQ vs KOSDAQ : 0.8689701457832764
KOSDAQ vs USDKRW : -0.4560788590919353
KOSDAQ vs CNYKRW : -0.7171914703642415
KOSDAQ vs JPYKRW : -0.24811709011626565
KOSDAQ vs EURKRW : -0.019148376695966446
KOSDAQ vs INRKRW : -0.3900569760483904
KOSDAQ vs GBPKRW : 0.21872439893983708
KOSDAQ vs BRLKRW : -0.21073197177622852
KOSDAQ vs CADKRW : 0.49393118449595613

KOSDAQ - Negative Correlation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
plt.figure(figsize=(40, 10))
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kospi"]), "r*:", label="kospi")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kosdaq"]), "bo--", label="kosdaq")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["usd"]), "g^-", label="usd")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cny"]), "y^-", label="cny")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["jpy"]), "k--", label="jpy")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["eur"]), "m*:", label="eur")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["inr"]), "c^-", label="inr")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["brl"]), "y*:", label="brl")

# label 데이터
plt.legend(loc=0)

# xtick이 항상 10개 출력되도록 - 아래 x축 label
step = len(kor_vs_cur) // 10
plt.xticks(kor_vs_cur.index[::step])

plt.show()

output_36_0



상관계수 확인 결과, 강한 상관관계를 보인 항목들은 아래와 같다.

  • KOSPI vs USDKRW : -0.7474526625164396
  • KOSPI vs CNYKRW : -0.8299251745227267
  • KOSPI vs JPYKRW : -0.6105987487442344
  • KOSDAQ vs CNYKRW : -0.7171914703642415

코스닥이 오를 때에는 달러와 위안화를 사두면 좋을 것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# # KOSPI & KOSDAQ - Negative Correlation
plt.figure(figsize=(40, 10))
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kospi"]), "r*:", label="kospi")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kosdaq"]), "bo--", label="kosdaq")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["usd"]), "g^-", label="usd")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cny"]), "y^-", label="cny")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["jpy"]), "k--", label="jpy")

# label 데이터
plt.legend(loc=0)

# xtick이 항상 10개 출력되도록 - 아래 x축 label
step = len(kor_vs_cur) // 10
plt.xticks(kor_vs_cur.index[::step])

plt.show()

output_40_0


추가 상관계수 확인 - “USD”

  • 확실히 KOSPI나 KOSDAQ과 비교했을 때 전체적으로 상관계수들이 비교적 높다
  • USD 상관계수 절대값 0.4 미만 = 2개
  • KOSPI 상관계수 절대값 0.4 미만 = 3개
  • KOSDAQ 상관계수 절대값 0.4 미만 = 5개

달러의 움직임이 전세계에 영향을 미친다는 것을 알 수 있다.

1
2
3
4
5
6
7
8
9
print("USD vs KOSPI : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["kospi"])[0, 1]))
print("USD vs KOSDAQ : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["kosdaq"])[0, 1]))
print("USD vs CNYKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["cny"])[0, 1]))
print("USD vs JPYKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["jpy"])[0, 1]))
print("USD vs EURKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["eur"])[0, 1]))
print("USD vs INRKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["inr"])[0, 1]))
print("USD vs GBPKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["gbp"])[0, 1]))
print("USD vs BRLKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["brl"])[0, 1]))
print("USD vs CADKRW : {}".format(np.corrcoef(kor_vs_cur["usd"], kor_vs_cur["cad"])[0, 1]))
USD vs KOSPI : -0.7474526625164396
USD vs KOSDAQ : -0.45607885909193524
USD vs CNYKRW : 0.8717121292793995
USD vs JPYKRW : 0.7276336988139611
USD vs EURKRW : 0.47570951394792504
USD vs INRKRW : 0.13242540153627583
USD vs GBPKRW : -0.45775893555193975
USD vs BRLKRW : -0.4943384202903821
USD vs CADKRW : -0.3276584506393807
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
plt.figure(figsize=(40, 10))
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kospi"]), "r*:", label="kospi")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["kosdaq"]), "bo--", label="kosdaq")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["usd"]), "g^-", label="usd")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cny"]), "y^-", label="cny")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["jpy"]), "k--", label="jpy")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["eur"]), "m*:", label="eur")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["inr"]), "c^-", label="inr")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["gbp"]), "go--", label="gbp")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["brl"]), "y*:", label="brl")
plt.plot(kor_vs_cur.index, minmax_scale(kor_vs_cur["cad"]), "g*:", label="cad")

# label 데이터
plt.legend(loc=0)

# xtick이 항상 10개 출력되도록 - 아래 x축 label
step = len(kor_vs_cur) // 10
plt.xticks(kor_vs_cur.index[::step])

plt.show()

output_44_0


추후

  • NASDAQ과 미국 주요 지수들 그리고 미국 포브스 선정 100대 기업들의 상관관계
  • PMI 지수와 전세계 100대 기업들의 상관관계