본문 바로가기

코딩TIPS

[plotly] candle stick(캔들 차트)과 거래량, 이동평균 그래프 확인

반응형

plotly를 이용해서 candle 차트를 그리고 거래량 이동평균 데이터도 같이 확인해 보겠습니다.

candle 차트에 사용할 데이터는 apple 주가로 하겠습니다.
financedatareader를 이용해서 불러옵니다.

import FinanceDataReader as fdr

df=fdr.DataReader('AAPL')
df

1980-12-12부터의 데이터가 확인이 되네요.


그럼 candle 차트를 그려보겠습니다.
x축의 날짜 데이터와 open, high, low, close의 정보를 각각 지정해줍니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=df.index,
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'])])

fig.show()

plotly에서는 차트에서 원하는 구간만 확인이 가능합니다.
마우스 왼쪽 버튼을 누른채로 드래그를 하면 그 기간의 데이터만 확대해서 보입니다.

확대된 그래프 입니다.

 

 

반응형

 

 

데이터의 기간을 2022-01-01부터로 축소하고, 그래프의 색을 변경하겠습니다.
그래프는 상승 시 빨간색, 하락 시 파란색으로 변경하겠습니다.
increasing_line_color= 'red', decreasing_line_color= 'blue'을 추가하면 됩니다.

fig = go.Figure(data=[go.Candlestick(x=df.index,
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'],
                increasing_line_color= 'red', decreasing_line_color= 'blue',
                )],)

fig.show()


다음은 주가 데이터에 거래량 데이트를 추가해보겠습니다.
candle 차트를 row=1, col=1에 거래량을 row=2, col=1에 지정했습니다.

from plotly.subplots import make_subplots

fig = make_subplots(rows=2,
                    cols=1,
                    shared_xaxes=True,
                    )

fig = make_subplots(rows=2, cols=1)

fig.add_trace(
     go.Candlestick(x=df.index,
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'],
                increasing_line_color= 'red', decreasing_line_color= 'blue',
                name='주가'
                ),
                row=1, col=1
)

fig.add_trace(
    go.Bar(x=df.index, y=df['Volume'],
           name='거래량'),
    row=2, col=1
)

fig.update(layout_xaxis_rangeslider_visible=False)

fig.show()


거래량 그래프가 나왔습니다.

거래량도 주가 상승한 날과 하락한 날을 종가-시가를 기준으로 데이터를 구분하는 column을 추가합니다.

df['change']=df['Close']-df['Open']
df.loc[df['change']>=0,'Volumecolor']=1
df.loc[df['change']<0,'Volumecolor']=0
df[['change','Volumecolor']]


marker=dict(color=df['Volumecolor'],colorscale='BlueRed'), 이 부분을 추가해서 상승한 날의 거래량은 빨간색으로 하락한 날은 파란색으로 보이게 했습니다.

from plotly.subplots import make_subplots

fig = make_subplots(rows=2,
                    cols=1,
                    shared_xaxes=True,
                    )

fig = make_subplots(rows=2, cols=1)

fig.add_trace(
     go.Candlestick(x=df.index,
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'],
                increasing_line_color= 'red', decreasing_line_color= 'blue',
                name='주가'
                ),
                row=1, col=1
)

fig.add_trace(
    go.Bar(x=df.index, y=df['Volume'],
           marker=dict(color=df['Volumecolor'],colorscale='BlueRed'),
           name='거래량'),
    row=2, col=1
)

fig.update(layout_xaxis_rangeslider_visible=False)

fig.show()

봐오던 주가 차트와 얼추 비슷하게 된 것 같습니다.


다음으로는 이동 평균 데이터를 추가해보겠습니다.
DataFrame의 rolling을 이용하면 됩니다.
5일, 10일, 20일, 60일 120일 데이터를 추가하겠습니다.

df['ma5']=df['Close'].rolling(5).mean()
df['ma10']=df['Close'].rolling(10).mean()
df['ma20']=df['Close'].rolling(20).mean()
df['ma60']=df['Close'].rolling(60).mean()
df['ma120']=df['Close'].rolling(120).mean()
df


각 이동평균마다 line 그래프를 추가하겠습니다.

from plotly.subplots import make_subplots

fig = make_subplots(rows=2,
                    cols=1,
                    shared_xaxes=True,
                    vertical_spacing=0.1)

fig = make_subplots(rows=2, cols=1)

fig.add_trace(
     go.Candlestick(x=df.index,
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'],
                increasing_line_color= 'red', decreasing_line_color= 'blue',
                name='주가'
                ),
                row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df['ma5'],
               line=dict(color="#b66aa0"),
               name='MA5'),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df['ma10'],
               line=dict(color="#414b73"),
                name='MA10'),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df['ma20'],
               line=dict(color="#e8d887"),
                name='MA20'),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df['ma60'],
               line=dict(color="#73ad8a"),
                name='MA60'),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df['ma120'],
               line=dict(color="#8b8b8b"),
                name='MA120'),
    row=1, col=1
)

fig.add_trace(
    go.Bar(x=df.index, y=df['Volume'],
           marker=dict(color=df['Volumecolor'],colorscale='BlueRed'),
           name='거래량'),
    row=2, col=1
)

fig.update(layout_xaxis_rangeslider_visible=False)

fig.show()

이동평균까지 그래프에 추가가 됐습니다.


plotly를 이용해서 candle 차트를 그리고 거래량 이동평균 데이터도 같이 확인해 봤습니다.

반응형