# 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 |