728x90
반응형
나중에 찾아보기 위한 용도이므로 자세한 설명은 없는 글입니다.
예제
2023.04.04 - [주식분석/Quant 분석(프로그래밍)] - 막힌벽을 강하게 뚫어보자- 222일선 강하게 돌파하는 전략
시고저종 캔들차트와 거래량 바차트를 한 화면에 그리고 싶습니다.
그런데 그냥 subplots를 이용하면 두 그래프의 크기가 같게 나옵니다. 그림의 크기를 조절해 보기 위해 Gridspec 이라는 함수를 사용하는 예제입니다.
python code
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mpl_dates
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
import FinanceDataReader as fdr
from matplotlib import gridspec
def load_data(stock_code, start_date, end_date):
df = fdr.DataReader(stock_code, start_date, end_date)
return df
def Beat_Ma():
end_date = datetime.datetime.today()
start_date = end_date - relativedelta(years=3)
stk_code = '357550' # 석경에이티
stk_code = '001390' # KG케미칼
stk_code = '058850' # KTcs
stk_code = '014100' # 메디앙스
stk_code = '001460' # BYC
stk_code = '312610' # 에이에프더블유
stk_code = '270520' # 지앤원에너지
df = load_data(stk_code, start_date, end_date)
df.index = df.index.map(mpl_dates.date2num)
df['Date'] = df.index
volume_multiplier = 3
df['Ma222'] = df.Close.rolling(222).mean()
df= df.copy().tail(200)
cond1 = df.Open < df.Ma222
cond2 = df.Close > df.Ma222
cond3 = df.Volume > volume_multiplier * df.Volume.shift(1)
cond4 = df.Close - df.Ma222 > df.Ma222 - df.Open
df['signal'] = cond1 & cond2 & cond3 & cond4
df_ohlc = df[['Date', 'Open', 'High', 'Low', 'Close']]
# subplots를 이용한 예제
fig, ax = plt.subplots(2, 1, sharex=True, figsize=(10, 6)) # share x axis and set a figure size
candlestick_ohlc(ax[0], df_ohlc.values, width=0.6, \
colorup='red', colordown='blue', alpha=0.8)
ax[0].plot(df.index, df.Ma222)
ax[1].bar(df.index, df.Volume)
ax[0].scatter(df[df['signal'] == True].index, df[df['signal'] == True].Close * 1.02,
marker='o', c='black', label='signal', s=100)
date_format = mpl_dates.DateFormatter('%y/%b/%d')
ax[1].xaxis.set_major_formatter(date_format)
plt.suptitle(f'{stk_code} subplots version')
plt.show()
# gridspec를 이용한 예제. height_ratios로 두 행으로 배치된 그림의 크기를 조절함
fig =plt.figure(figsize=(10,6))
gs =gridspec.GridSpec(nrows=2, ncols=1, height_ratios=[5,2])
ax_ohlc = fig.add_subplot(gs[0])
ax_volume = fig.add_subplot(gs[1], sharex=ax_ohlc)
candlestick_ohlc(ax_ohlc, df_ohlc.values, width=0.6, \
colorup='red', colordown='blue', alpha=0.8)
ax_ohlc.plot(df.index, df.Ma222, label='MA_222days')
ax_ohlc.plot(df.index, df.Close, label='close')
ax_volume.bar(df.index, df.Volume,label='volume')
ax_ohlc.scatter(df[df['signal'] == True].index, df[df['signal'] == True].Close * 1.02,
marker='2', c='black', label='signal', s=200)
date_format = mpl_dates.DateFormatter('%y/%b/%d')
ax_volume.xaxis.set_major_formatter(date_format)
ax_ohlc.legend(loc ='upper left')
ax_volume.legend(loc ='upper left')
plt.suptitle(f'{stk_code} using gridspec')
plt.show()
if __name__ == '__main__':
Beat_Ma()
위 코드의 결과입니다.
첫번째 결과는 위 그림처럼 봉차트와 바차트의 크기가 같게 나옵니다. 봉차트가 더 중요한 정보라고 생각될 때는 gridspec를 이용하여 아래 그림처럼 차트의 크기를 바꿉니다.
정리
fig, ax = plt.subplots(2, 1, sharex=True, figsize=(10, 6)) # share x axis and set a figure size
ax[0].plot(x_data, y_data)
ax[1].bar(x_data, y_data)
fig =plt.figure(figsize=(10,6))
gs =gridspec.GridSpec(nrows=2, ncols=1, height_ratios=[5,2])
ax0 = fig.add_subplot(gs[0])
ax1 = fig.add_subplot(gs[1], sharex=ax0)
728x90
반응형
'파이썬' 카테고리의 다른 글
randint를 사용할 땐 주의하라고? (0) | 2022.06.27 |
---|---|
움직이는 차트, 실시간 변하는 차트 그리기 (0) | 2022.06.26 |
댓글