캔들차트 분석 - 주가등락 이진 분류 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퍼센트 정도의 확률로 맞출수 있다는 뜻이 된다. 수치만 보면 굉장히 높은 확률이라고도 볼 수 있지만 거래를 언제 실행해야 이익을 낼 수 있는지 알 수가 없으므로 이 결과가 의미를 가지기 위해서는 거래시점을 결정하는 탐구가 동반되어야 한다.