[Python] Road to Finance #05 Bitfinex와 Coinbase의 가격을 더 자세히 관찰하기

in sct •  5 years ago 

오늘의 예제: 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


몇 가지 설명

  1. 모두 6개 거래소의 가격을 읽어들입니다. gemini는 파일의 내부 형식이 달라서, 그리고 Poloniex는 가격이 너무 이상해서 뺐습니다.
  2. 자세히 보고자 하는 기간을 tgt_dates라는 변수로 설정하였습니다.
  3. 해당 기간에 맞는 자료는 "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



몇 가지 설명

  1. 절대적 가격 차이와 상대적 가격 차이를 그립니다.
  2. "ax2b=ax2.twinx()" 라는 표현이 나오는데, 이것은 같은 x축에 대하여 서로 다른 y축 그림을 같이 그릴 때 사용합니다.
  3. 상대적 가격 차이는 회색으로 표시했는데, 오른쪽 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"

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

sct천사의 보팅입니다.
앞으로도 좋은 활동 부탁드려요~~^^

지원 고맙습니다~