데이터 공부를 기록하는 공간

plotly 캔들스틱, 저항선 그리기 본문

STOCK/비트코인

plotly 캔들스틱, 저항선 그리기

BOTTLE6 2022. 1. 16. 16:15
"""데이터 불러오기 """
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pyupbit

df = pyupbit.get_ohlcv("KRW-DOGE", interval = "minute5", count=12*24*7*4)

■ plotly로 그리기

#import the libraries
import plotly.subplots as ms
import plotly.graph_objects as go
data = df.reset_index().rename(columns={'index':'datetime'}).copy()
data = data[['datetime','open','high','low','close','volume','value']]

#Make Subplot of 2 rows to plot 2 graphs sharing the x axis
fig = ms.make_subplots(rows=2, cols=1,
                       shared_xaxes=True, vertical_spacing=0.02)

#Add Candlstick Chart to Row 1 of subplot
fig.add_trace(go.Candlestick(x = data['datetime'],
                      open = data['open'],      
                      high = data['high'],
                      low = data['low'],
                      close = data['close'],
                      increasing_line_color = 'green',
                      decreasing_line_color = 'red'),
                      row=1,
                      col=1)

#Add Volume Chart to Row 2 of subplot
fig.add_trace(go.Bar(x=data['datetime'],
                    y=data['volume']),
                    row=2,
                    col=1)

#Update Price Figure layout
fig.update_layout(title = 'Interactive CandleStick & Volume Chart',
yaxis1_title = 'ETS Price ($)',
yaxis2_title = 'Volume (M)',
xaxis2_title = 'Time',
xaxis1_rangeslider_visible = False,
xaxis2_rangeslider_visible = False,
autosize=False,
width=1200,
height=600)

(참고로 jupyter notebook에서는 보이지만, jupyter lab에서는 안보임, 이유는 모르겠음) 

■ 저항선 그리기

import datetime
fig, ax = plt.subplots()
ax.plot(df.index, df.high, label='high')
pivots = []
dates = []
counter = 0
lastPivot=0 

Range = [0,0,0,0,0,0,0,0,0,0]
dateRange = [0,0,0,0,0,0,0,0,0,0]

for i in df.index:
    currentMax = max(Range, default=0)
    value = df['high'][i]
    
    Range = Range[1:9]
    Range.append(value)
    dateRange = dateRange[1:9]
    dateRange.append(i)
    
    if currentMax == max(Range, default=0):
        counter += 1
    else:
        counter = 0
    
    if counter == 30:
        lastPivot = currentMax
        dateloc = Range.index(lastPivot)
        lastDate = dateRange[dateloc]
        pivots.append(lastPivot)
        dates.append(lastDate)

#print(str(pivots))
#print(str(dates)) 
timeD = datetime.timedelta(days=1)

for index in range(len(pivots)):
    print(str(pivots[index])+": " +str(dates[index]))
    
    ax.plot_date([dates[index], dates[index]+timeD], 
                 [pivots[index], pivots[index]], 
                 linestyle="-", linewidth=2, marker=",")

■ candle stick

df = pyupbit.get_ohlcv("KRW-BTC", interval = "minute5", count=12*24)​
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
data = df.copy()


fig, ax = plt.subplots(figsize=(20,8))

# calculate Bollinger Bands
smasUsed = [10,30,50]
for sma in smasUsed:
    data['SMA_'+str(sma)] = data.loc[:,'close'].rolling(window=sma).mean()

window_b = 15 #choose moving average
stdev = 2
data['SMA'+str(window_b)] = data['close'].rolling(window=window_b).mean()
data['stddev'] = data['close'].rolling(window=window_b).std()
data['upper'] = data['SMA'+str(window_b)] + data['stddev']*stdev
data['lower'] = data['SMA'+str(window_b)] - data['stddev']*stdev
data['Date'] = mdates.date2num(data.index)

# Calculate Stochastic
window_p = 10
K =4
D =4 
data['RolHigh'] = data['high'].rolling(window=window_p).max()
data['RolLow'] = data['low'].rolling(window=window_p).min()
data['stok'] = ((data['close'] - data['RolLow'])/
                (data['RolHigh']-data['RolLow']))*100
data['K'] = data['stok'].rolling(window=K).mean()
data['D'] = data['K'].rolling(window=D).mean()
data['GD'] = data['high'] #create GD column to store green dots
ohlc = []

data = data.iloc[max(smasUsed):] 

greenDotDate = [] # store dates of green dots
greenDot = [] # store values of green dots
lastK = 0 # store yesterday's fast stoch
lastD = 0 # store yesterday's slow stock
lastLow = 0 # stord yesterdays lower
lastClose =0 # stord yesterdays close
lastLowBB = 0 #stord yesterdays lower bband

for i in data.index:
    append_me = data['Date'][i], data['open'][i], data['high'][i], data['low'][i], data['close'][i], data['volume'][i]
    ohlc.append(append_me)
    
    if data['K'][i] > data['D'][i] and lastK < lastD and lastK< 60:
        plt.plot(data['Date'][i], data['high'][i]+1, marker='o', ms=4, ls="", color='g')
        greenDotDate.append(i)
        greenDot.append(data['high'][i])
    
    if ((lastLow<lastLowBB) or (data['low'][i] < data['lower'][i])) and (data['close'][i]>lastClose and data['close'][i]>data['lower'][i]) and lastK < 60 :
        plt.plot(data['Date'][i], data['low'][i]-1, marker='o', ms=4, ls="", color='b')

    lastK = data['K'][i]
    lastD = data['D'][i]
    lastLow = data['low'][i]
    lastClose = data['close'][i]
    lastLowBB = data['lower'][i]
    
for sma in smasUsed:
    data['SMA_'+str(sma)].plot(label='close')
    data['upper'].plot(label='close',color='lightgray')
    data['lower'].plot(label='close',color='lightgray')

candlestick_ohlc(ax, ohlc, width=.001, colorup='r', colordown='b', alpha=0.5) #width로 사이즈 조절해야함

ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d %H:%M"))
#ax.xaxis.set_major_locator(mticker.MaxNLocater(8))
plt.tick_params(axis='x', rotation=45)

■ candle stick + 저항선

from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
data = df.copy()


fig, ax = plt.subplots(figsize=(20,8))

# calculate Bollinger Bands
smasUsed = [10,30,50]
for sma in smasUsed:
    data['SMA_'+str(sma)] = data.loc[:,'close'].rolling(window=sma).mean()

window_b = 15 #choose moving average
stdev = 2
data['SMA'+str(window_b)] = data['close'].rolling(window=window_b).mean()
data['stddev'] = data['close'].rolling(window=window_b).std()
data['upper'] = data['SMA'+str(window_b)] + data['stddev']*stdev
data['lower'] = data['SMA'+str(window_b)] - data['stddev']*stdev
data['Date'] = mdates.date2num(data.index)

# Calculate Stochastic
window_p = 10
K =4
D =4 
data['RolHigh'] = data['high'].rolling(window=window_p).max()
data['RolLow'] = data['low'].rolling(window=window_p).min()
data['stok'] = ((data['close'] - data['RolLow'])/
                (data['RolHigh']-data['RolLow']))*100
data['K'] = data['stok'].rolling(window=K).mean()
data['D'] = data['K'].rolling(window=D).mean()
data['GD'] = data['high'] #create GD column to store green dots
ohlc = []

data = data.iloc[max(smasUsed):] 

greenDotDate = [] # store dates of green dots
greenDot = [] # store values of green dots
lastK = 0 # store yesterday's fast stoch
lastD = 0 # store yesterday's slow stock
lastLow = 0 # stord yesterdays lower
lastClose =0 # stord yesterdays close
lastLowBB = 0 #stord yesterdays lower bband

for i in data.index:
    append_me = data['Date'][i], data['open'][i], data['high'][i], data['low'][i], data['close'][i], data['volume'][i]
    ohlc.append(append_me)
    
    if data['K'][i] > data['D'][i] and lastK < lastD and lastK< 60:
        plt.plot(data['Date'][i], data['high'][i]+1, marker='o', ms=4, ls="", color='g')
        greenDotDate.append(i)
        greenDot.append(data['high'][i])
    
    if ((lastLow<lastLowBB) or (data['low'][i] < data['lower'][i])) and (data['close'][i]>lastClose and data['close'][i]>data['lower'][i]) and lastK < 60 :
        plt.plot(data['Date'][i], data['low'][i]-1, marker='o', ms=4, ls="", color='b')

    lastK = data['K'][i]
    lastD = data['D'][i]
    lastLow = data['low'][i]
    lastClose = data['close'][i]
    lastLowBB = data['lower'][i]
    
for sma in smasUsed:
    data['SMA_'+str(sma)].plot(label='close')
    data['upper'].plot(label='close',color='lightgray')
    data['lower'].plot(label='close',color='lightgray')

candlestick_ohlc(ax, ohlc, width=.002, colorup='r', colordown='orange', alpha=0.5) #width로 사이즈 조절해야함

ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d %H:%M"))
#ax.xaxis.set_major_locator(mticker.MaxNLocater(8))
plt.tick_params(axis='x', rotation=45)                                                                                    

pivots = []
dates = []
counter = 0
lastPivot=0 

Range = [0,0,0,0,0,0,0,0,0,0]
dateRange = [0,0,0,0,0,0,0,0,0,0]

for i in data.index:
    currentMax = max(Range, default=0)
    value = data['high'][i]
    
    Range = Range[1:9]
    Range.append(value)
    dateRange = dateRange[1:9]
    dateRange.append(i)
    
    if currentMax == max(Range, default=0):
        counter += 1
    else:
        counter = 0
    
    if counter == 6:
        lastPivot = currentMax
        dateloc = Range.index(lastPivot)
        lastDate = dateRange[dateloc]
        pivots.append(lastPivot)
        dates.append(lastDate)

#print(str(pivots))
#print(str(dates)) 
timeD = datetime.timedelta(days=1.5/24)

for index in range(len(pivots)):
    print(str(pivots[index])+": " +str(dates[index]))
    
    ax.plot_date([dates[index], dates[index]+timeD], 
                 [pivots[index], pivots[index]], 
                 linestyle="-", linewidth=2, marker=",")
    ax.annotate(str(int(pivots[index])), (mdates.date2num(dates[index]), pivots[index]), xytext=(-10,7),
                textcoords='offset points', fontsize=12, arrowprops=dict(arrowstyle='-|>'))

ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title("BTC 5minutes")
ax.set_ylim(data['low'].min()*0.9995, data['high'].max()*1.0015)

(참고) 

https://www.youtube.com/watch?v=ePkRMVRh_sg&list=PLPfme2mwsQ1FQhH1icKEfiYdLSUHE-Wo5&index=7

'STOCK > 비트코인' 카테고리의 다른 글

50% 리밸런싱  (0) 2022.02.05
1% GAP  (0) 2022.01.17
볼린저밴드-찾기  (0) 2022.01.16
볼린저밴드-추세추종-문제점  (0) 2022.01.16
볼린저밴드-추세추종-return 계산하기(백테스트 문제점)  (0) 2022.01.11
Comments