Sysmetic trading

[Randomforest] 10분 수익률을 이용한 주가 예측-3

quantoasis 2023. 1. 12. 10:35
반응형

 

 

이번 포스팅에서는 feature들의 중요도를 판단하여 x변수들을 채택하는 방법으로 모델의 성능을 높여보는 작업을 하겠습니다.

 

랜덤포레스트를 돌리면 모델의 변수중요도(feature importance)를 출력할 수 있습니다. feature importance는 tree를 분할하는데 얼마나 기여를 했는지에 따라 중요도를 결정합니다.

 

importances = model.feature_importances_
std = np.std([tree.feature_importances_ for tree in model.estimators_], axis=0)
indices = np.argsort(importances)[::-1]

print("Feature ranking:")

for f in range(x_train.shape[1]):
    print("{}. feature {} ({:.3f})".format(f + 1, stock_df.columns[indices][f], importances[indices[f]]))

 

matplotline을 이용해 시각화도 해볼 수 있습니다.

 

import matplotlib.pyplot as plt
plt.figure()
plt.title("Feature importances")
plt.bar(range(x_train.shape[1]), importances[indices],
        color="r", yerr=std[indices], align="center")
plt.xticks(range(x_train.shape[1]), stock_df.columns[indices], rotation=45)
plt.xlim([-1, x_train.shape[1]])
plt.show()

 

14시 10분, 14시 30분 등 점심시간 근처가 내일의 갭에 영향을 많이 미치는 것으로 보이네요.

 

 

변수의 영향을 알 수 있는 다른 방법으로 permutation importance도 있습니다. permutation importance는 한 변수의 데이터를 무작위로 섞어버리고 성능을 보는 것입니다. 만약 중요도가 떨어진다면 변수를 섞어도 성능이 떨어지지 않을 것이고, 중요하다면 성능이 많이 떨어지겠죠.

 

eli5 라이브러리를 임포트하고 아래코드로 permutation importance를 실행할 수 있습니다.

 

import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(model).fit(x_train,y_train)
eli5.show_weights(perm,feature_names=stock_df.columns[indices].tolist())

 

 

Feature importance와 permutation importance를 잘 설명해 놓은 블로그를 링크로 달아두었으니 더 궁금하시면 참고하시기 바랍니다!

 

 

Feature selection : feature importance vs permutation importance

안녕하세요, 오늘은 Feature selection 에 대해 다뤄보려고 합니다! Feature selection은 말 그대로 모델에 사용될 feature를 선택하는 과정입니다. feature가 그냥 많으면 많을수록 좋은거 아닌구요? 네!! 아닙

hwi-doc.tistory.com

 

 

이번에는 좀더 재밌는 모듈을 가져와보겠습니다. shap라는 것입니다.

 

위에서 보인 두 개의 feature selection 모델의 단점은 데이터 영향도가 양인지 음인지를 알기가 어렵다는 점입니다. 

 

shap value는 영향도가 양인지 음인지, 그리고 얼마나 크게 영향을 미치는지를 한눈에 볼 수 있게 합니다.

 

import shap
shap.initjs()
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(x_train)
sv = np.array(shap_values)
y = model.predict(x_train).astype("bool")
sv_survive = sv[:,y,:]
sv_die = sv[:,~y,:]
feature_name = stock_df.columns[:-1]
shap.summary_plot(shap_values[1], x_train.astype("float"),feature_names = feature_name)

위 시각화 자료를 보면 한눈에 어떤 변수가 얼마만큼 영향을 미쳤는지를 설명할 수 있습니다(XAI 하기에 매우 좋겠네요).

 

오른쪽으로 갈수록 갭상승이고 왼쪽으로 갈 수록 갭 하락, 빨간색이면 양의 관계, 파란색이면 음의 관계입니다.

 

예를 들어 14시 10분 수익률은 갭 상승과 높은 양의 관계를 보입니다. 물론 이에 대한 해석은 사용자의 인사이트가 필요합니다. 

 

오늘 포스팅은 여기까지고, 다음 포스팅에서는 BorutaPy로 변수를 선택한 후 다시 모델을 돌려 모델 성능을 올려보는 작업을 해보겠습니다. Cross validation도 써서 모델의 안정성도 높여보려고 합니다.

 

감사합니다.

 

 

반응형