저는 현재 단일 자산 백 테스트를 구현하려고합니다. ztore가 특정 임계 값 아래로 내려갈 때 구매 신호가 생성되고 임계 값을 초과 할 때이를 판매합니다.Z-Score backtest에서 정권을 채우는 방법?
df1 = pd.read_csv('XBT.csv', index_col = 0)
df1 = df1.drop(['ADJUSTED','VOLUME'], axis = 1)
df1.head()
OPEN HIGH LOW CLOSE
Date
2016-09-25 22:00:00 600.1650 600.2850 599.3190 599.4575
2016-09-25 22:01:00 599.4550 600.1605 599.2980 599.5125
2016-09-25 22:02:00 599.5101 601.0850 599.2945 600.1450
2016-09-25 22:03:00 600.2950 600.6150 599.3290 599.3350
2016-09-25 22:04:00 599.3350 600.1400 599.3350 599.6972
또한 zscore, 임계 값 및 누적 반환 값을 계산했습니다.
window = 300 #HYPERPARAMETER 5 hours lookback
df1['zScore'] = (df1['CLOSE'] - df1['CLOSE'] .rolling(60).mean())/df1['CLOSE'] .rolling(60).std()
df1 = df1.dropna()
entryZscore = 4 #HYPERPARMETER arbitrary naumber based on visual observations
exitZscore = 0 #HYPER PARAMETER
df1['cumret'] = df1['CLOSE'].divide(df1['CLOSE'].ix[0])
OPEN HIGH LOW CLOSE zScore cumret
Date
2016-09-25 22:59:00 599.8950 600.1239 599.5101 599.5376 -0.068662 1.000000
2016-09-25 23:00:00 599.5626 600.0743 599.5500 599.5775 0.001960 1.000067
2016-09-25 23:01:00 599.5750 600.0372 599.2800 599.9372 0.656922 1.000667
2016-09-25 23:02:00 600.3245 600.3245 598.5426 599.8000 0.416065 1.000438
2016-09-25 23:03:00 599.8000 599.9950 599.8000 599.9901 0.749235 1.000755
우리는 (1), 쇼트 (-1) 또는 중립 (0) 이후 전략 반환 값을 생성하는 긴 여부를 나타낼 것이다 저 정권 값을 생성한다하는 문제. 나는 진입 점과 출구 점을 만들어 냄으로써 시도했지만 여기에서 붙어있다. 어떤 도움이라도 대단히 감사하겠습니다!
df1['long entry'] = np.where((df1.zScore < - entryZscore) & (df1.zScore.shift(1) > - entryZscore), 1, 0)
df1['long exit'] = np.where((df1.zScore > - exitZscore) & (df1.zScore.shift(1) < - exitZscore),1, 0)
df1['short entry'] = np.where((df1.zScore > entryZscore) & (df1.zScore.shift(1) < entryZscore),1, 0)
df1['short exit'] = np.where((df1.zScore < exitZscore) & (df1.zScore.shift(1) > exitZscore),1, 0)
df1['close pct ch'] = df1['CLOSE'].pct_change()
df1 = df1.dropna()