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));

▶ 위기때 너무 많이 떨어지는 것을 확인할 수 있다.