본문 바로가기

API

[yahoo finance API] 금 은 구리 스프레드와 비트코인 비교

반응형

yahoo finance를 이용해서 금 은 구리 및 비트코인 데이터를 수집하고 각각 비트코인과의 비교 그래프를 확인하겠습니다.

그리고 금-은 스프레드, 금-구리 스프레드를 구하고 비트코인과 비교하겠습니다.

 

1. 금, 은, 구리와 비트코인

2. 금-은 스프레드, 금-구리 스프레드와 비트코인

 

 

1. 금, 은, 구리와 비트코인

데이터를 가져오기 위해서는 yfinance의 설치가 필요합니다.

아래의 명령어로 설치가 가능합니다.

pip install yfinance

 

금(GC=F), 은(SI=F), 구리(HG=F) 및 비트코인 USD(BTC-USD)를 수집하겠습니다.

기간은 2017-01-01부터 오늘까지입니다.

startdate='2017-01-01'
enddate=(datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
gld=yf.download('GC=F', startdate, enddate, auto_adjust=True)
silv=yf.download('SI=F', startdate, enddate, auto_adjust=True)
hg=yf.download('HG=F', startdate, enddate, auto_adjust=True)

btc=yf.download('BTC-USD', startdate, enddate, auto_adjust=True)

비트코인 데이터가 정상 수집된 것을 알 수 있습니다.

btc

 

금과 비트코인 데이터를 그래프로 확인하겠습니다.

import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Line(x=btc.index, y=btc['Close'], name="비트코인"),
    secondary_y=True,
)

fig.add_trace(
    go.Line(x=gld.index, y=gld['Close'], name="금"),
    secondary_y=False,
)

fig.update_layout(
    title_text='금과 비트코인',
    title={'x':0.5, 'y':0.85}
    
)

fig.show()

 

 

다음은 은과 비트코인입니다.

 

 

구리와 비트코인을 보겠습니다.

 

 

 

반응형

 

 

 

2. 금-은 스프레드, 금-구리 스프레드와 비트코인

금-은 스프레드를 계산하기 위해 금-은 데이터를 병합하겠습니다.

import pandas as pd

gs=pd.concat([gld[['Close']],silv[['Close']]], axis=1)
gs.columns=['gold','silver']
gs

 

금과 은은 데이터의 Scale이 달라서 MinMaxScaler를 이용해서 정규화를 하겠습니다.

그리고 금데이터와 은데이터의 차분을 구해서 spread에 저장합니다.

from sklearn.preprocessing import MinMaxScaler

# MinMaxcaler객체 생성
scaler = MinMaxScaler()

# MinMaxScaler 로 데이터 셋 변환 .fit() 과 .transform() 호출.  
scaler.fit(gs)
df1 = scaler.transform(gs)

gldscal=pd.DataFrame(df1, index=gs.index,columns=['gld','silv'])
gldscal['spread']=gldscal['gld']-gldscal['silv']
gldscal

 

 

금-은 스프레드와 비트코인을 그래프로 확인하겠습니다.

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Line(x=btc.index, y=btc['Close'], name="비트코인"),
    secondary_y=True,
)

fig.add_trace(
    go.Line(x=gldscal.index, y=gldscal['spread'], name="금-은 스프레드"),
    secondary_y=False,
)

fig.update_layout(
    title_text='금-은 스프레드와 비트코인',
    title={'x':0.5, 'y':0.85}
    
)

fig.show()

 

반응형

 

 

다음으로는 금과 구리 데이터를 병합하고, 정규화 후에 spread데이터를 구하겠습니다.

gh=pd.concat([gld[['Close']],hg[['Close']]], axis=1)
gh.columns=['gold','hg']


# MinMaxcaler객체 생성
scaler = MinMaxScaler()

# MinMaxScaler 로 데이터 셋 변환 .fit() 과 .transform() 호출.  
scaler.fit(gh)
df2 = scaler.transform(gh)

hgscal=pd.DataFrame(df2, index=gh.index,columns=['gld','hg'])
hgscal['spread']=hgscal['gld']-hgscal['hg']
hgscal

 

그래프로 볼까요

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Line(x=btc.index, y=btc['Close'], name="비트코인"),
    secondary_y=True,
)

fig.add_trace(
    go.Line(x=hgscal.index, y=hgscal['spread'], name="금-구리 스프레드"),
    secondary_y=False,
)

fig.update_layout(
    title_text='금-구리 스프레드와 비트코인',
    title={'x':0.5, 'y':0.85}
    
)

fig.show()

 

역상관이 있는 것처럼 보이기도 합니다.

 

이상으로 yahoo finance를 이용해서 금 은 구리 및 비트코인 데이터 및  금-은 스프레드, 금-구리 스프레드를 구하고 비트코인과 비교했습니다.

반응형