본문 바로가기
Trading/Strategies

ALT - Long-Short Equity Strategy

by bents 2020. 11. 27.
# 롱숏 전략의 정의

The strategy

- makes models which are using value factors, technical indicators, pricing models 
   Ex. Score = (0.5 x the PE Ratio of that stock) + (0.5 x the 30 day price momentum)

- ranks all stocks in the market using some model

- goes long (buys) the topnequities of the ranking, and short on (sells) the bottomnfor equal amounts of money

  (Total value of long position = Total value of short position).

 

총 투자금액 d 내에서 m개 주식 중 상위n개 매수, 하위n개 매도한다? 얼만큼? 

 

  • For each equity in spots 1,,n in the ranking, sell d/2n dollars of that equity
  • For each equity in spots mn,,m in the ranking, buy d/2n dollars of that equity.

하지만 주식마다 가격이 다르기 때문에 동일규모로 투자하려면, 투자금액을 늘리거나 n을 작게해야 함.

We're basically putting our money on our ranking model being able to separate and spread high performing stocks from low performing stocks. The nice thing about making money based on the spread of the ranking is that it is unaffected by what the market does.

# 랭킹기반 롱숏전략의 장점

순위 체계는 거의 모든 모델에서 활용할 수 있다. 가치팩터, 기술팩터 등 여러 팩터를 만들어서 랭킹만 만들면 머신러닝 기법도 적용해서 수익률 최적화도 가능하다. 

 

## 롱숏전략 더 잘 만들려면? 

1. 기존에 사용되는 팩터들을 따라서 써보자.

    --> 차익거래 실패할 가능성 높음. but 시사점을 얻어보자.

2. 수익률 예측모델(가격모델)을 팩터로 써보자.

3. 기술지표 / 신호 들을 활용해보자.

    --> 30일 이동평균선, 변동성

4. 펀더멘탈지표 

    --> 안정성, 성장성, 지속가능성

5. 시점마다 모멘텀 vs 복귀 점수를 주고, 선택해보자. 

A price-based mean reversion may be predictive over a few days,
while a value-based factor model may be predictive over many months.
It is important to determine the timeframe over which your model should be predictive, 
and statistically verify that before executing your strategy.

# 실습

## 단계1 : Factor/Score 만들기

  • 모멘텀 : period이전 가격과의 차이 / 현재가격계산
  • RSI : "일정 기간동안의 주가상승폭/주가하락폭"의 공식 ; a/(a+1)
def momentum(dataDf, period):
	# shift up : -1 , down : +1 
    return dataDf.sub(dataDf.shift(period), fill_value=0) / dataDf.iloc[-1]

def ewm(dataDf, halflife):
	# halflife : 확률값이 1/2으로 감소하는 기간
    return dataDf.ewm(halflife=halflife,ignore_na=False,min_periods=0,adjust=True).mean()

def rsi(data, period):
    data_upside = data.sub(data.shift(1), fill_value=0)
    data_downside = data_upside.copy()
    data_downside[data_upside > 0] = 0
    data_upside[data_upside < 0] = 0
    avg_upside = data_upside.rolling(period).mean()
    avg_downside = - data_downside.rolling(period).mean()
    rsi = 100 - (100 * avg_downside / (avg_downside + avg_upside))
    rsi[avg_downside == 0] = 100
    rsi[(avg_downside == 0) & (avg_upside == 0)] = 0

    return rsi

 

## 단계2 : Score와 Forward returns 비교하기 ( Simulation / 성과측정 )

Make correlation between score & forward returns

 

  1. by equaties
    --> 각 주식마다 현재의 모멘텀 점수를 계산한다.
    --> 점수 순위를 만들고, 순위기반의 bucket(상위n개, 하위n개)의 수익률 분포를 보자.
    --> 고수익군과 저수익군의 차이가 있나?
    ex. if a stock ranks high on momentum score, we should expect it(returns) to perform poorly next week.

  2. by dateteime
    --> window size : daily, weekly, monthly
    --> 모멘텀을 계산하는 timeframe에 따라 수익률에 차이가 있나?
    --> 위의 모멘텀 계산방식 수정해서 bucket의 수익률분포 다시 보자.
    ex. the average correlation is slightly negative againt, but varies a lot daily as well from month to month
# trading period가 monthly라면,
for month in range(1, monthly_index.size):

  strategy_returns[monthly_index[month-1]] = \
  mean_basket_returns[ number_of_baskets-1] \
  - mean_basket_returns[0]

 

## 단계3 : 실제적용 ( 백테스트 )

최근 2년치와 향후 1년치 데이터를 기반으로 (모멘텀) 점수가 "꾸준히" 유의미한지 테스트하기

plt.plot(strategy_returns.cumsum())

--