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

Updated: