본문 바로가기
Trading/Strategies

ALT-Crypto /Mean Reversion on Spread in a pair- Testing modality

by bents 2021. 1. 28.

# spread 구하기

- OLS말고 TLS로 정의하기 :  quantdevel.com/pdf/betterHedgeRatios.pdf

def test(symbList):

  start_date = '2012/01/01'
  end_date = datetime.now()

  #download data from Yahoo Finance
  y=data.DataReader(symbList[0], "yahoo", start=start_date, end=end_date)
  x=data.DataReader(symbList[1], "yahoo", start=start_date, end=end_date)

  #rename column to make it easier to work with later
  y.rename(columns={'Adj Close':'price'}, inplace=True)
  x.rename(columns={'Adj Close':'price'}, inplace=True)

  #make sure DataFrames are the same length
  min_date = max(df.dropna().index[0] for df in [y, x])
  max_date = min(df.dropna().index[-1] for df in [y, x])

  y = y[(y.index>= min_date) & (y.index <= max_date)] 
  x = x[(x.index >= min_date) & (x.index <= max_date)]

  #run Robust Least Squares regression to find hedge ratio
  #and then create spread series
  df1 = pd.DataFrame({'y':y['price'],'x':x['price']})
  est = sm.RLM(df1.y,df1.x)
  est = est.fit()
  df1['hr'] = -est.params[0] #hedge_ratio
  df1['spread'] = df1.y + (df1.x * df1.hr)

  cadf = ts.adfuller(df1.spread)
  print(cadf[1])

  if cadf[1] < 0.05:

    return symbList, df1, round(_hurst(df1.spread),2), _halflife(df1)

여러 코인의 조합 중 BTC-ETH 스프레드가 정상성이 있다고 나온다. 

BTC-ETH 스프레드의 분포가 재밌다. 내눈에 bimodal 분포로 보이는데 검정할 방법이 없을까?

-> 있다. Python보다 R에 더 많다. (R 다시 공부해야할 듯...허허)

 

 

# Modality Test 하는 법 [출처]

- UniDip is a noise robust clustering algorithm for 1 dimensional numeric data. It recursively extracts peaks of density in the data utilizing the Hartigan Dip-test of Unimodality. (*the null hypothesis is that F is a unimodal distribution)

로버스트하다보니 이 데이터도 unimodal을 기각하기 쉽지않은 듯.

from unidip import UniDip
import unidip.dip as dip
data = np.msort(data)
print(dip.diptst(data))
# d-statistics , p-value , indices
#(0.008294595214401818, 0.6103896103896104, (1195, 1419))

intervals = UniDip(data).run()
print(intervals)

 

# 평균회귀전략 적용하기


# df1['spread'] = df1.y + (df1.x * df1.hr)
- long spread : long y , short x 
- short spread : long x, short y 
* price는 음수가 될 수 없기 때문에 hedge ratio 는 항상 non-negative 다.

스프레드를 표준화해서 평균회귀전략을 적용해보자. Z-score가 이동평균과 이동표준편차로 구해지기 때문에, 오랜 시간이 지나면 zScore가 커버하는 spread의 범위가 달라져서 매매하는데 문제가 생긴다. 예를들면 Zscore 가 떨어질 것이라고 생각해서 숏포지션을 잡았고, 실제로 zScore 가 떨어졌음에도 스프레드는 오히려 증가한다. 

2016-06-21 ===== entry on short | spread : 289 === zScore : 1.080   
2017-03-15 =====exit on short | spread : 429 === zScore :  -2.664  

 

스프레드 표준편차에 근거한 매매전략의 수익률

 

이 전략을 재활용할 방안은?

- 실제 수익에 직접적인 영향을 미치는 Spread로 거래기준값을 모델링한다

- 일단위 데이터가 아닌 minute 단위, hour 단위 데이터로 적용한다.

- 청산까지 걸리는 시간이 오래 걸리면 강제 청산하는 조건을 추가한다.

'Trading > Strategies' 카테고리의 다른 글

시봉 단타 전략  (0) 2021.02.15
고민둥절/ 매커니즘을 분석하자  (0) 2021.01.30
ALT - Crypto / 거래기간 전략  (0) 2021.01.11
ALT - Equity / 거래량vs변동성  (0) 2021.01.10
ALT - Crypto / 변동성 전략1  (0) 2021.01.08