캔들차트 분석 - 주가등락 이진 분류 part2
SGDClassifier에 사용되는 하이퍼 파라미터를 직접 휴리스틱하게 조절하면서 최적의 파라미터를 조정해야한다. GridsearchCV를 이용한 train set의 교차검증을 통해서 파라미터를 조정해본다.
loss function으로 hinge를 사용한 버전부터 살펴본다.
X_all = candle_array
y_all = label_array
slicer = int(0.8 * len(candle_array))
X_train, y_train = X_all[:slicer], y_all[:slicer]
X_test, y_test = X_all[slicer:], y_all[slicer:] ---
my_cv = TimeSeriesSplit(n_splits=5).split(X_train)
params = {
    'sgc__loss'    : ['hinge'],
    'sgc__penalty' : ['l1', 'l2', 'elasticnet'],
    'sgc__alpha'   : [0.00000001, 0.0000001, 0.000001, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000],
}
sgd_cla_pipe = Pipeline([
                    ("scaler", StandardScaler()),
                    ("sgc", SGDClassifier(random_state=42))
])
sgd_cla_CV = GridSearchCV(sgd_cla_pipe, param_grid=params, cv=my_cv, n_jobs=-1)
sgd_cla_CV.fit(X_train, y_train)
print("best parameter :\n", sgd_cla_CV.best_params_)
print("best prediction: {0:.4f}".format(sgd_cla_CV.best_score_))
print("train set score: {0:.7f}".format(sgd_cla_CV.score(X_train, y_train))) # 훈련세트 점수
print(" test set score: {0:.7f}".format(sgd_cla_CV.score(X_test, y_test))) # 검증세트 점수
print(sgd_cla_CV.cv_results_) ---
결과를 데이터프레임으로 전환시킨뒤 csv파일로 저장한 후, 표로 다시 전환하여 정리한다.
cv_result_df = pd.DataFrame(sgd_cla_CV.cv_results_) cv_result_df.to_csv(“result.txt”) —
| param_sgc__alpha | param_sgc__loss | param_sgc__penalty | mean_test_score | std_test_score | rank_test_score | |
|---|---|---|---|---|---|---|
| 0 | 1.00E-08 | hinge | l1 | 0.666573816 | 0.039526845 | 16 | 
| 1 | 1.00E-08 | hinge | l2 | 0.664623955 | 0.041093668 | 22 | 
| 2 | 1.00E-08 | hinge | elasticnet | 0.667688022 | 0.039191716 | 13 | 
| 3 | 1.00E-07 | hinge | l1 | 0.669637883 | 0.029392137 | 8 | 
| 4 | 1.00E-07 | hinge | l2 | 0.666852368 | 0.04283177 | 14 | 
| 5 | 1.00E-07 | hinge | elasticnet | 0.676601671 | 0.035860738 | 6 | 
| 6 | 1.00E-06 | hinge | l1 | 0.666852368 | 0.035968759 | 15 | 
| 7 | 1.00E-06 | hinge | l2 | 0.669637883 | 0.033022164 | 8 | 
| 8 | 1.00E-06 | hinge | elasticnet | 0.666573816 | 0.033825379 | 16 | 
| 9 | 1.00E-05 | hinge | l1 | 0.666573816 | 0.030622937 | 16 | 
| 10 | 1.00E-05 | hinge | l2 | 0.664902507 | 0.04318537 | 20 | 
| 11 | 1.00E-05 | hinge | elasticnet | 0.668802228 | 0.027055371 | 10 | 
| 12 | 0.0001 | hinge | l1 | 0.668523677 | 0.037568331 | 11 | 
| 13 | 0.0001 | hinge | l2 | 0.663231198 | 0.042091708 | 24 | 
| 14 | 0.0001 | hinge | elasticnet | 0.664902507 | 0.040477285 | 20 | 
| 15 | 0.001 | hinge | l1 | 0.655988858 | 0.040471534 | 26 | 
| 16 | 0.001 | hinge | l2 | 0.678830084 | 0.046130354 | 5 | 
| 17 | 0.001 | hinge | elasticnet | 0.670194986 | 0.052949708 | 7 | 
| 18 | 0.01 | hinge | l1 | 0.658774373 | 0.062868778 | 25 | 
| 19 | 0.01 | hinge | l2 | 0.664623955 | 0.040771419 | 22 | 
| 20 | 0.01 | hinge | elasticnet | 0.667966574 | 0.048041863 | 12 | 
| 21 | 0.1 | hinge | l1 | 0.642061281 | 0.096986347 | 27 | 
| 22 | 0.1 | hinge | l2 | 0.666016713 | 0.044649995 | 19 | 
| 23 | 0.1 | hinge | elasticnet | 0.729247911 | 0.054460921 | 1 | 
| 24 | 1 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 25 | 1 | hinge | l2 | 0.708913649 | 0.046801631 | 4 | 
| 26 | 1 | hinge | elasticnet | 0.601949861 | 0.114965881 | 28 | 
| 27 | 10 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 28 | 10 | hinge | l2 | 0.726740947 | 0.064551876 | 2 | 
| 29 | 10 | hinge | elasticnet | 0.52005571 | 0.116241794 | 29 | 
| 30 | 100 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 31 | 100 | hinge | l2 | 0.722005571 | 0.054886669 | 3 | 
| 32 | 100 | hinge | elasticnet | 0.52005571 | 0.116241794 | 29 | 
| 33 | 1000 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 34 | 1000 | hinge | l2 | 0.52005571 | 0.116241794 | 29 | 
| 35 | 1000 | hinge | elasticnet | 0.52005571 | 0.116241794 | 29 | 
| 36 | 10000 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 37 | 10000 | hinge | l2 | 0.52005571 | 0.116241794 | 29 | 
| 38 | 10000 | hinge | elasticnet | 0.52005571 | 0.116241794 | 29 | 
| 39 | 100000 | hinge | l1 | 0.52005571 | 0.116241794 | 29 | 
| 40 | 100000 | hinge | l2 | 0.52005571 | 0.116241794 | 29 | 
| 41 | 100000 | hinge | elasticnet | 0.52005571 | 0.116241794 | 29 | 
rank_test_score을 보면 test score가 높은 순서가 출력된다.
alpha=0.1 penalty= ‘elasticnet’
에서 가장 높은 결과가 나왔고 train_set과 test_set 에 predict를 시키면 다음과 같은 점수가 출력된다.
train set score: 0.7661795 test set score: 0.7207792
해석해 보자면 위 교차검증을 통해서 하이파라미터가 튜닝된 SGDClassifier는 지난 20일동안 종가 평균이 다음 20일 동안의 종가 평균보다 높은지 낮은지 72퍼센트 정도의 확률로 맞출수 있다는 뜻이 된다. 수치만 보면 굉장히 높은 확률이라고도 볼 수 있지만 거래를 언제 실행해야 이익을 낼 수 있는지 알 수가 없으므로 이 결과가 의미를 가지기 위해서는 거래시점을 결정하는 탐구가 동반되어야 한다.
