오늘의 예제: Bitfinex와 Coinbase의 가격 변화 추이를 더 자세히 알아보자.
저번 #04에서 빗피 거래소와 코베 거래소의 가격 상관관계를 알아봤는데요, 상관관계가 좀 이상해보이는 곳이 있었죠. 예를 들면 이런 곳이요.
대부분의 구역에서 빗피와 코베 거래소의 가격이 똑같이 변하는 데, 가끔 서로 다르게 변하는 이 부분의 데이타를 조금 더 자세히 들여다 보도록 하겠습니다.
첫번째로는, 그냥 해당 시간에 빗피 가격와 코베 가격을 비교해보겠습니다. 더하여 여러 거래소 가격의 평균을 하나의 기준선으로 더해서 보도록 하겠습니다.
프로그램에서 기본이 되는 함수 부분은 저번 #03에서 했던 것과 동일합니다. (conv2date, load_csv_data) 아래는 그 외 부분만 가져오겠습니다.
###--- Main ---###
## Parameters
c_name="BTCUSD"
Exchanges=['Bitfinex','Coinbase','Bitstamp','Bittrex','Cexio','Kraken',] #'Poloniex',] #'gemini']
## Input File
in_dir='./Data/'
data=[]
for ex_name in Exchanges:
in_csv_fn=in_dir+'{}_{}_1h.csv'.format(ex_name,c_name)
data.append(load_csv_data(in_csv_fn))
print(ex_name)
print(data[-1]['date'][0],data[-1]['prices'][0],data[-1]['volumes'][0])
print(data[-1]['date'][-1],data[-1]['prices'][-1],data[-1]['volumes'][-1])
print('\n')
### Check consistency between data
for i in range(len(Exchanges)-1):
if data[0]['date'][-1] != data[i+1]['date'][-1]:
print('Time stamp is inconsistent',data[0]['date'][-1],data[i+1]['date'][-1])
sys.exit()
print('Last times are all the same.')
### Cut for last 365 days
nt=365*24
xdate= data[0]['date'][-nt:]
pdata=[]
for i in range(len(Exchanges)):
pdata.append((data[i]['prices'][-nt:,-1]+data[i]['prices'][-nt:,0])/2)
pdata=np.asarray(pdata)
print(pdata.shape)
pmean=pdata.mean(axis=0)
#pdata_ano= pdata-pmean[None,:]
#pdata=0 ### Delete memory of "pdata"
###
tgt_dates = [datetime(2018,10,15), datetime(2019,4,15)]
end_dates = [tdate+timedelta(days=32) for tdate in tgt_dates]
###--- Plotting
##-- Page Setup --##
fig = plt.figure()
fig.set_size_inches(8.5,8.5) # Physical page size in inches, (lx,ly)
fig.subplots_adjust(left=0.05,right=0.95,top=0.93,bottom=0.05,hspace=0.25,wspace=0.15) ### Margins, etc.
##-- Title for the page --##
suptit="{} Price Case Study".format(c_name)
fig.suptitle(suptit,fontsize=15) #,ha='left',x=0.,y=0.98,stretch='semi-condensed')
cc=['r','b','g','y','c','m']
abc='abcdefg'
##-- Set up an axis --##
ax1 = fig.add_subplot(2,1,1) # (# of rows, # of columns, indicater from 1)
t_idx= np.logical_and(xdate>=tgt_dates[0],xdate<end_dates[0])
ax1.plot(xdate[t_idx],pmean[t_idx],color='k',lw=1.,ls='-',label='Mean')
for i in range(2): #len(Exchanges)):
ax1.plot(xdate[t_idx],pdata[i,t_idx],color=cc[i],lw=0.8,ls='-',label=Exchanges[i])
ax1.set_title('(a) {} - {}'.format(tgt_dates[0].strftime('%Y.%m.%d'),end_dates[0].strftime('%Y.%m.%d')),x=0.,ha='left',fontsize=12)
ax1.legend(loc='lower left',bbox_to_anchor=(.02, .05),fontsize=11,borderaxespad=0.) # x and y relative location in ax1
ax1.tick_params(labelsize=10)
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d\n%Y'))
#xmin,xmax= ax1.get_xlim()
##-- Set up 2nd axis --##
ax2 = fig.add_subplot(2,1,2)
t_idx= np.logical_and(xdate>=tgt_dates[1],xdate<end_dates[1])
ax2.plot(xdate[t_idx],pmean[t_idx],color='k',lw=1.,ls='-',label='Mean')
for i in range(2): #len(Exchanges)):
ax2.plot(xdate[t_idx],pdata[i,t_idx],color=cc[i],lw=0.8,ls='-',label=Exchanges[i])
ax2.set_title('(b) {} - {}'.format(tgt_dates[1].strftime('%Y.%m.%d'),end_dates[1].strftime('%Y.%m.%d')),x=0.,ha='left',fontsize=12)
ax2.legend(loc='upper left',bbox_to_anchor=(.02, .95),fontsize=11,borderaxespad=0.) # x and y relative location in ax1
ax2.tick_params(labelsize=10)
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d\n%Y'))
##-- Seeing or Saving Pic --##
#- If want to see on screen -#
#plt.show()
#- If want to save to file
outdir = "./Pics/"
outfnm = outdir+"{}_price_casestudy.{}+{}.png".format(c_name,tgt_dates[0].strftime('%b%Y'),tgt_dates[1].strftime('%b%Y'))
#fig.savefig(outfnm,dpi=100) # dpi: pixels per inch
fig.savefig(outfnm,dpi=180,bbox_inches='tight') # dpi: pixels per inch
몇 가지 설명
- 모두 6개 거래소의 가격을 읽어들입니다. gemini는 파일의 내부 형식이 달라서, 그리고 Poloniex는 가격이 너무 이상해서 뺐습니다.
- 자세히 보고자 하는 기간을 tgt_dates라는 변수로 설정하였습니다.
- 해당 기간에 맞는 자료는 "t_idx"라는 변수를 이용해서 뽑아내고 있습니다.
(안적은 함수 포함) 위 프로그램을 실행시키면 다음과 같은 그림을 볼 수 있습니다.
많은 경우 빗피의 가격이 코베의 가격보다 높다는 것을 알 수 있습니다. 특히 코베 가격은 그대로인데 빗피의 가격이 갑자기 튈 때 상관계수가 급격히 줄어들게 됨을 유추할 수 있습니다.
그런데 위 그림을 보며 한가지 궁금증이 생겼습니다.
"빗피와 코베의 가격은 언제 그 차이가 커지고, 또 언제 작아질까? "
위 궁금증에 대한 답을 찾기 위해 이번에는 가격 차이를 그려보도록 하겠습니다.
아래 프로그램의 상단부는 위 프로그램과 같습니다. 정확히 말하자면
pdata=np.asarray(pdata)
print(pdata.shape)
pmean=pdata.mean(axis=0)
#pdata_ano= pdata-pmean[None,:]
#pdata=0 ### Delete memory of "pdata"
여기까지는 같습니다.
그 다음부터 아래 부분을 붙이면 되겠습니다.
## Bitfinex
p_bf= pdata[0,:]
## Coinbase
p_cb= pdata[1,:]
## Difference
p_diff= p_bf-p_cb
## Difference Ratio
p_diff_rt= p_diff/pmean*100.
###--- Plotting
##-- Page Setup --##
fig = plt.figure()
fig.set_size_inches(8.5,8.5) # Physical page size in inches, (lx,ly)
fig.subplots_adjust(left=0.05,right=0.95,top=0.93,bottom=0.05,hspace=0.25,wspace=0.15) ### Margins, etc.
##-- Title for the page --##
suptit="{} Price Case Study".format(c_name)
fig.suptitle(suptit,fontsize=15) #,ha='left',x=0.,y=0.98,stretch='semi-condensed')
cc=['r','b','g','y','c','m']
abc='abcdefg'
##-- Set up an axis --##
ax1 = fig.add_subplot(2,1,1) # (# of rows, # of columns, indicater from 1)
ax1.plot(xdate,pmean,color='k',lw=1.,ls='-',label='Mean')
for i in range(2): #len(Exchanges)):
ax1.plot(xdate,pdata[i,:],color=cc[i],lw=0.8,ls='-',label=Exchanges[i])
ax1.set_title('(a) Price',x=0.,ha='left',fontsize=12)
ax1.legend(loc='lower left',bbox_to_anchor=(.02, .05),fontsize=11,borderaxespad=0.) # x and y relative location in ax1
ax1.tick_params(labelsize=10)
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d\n%Y'))
##-- Set up 2nd axis --##
ax2 = fig.add_subplot(2,1,2)
ax2.plot(xdate,p_diff,color='k',lw=1.,ls='-',label='Diff')
ax2b= ax2.twinx()
ax2b.plot(xdate,p_diff_rt,color='0.5',lw=1.,ls='-',label='Diff/Price')
ax2.set_title('(b) Difference, Difference Ratio to Price',x=0.,ha='left',fontsize=12)
ax2.tick_params(labelsize=10)
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d\n%Y'))
ax2.set_ylabel('Price Diff.',fontsize=11)
ax2.axhline(y=0.,color='k',lw=0.6,alpha=0.6)
ax2b.set_ylabel('Price Diff. Ratio (%)',fontsize=11,color='0.5',rotation=-90)
ax2b.tick_params(axis='y',labelsize=10,labelcolor='0.5')
ymin1,ymax1= ax2.get_ylim()
ymin2,ymax2= ax2b.get_ylim()
ymin2= ymax2*(ymin1/ymax1)
ax2b.set_ylim(ymin2,ymax2)
##-- Seeing or Saving Pic --##
#- If want to see on screen -#
#plt.show()
#- If want to save to file
outdir = "./Pics/"
outfnm = outdir+"{}_price_diff_casestudy.png".format(c_name)
#fig.savefig(outfnm,dpi=100) # dpi: pixels per inch
fig.savefig(outfnm,dpi=180,bbox_inches='tight') # dpi: pixels per inch
몇 가지 설명
- 절대적 가격 차이와 상대적 가격 차이를 그립니다.
- "ax2b=ax2.twinx()" 라는 표현이 나오는데, 이것은 같은 x축에 대하여 서로 다른 y축 그림을 같이 그릴 때 사용합니다.
- 상대적 가격 차이는 회색으로 표시했는데, 오른쪽 tick_label도 같은 회색으로 표시해서 어느 선을 어떤 y축 값으로 볼 지 알아보기 쉽게 하였습니다.
이 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
2018년 10월부터 들썩들썩 하기 시작했고, 그게 2019년 5월 중순까지 지속되었습니다. 그리고 공교롭게도, 그 기간은 6천불 아래로 떨어진 "암흑기"였습니다. 이건 무슨 의미일까요...?
(이 시리즈는 잠시 쉬어가도록 하겠습니다. 혹시 자세히 들여다보고 싶은 주제가 있다면 댓글로 알려주세요. 되도록 반영해보도록 하겠습니다.)
관련 글들
Matplotlib List
[Matplotlib] 00. Intro + 01. Page Setup
[Matplotlib] 02. Axes Setup: Subplots
[Matplotlib] 03. Axes Setup: Text, Label, and Annotation
[Matplotlib] 04. Axes Setup: Ticks and Tick Labels
[Matplotlib] 05. Plot Accessories: Grid and Supporting Lines
[Matplotlib] 06. Plot Accessories: Legend
[Matplotlib] 07. Plot Main: Plot
[Matplotlib] 08. Plot Main: Imshow
[Matplotlib] 09. Plot Accessary: Color Map (part1)
[Matplotlib] 10. Plot Accessary: Color Map (part2) + Color Bar
F2PY List
[F2PY] 01. Basic Example: Simple Gaussian 2D Filter
[F2PY] 02. Basic Example: Moving Average
[F2PY] 03. Advanced Example: Using OpenMP
Scipy+Numpy List
[SciPy] 1. Linear Regression (Application to Scatter Plot)
[SciPy] 2. Density Estimation (Application to Scatter Plot)
[Scipy+Numpy] 3. 2D Histogram + [Matplotlib] 11. Plot Main: Pcolormesh
Road to Finance
#00 Read Text File | #01 Draw CandleSticks | #02 Moving Average
#03 Read CSV data | #04 Lead-Lag Correlation | #05 Detailed "Price Difference"
sct천사의 보팅입니다.
앞으로도 좋은 활동 부탁드려요~~^^
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
지원 고맙습니다~
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit