STOCK/비트코인
백테스트 - logistic regression
BOTTLE6
2022. 1. 3. 00:03
(참고) 파이썬을 이용한 알고리즘 트레이딩 5장
data = df.copy()
data['return'] = np.log(data['close']/data['close'].shift(1))
data.dropna(inplace=True)
lags = 3
cols = []
for lag in range(1, lags+1):
col = "lag_{}".format(lag)
data[col] = data['return'].shift(lag)
cols.append(col)
data.dropna(inplace=True)
data
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
lm = LogisticRegression(C=1e7, solver = 'lbfgs',
multi_class='auto',
max_iter=1000)
lm.fit(data[cols], np.sign(data['return']))
data['prediction'] = lm.predict(data[cols])
data['prediction'].value_counts()
▶ long = 1 보다는 short=-1을 예측한 값이 많다.
hits = np.sign(data['return'].iloc[lags:]*
data['prediction'].iloc[lags:]
).value_counts()
hits
accuracy_score(np.sign(data['return']), data['prediction'])
▶ 예측 정확도가 낮다.
data['strategy'] = data['prediction']*data['return']
data[['return','strategy']].sum().apply(np.exp)
▶그래도 가만히 가지고 있는 것보다는 long-short 포지션 하는 것이 더 좋긴하다.
data[['return','strategy']].cumsum().apply(np.exp).plot(figsize=(10,6));
# long position 만 가지고, short position일때 팔면 ?
data['prediction_long'] = np.where(data['prediction']>0, 1,0)
data['strategy_long'] = data['prediction_long']*data['return']
data[['return','strategy_long']].sum().apply(np.exp)
▶ 이것도 보유만 하는 것보다는 낫다.
data[['return','strategy_long']].cumsum().apply(np.exp).plot(figsize=(10,6));
▶ 위기때 너무 많이 떨어지는 것을 확인할 수 있다.