[[201737]] 私はかつて、機械学習を使用してピグレットの世界で株価と変動を予測する空想的な例を書きました。 [[201738]] 豚老山の世界では、機械学習.fit(x, y) = (株価予測、上昇と下降予測) = 大金を稼ぐことが実現されています。 朱老三の童話では、株価の動向に影響を与えるパラメータは限られており、特に上昇と下降に影響を与える要因は、特性を構築しやすいものです。実際の市場では、株価の動向に影響を与える要因は多数存在し、これらの要因は相関関係にある可能性があります。連立方程式を解くときと同じように、この連立方程式には 1 つまたは 2 つの解があるわけではなく、*** 個の解を持つシステムであり、各解は他の解と関連していますが、単純な線形関係ではありません。市場は二次的な混沌としたシステムです。テクノロジーで株価や上昇・下降を予測することは不可能です。どれだけ先進的なテクノロジーを使っていると思っていても、それは氷山の一角を見ているようなものです。 この一連のチュートリアルで言及されている ump 審判システムは、機械学習テクノロジーを使用してバックテストの結果を学習し、新しいトランザクションを傍受するかどうかの決定を逆に導く abupy の実用的なアプリケーションです。このセクションでは、機械学習が定量的分野で非常に役立つもう 1 つの方向であるしきい値推定について説明します。これは、株式選択戦略、タイミング戦略、または意思決定を伴うコード モデルの作成に関係なく、しきい値が不可欠であるためです。たとえば、最も一般的に使用されるストップ プロフィットおよびストップ ロス戦略では、前の章で使用した abupy の組み込みストップ プロフィットおよびストップ ロス戦略 AbuFactorCloseAtrNStop など、コード作成にしきい値が必ず含まれます。 閾値の決定が必ず関係する理由は、先ほど述べたように、連立方程式を解くときと似ているからです。すべてのパラメータが不明な場合、必要な答えをどのように解くのでしょうか。したがって、いくつかの変数を定数値に変換し、これらの定数値を使用してより多くの変数を決定し、最終的に必要な解を解く必要があります。 閾値を決定する従来のアプローチは、経験に基づいて設定することです。実際、いわゆる経験とは、問題に対する個人の統計モデルです。機械学習技術の助けを借りれば、より客観的で包括的かつ適応性の高い閾値設定を実現できます。 個人の経験を利用して閾値を定数として推定する場合でも、機械学習技術を使用してデータモデルを通じて閾値を推定する場合でも、結果の絶対的に正確な予測という目標は達成できません。定量取引の確率的優位性には絶対的優位性がなく、予測のレベルに達することはできません。定量取引のほとんどの戦略は、歴史的法則の要約に基づいており、法則に基づいて確率的優位性を発見しています。その主な理論的根拠は、人間の本質の類似性と、人間の本質は変えるのが難しいという事実です。各瞬間の株価がすべてのトレーダーが到達した価値に対する即時の合意である場合、歴史の法則は将来の取引にも教訓的になります。 上記の式の解によれば、推定定数がほとんどの場合に合理的な解を得るという要件を満たすことができる限り、または推定定数が時々合理的な解を得るという要件を満たすことができる限り、それは問題ないでしょう。時々合理的な解が得られるケースについては、上位レベルの非平衡技術を介して二次ロジックで決定をフィルタリングすることができます。私が繰り返し言及した非平衡技術のアイデアは、定量化において非常に重要な設計アイデアです。なぜなら、定量化の目標結果は非平衡であり、失うお金よりも多くのお金を獲得したいからです。 1. ビットコインの特徴の抽出 以下では、ビットコインの短期取引の決定を例に挙げて、上記の議論と abupy の機械学習モジュールの使用、およびデータ取得について説明します。 - abupyからabu、ml、nd、tl、pd_resample、AbuML、AbuMLPd、AbuMetricsBase をインポートします
- abupyからABuSymbolPd、ABuScalerUtil、get_price、ABuMarketDrawing、ABuKLUtil をインポートします
-
- # btcはビットコインのシンボルコードです
- btc = ABuSymbolPd.make_kl_df( 'btc' 、開始 = '2013-09-01' 、終了= '2017-07-26' )
以前、ビットコインとライトコインのバックテストのセクションでは、ABuKLUtil.date_week_wave を使用して、次のようにトレンドの日々の変動に関する統計を作成しました。 - ABuKLUtil.date_week_wave(btc)
- 日付_週
-
- 月曜日 5.0108
-
- 火曜日 5.5610
-
- 水曜日 5.4437
-
- 木曜日 5.7275
-
- 金曜日 5.3008
-
- 土曜日 4.7875
-
- 日曜日 4.6528
-
- 名前: wave、データ型: float64
上記から、ビットコインの大幅変動取引には、1日あたり約0.055の変動幅を利用できることがわかります。次に、データに新しい列big_waveを追加すると、大幅変動が全取引日の1/3を占めていることがわかります。 - btc[ 'big_wave' ] = (btc.high - btc.low) / btc.pre_close > 0.055
- btc[ 'big_wave' ] = btc[ 'big_wave' ].astype( int )
- btc[ 'big_wave' ].value_counts()
- 0 1005
-
- 1 420
-
- 名前: big_wave、データ型: int64
大きな決断は、実は一見取るに足らない小さなことの積み重ねです。ビットコインのデイトレードをするなら、まず今日がトレードに適しているかどうかを判断する必要があります。この判断の根拠の 1 つは、今日のボラティリティが十分に大きい必要があるということです。以下では、機械学習技術を使用して、今日のボラティリティが十分に大きいかどうかを判断する方法を説明します。 注: abupy に組み込まれているサンドボックス データにはタイムシェアリング データがないため、この例では日次データを分析対象として使用します。実際の戦略では、分単位のデータを使用する必要があります。 まず、トレーニング セットとテスト セットを分割し、最新の 60 日間の傾向データをテスト セット データとして保持します。 - btc_train_raw = btc[:-60]
-
- btc_test_raw = btc[-60:]
トレーニング データ セットとテスト データ セットの両方における 5 日、10 日、21 日、および 60 日の移動平均の特徴は次のとおりです。 - calc_ma(tc, ma)を定義します:
- ma_key = 'ma{}' .format(ma)
- tc[ma_key] = nd.ma.calc_ma_from_prices( tc.close , ma, min_periods=1)
- 最大値が[5, 10, 21, 60]の場合:
- calc_ma(btc_train_raw, ma)
- calc_ma(btc_test_raw、ma) の計算
- btc_train_raw.テール(1)
特徴抽出組み合わせ関数 btc_siblings_df を記述します。 - まず、すべての取引日を 3 つのグループに分割し、複数のサブ df に分割します。つまり、各サブ df には 3 取引日の取引データが含まれます。
- データ標準化を使用して、3営業日連続の連続数値特徴を標準化します。
- 1日目と2日目の特徴のほとんどを抽出し、特徴のプレフィックスとして1と2を使用するように名前を変更します。例: one_open、one_close、two_ma5、two_high…、
- 3日目の特徴は「open」、「low」、「pre_close」、「date_week」のみを使用し、名前にはtoday_open、today_date_weekのようにtodayがプレフィックスとして付きます。
- 3日目には「big_wave」が抽出され、これは後でyとして使用されます。
- 抽出され名前が変更された特徴を接続して新しいデータを形成します。つまり、3 日間のトランザクション データの特徴 -> 1 つの新しいデータです。
コードは次のようになります。 - btc_siblings_df(btc_raw)を定義します。
- # すべての取引日を3つのグループに分割して複数のサブdfに分割します。つまり、各サブdfには3取引日の取引データが含まれます。
- btc_siblings = [btc_raw.ix[sib_ind * 3:(sib_ind + 1) * 3, :]
- sib_indがnp.arange(0, int (btc_raw.shape[0] / 3))]の場合
-
- btc_df = pd.データフレーム()
- btc_siblingsのsib_btcの場合:
- # データ標準化を使用して、3営業日連続の連続数値特徴を標準化します
- sib_btc_scale = ABuScalerUtil.scaler_std(
- sib_btc.filter([ 'open' , 'close' , 'high' , 'low' , 'volume' , 'pre_close' ,
- 'ma5' 、 'ma10' 、 'ma21' 、 'ma60' 、 'atr21' 、 'atr14' ]))
- # 標準化されたデータをbig_waveとdate_weekに接続します
- sib_btc_scale = pd.concat([sib_btc[ 'big_wave' ], sib_btc_scale, sib_btc[ 'date_week' ]], axis=1)
-
- # 1 日目と 2 日目のほとんどの機能を抽出し、機能のプレフィックスとして 1 と 2 を使用して名前を変更します (例: one_open、one_close、two_ma5、two_high...)。
- a0 = sib_btc_scale.iloc[0].filter([ 'open' , 'close' , 'high' , 'low' , 'volume' , 'pre_close' ,
- 'ma5' 、 'ma10' 、 'ma21' 、 'ma60' 、 'atr21' 、 'atr14' 、 'date_week' ])
- a0.rename(インデックス={ 'open' : 'one_open' , 'close' : 'one_close' , 'high' : 'one_high' , 'low' : 'one_low' ,
- 'ボリューム' : 'one_volume' 、 'pre_close' : 'one_pre_close' 、
- 'ma5' : 'one_ma5' 、 'ma10' : 'one_ma10' 、 'ma21' : 'one_ma21' 、
- 'ma60' : 'one_ma60' 、 'atr21' : 'one_atr21' 、 'atr14' : 'one_atr14' 、
- 'date_week' : 'one_date_week' }, inplace= True )
-
- a1 = sib_btc_scale.iloc[1].filter([ 'open' , 'close' , 'high' , 'low' , 'volume' , 'pre_close' ,
- 'ma5' 、 'ma10' 、 'ma21' 、 'ma60' 、 'atr21' 、 'atr14' 、 'date_week' ])
- a1.rename(インデックス={ 'open' : 'two_open' , 'close' : 'two_close' , 'high' : 'two_high' , 'low' : 'two_low' ,
- 'ボリューム' : '2ボリューム' 、 'プレクローズ' : '2プレクローズ' 、
- 'ma5' : 'two_ma5' 、 'ma10' : 'two_ma10' 、 'ma21' : 'two_ma21' 、
- 'ma60' : 'two_ma60' 、 'atr21' : 'two_atr21' 、 'atr14' : 'two_atr14' 、
- 'date_week' : 'two_date_week' }, inplace= True )
- # 3日目の特徴は「open」 、 「low」 、 「pre_close」 、 「date_week」のみを使用し、名前にはtoday_open、today_date_weekのようにtodayがプレフィックスとして付きます。
- a2 = sib_btc_scale.iloc[2].filter([ 'big_wave' , 'open' , 'low' , 'pre_close' , 'date_week' ])
- a2.rename(インデックス={ 'open' : 'today_open' , 'low' : 'today_low' ,
- 'pre_close' : 'today_pre_close' 、
- 'date_week' : 'today_date_week' }, inplace= True )
- # 抽出され名前が変更された特徴を接続して新しいデータを形成します。つまり、3 日間のトランザクション データの特徴 -> 1 つの新しいデータ
- btc_df = btc_df.append(pd.concat([a0, a1, a2], axis=0), ignore_index= True )
- btc_dfを返す
3日目の特徴は、トレーニング目標yがbig_waveであるため、高値の使用を避けています。当日の安値を使用できる理由は、ビットコイン市場の特徴が24時間取引であること、つまり、1日という明確な概念がないこと、つまり、1日に明確な安値がないことです。リアルタイム使用とは、24時間安値に基づいて現在の安値を手動で推測するか、24時間安値を直接使用するか、現在の安値価格を使用するかのどちらかです。データが構成された後、モデルを使用して決定を下します。決定の結果は、今後数時間で大きな変動があるかどうかです。実際、大きな変動に関する最終決定には、海外市場のトレンド決定など、他の多くのモデルの連携が必要です。 次に、トレーニング セット データ btc_train_raw をパラメーターとして使用して、結合された機能を抽出します。再結合された機能は tail に表示されます。 - btc_train0 = btc_siblings_df(btc_train_raw)
-
- btc_train0.テール()
上記のように、取得できるトレーニング セット データは 454 個のみです。ただし、連続する 3 取引日のデータはすべて 1 つの機能に結合されるため、機能の組み合わせ抽出のために 1 つのデータをスキップすることで、別の新しい機能セットを取得できます。次のコードでは、それぞれ最初のデータと 2 番目のデータをスキップして、btc_train1 と btc_train2 を抽出します。 - btc_train1 = btc_siblings_df(btc_train_raw[1:])
-
- btc_train2 = btc_siblings_df(btc_train_raw[2:])
次に、上記の 3 つの特徴セットを接続し、pd.get_dummies を使用して曜日の特徴を離散化して、すべての特徴値が 0 から 1 の間になるようにします。最終的な特徴は、以下の btc_train に示されています。 - btc_train = pd.concat([btc_train0, btc_train1, btc_train2])
-
- btc_train.index = np.arange (0, btc_train.shape[0])
-
- dummies_one_week = pd.get_dummies(btc_train[ 'one_date_week' ], プレフィックス= 'one_date_week' )
-
- dummies_two_week = pd.get_dummies(btc_train[ 'two_date_week' ], プレフィックス= 'two_date_week' )
-
- dummies_today_week = pd.get_dummies(btc_train[ 'today_date_week' ], プレフィックス= 'today_date_week' )
-
- btc_train.drop ([ 'one_date_week' , ' two_date_week' , 'today_date_week' ], inplace= True , axis=1)
-
- btc_train = pd.concat([btc_train、dummies_one_week、dummies_two_week、dummies_today_week]、軸=1)
-
- pd.options.display.max_rows=10
-
- btc_train
2. abuの組み込み機械学習モジュールの使用 次に、abupy に組み込まれている機械学習ツールである AbuML を使用して、特徴データをカプセル化します。コードは次のとおりです。以下の y 値は big_wave 列です。 - トレーニングマトリックス = btc_train.as_matrix()
-
- y = 訓練行列[:, 0]
-
- x = 訓練行列[:, 1:]
-
- btc_ml = AbuML(x, y, btc_train)
AbuML は、データの特性に基づいて分類器または回帰器を自動的に選択します。以下は、特定の分類器操作です。たとえば、ランダム フォレストを分類器として使用する場合、random_forest_classifier_best を実行すると、n_estimators パラメーターとトレーニング セット データに対して内部的にグリッド検索フィッティングが実行され、最も適切なパラメーターが検索され、最終的に内部分類器として使用されます。 - btc_ml.ランダムフォレスト分類器ベスト()
-
- グリッド検索を開始します。お待ちください...
- RandomForestClassifier(bootstrap=True、class_weight=None、criterion='gini'、
- max_depth=なし、max_features= 'auto' 、max_leaf_nodes=なし、
-
- min_impurity_split=1e-07、min_samples_leaf=1、
-
- min_samples_split=2、min_weight_fraction_leaf=0.0、
-
- n_estimators=260、n_jobs=1、oob_score= False 、random_state=なし、
-
- verbose=0、warm_start= False )
すべての最適な機能では、学習者の特性に基づいて、最小限のパラメータ設定のみが検索されます。カスタムパラメータ範囲が必要な場合は、次のように使用できます。 - param_grid = { 'max_features' : [ 'sqrt' , 'log2' ], 'n_estimators' : np.arange(50, 500, 50)}
-
- btc_ml.random_forest_classifier_best(param_grid=param_grid)
-
- グリッド検索を開始します。お待ちください...
- RandomForestClassifier(bootstrap= True 、class_weight=None、criterion= 'gini' 、
-
- max_depth=なし、max_features= 'sqrt' 、max_leaf_nodes=なし、
-
- min_impurity_split=1e-07、min_samples_leaf=1、
-
- min_samples_split=2、min_weight_fraction_leaf=0.0、
-
- n_estimators=400、n_jobs=1、oob_score= False 、random_state=なし、
-
- verbose=0、warm_start= False )
次に、btc_ml を使用してトレーニング セットのクロス精度スコアリングを実行します。 - btc_ml.cross_val_accuracy_score()
-
- RandomForestClassifier スコア平均: 0.8151620867325032
-
- 配列([ 0.781 , 0.8102, 0.7883, 0.8382, 0.8162, 0.8162, 0.8235,
-
- 0.8456、0.7794、0.8529])
次に、btc_ml を使用してトレーニング セットでクロス roc_auc スコアリングを実行します。 - btc_ml.cross_val_roc_auc_score()
-
- RandomForestClassifier スコア平均: 0.8399573797130188
-
- 配列([ 0.815, 0.8785, 0.8166, 0.8018, 0.8707, 0.8484, 0.8148,
-
- 0.8551、0.8005、0.8981])
AbuML の外部関数はすべて、回帰、クラスタリングなど、使用する学習器のタイプを指定できるキー サブパラメータ fiter_type をサポートしています。各関数は、内部デコレータを通じてサポートする学習器のタイプを宣言し、サポートされていないタイプの出力はサポートしません。たとえば、roc_auc スコアリングに回帰器の使用を指定する場合: - btc_ml.cross_val_roc_auc_score(fiter_type=ml.EMLFitType.E_FIT_REG)
- cross_val_roc_auc_score はreg をサポートしていません。
上記の出力は、内部実装で entry_wrapper デコレータを通じて E_FIT_CLF、つまり分類子のみがサポートされていると宣言されているため、関数が回帰関数をサポートしていないことを示しています。 - @entry_wrapper(サポート=(EMLFitType.E_FIT_CLF,))
- def cross_val_roc_auc_score(self, cv=10, **kwargs):
- 「」 「 」
- デコレータentry_wrapper(support=(EMLFitType.E_FIT_CLF,))によって装飾されます。
- つまり、教師あり学習分類をサポートし、cross_val_scoreを使用してデータのroc_auc測定を実行します。データのyが
- label > 2 の場合、label_binarize を使用してラベルを 2 値化します。
- バイナリ化された列のroc_aucを1つずつ計算し、スコア***データメトリックを返します。
- :param cv: cross_val_scoreのパラメータ。デフォルト値は10です。
- :param kwargs: x、yは外部から渡すことができます
- x = kwargs.pop( 'x' , self.x)
- y = kwargs.pop( 'y' , self.y)
- self._do_cross_val_scoreに渡されるパラメータx、yを決定します。
- そして、デコレータによって使用される fiter_type は次のようになります。
- ttn_abu.cross_val_roc_auc_score(fiter_type=ml.EMLFitType.E_FIT_REG)
- :戻り値: cross_val_score によって返されるスコアシーケンス、
- 例: array([ 1. , 0.9 , 1. , 0.9 , 1. , 0.9 , 1. , 0.9 , 0.95, 1. ])
- 「」 「 」
- x = kwargs.pop( 'x' , self.x)
- y = kwargs.pop( 'y' , self.y)
- self._do_cross_val_score(x, y, cv, _EMLScoreType.E_SCORE_ROC_AUC.value)を返します。
詳細については、AbuMLのソースコードをご覧ください。 次に、train_test_split_xy を使用して、トレーニング セットによって出力された precision_score、recall_score、混同行列、および f1 メトリックを表示します。 - btc_ml.train_test_split_xy()
- xy:(1363, 48)-(1363,)
- 列車x-列車y:(1226, 48)-(1226,)
- テストx-テストy:(137, 48)-(137,)
- 精度 = 0.77
- 精度スコア = 0.62
- リコールスコア = 0.39
- 予測
- | 0 | 1 |
- |
- 0 | 90 | 9 |
- 実際 |
- 1 | 23 | 15 |
- |
- 精度再現率 F1スコア サポート
-
- 0.0 0.80 0.91 0.85 99
- 1.0 0.62 0.39 0.48 38
-
- 平均/ 合計 0.75 0.77 0.75 137
次の roc 曲線は plot_roc_estimator によって描画されます。 - btc_ml.plot_roc_estimator()
以下は plot_confusion_matrices を使用して混同行列を描画します。 - btc_ml.plot_confusion_matrices()
- [[915 65]
-
- [183 200]]
次に、plot_decision_function を使用して決定境界を描画します。2D グラフを描画するため、描画する前に PCA を使用してデータ特徴の次元を削減しました。 - btc_ml.plot_decision_function()
次に、plot_graphviz_tree を使用して論理決定図を描画します。 - btc_ml.plot_graphviz_tree()
- RandomForestClassifier には tree_ 属性がありません。decision tree replace を使用してください。
次に、feature_selection を使用して機能のサポートを評価します。 - pd.options.display.max_rows = 48
-
- btc_ml.feature_selection(show= False ).sort_values( by = 'ranking' )
特徴の重要度はimportances_coef_pdによって定量化されます。 - btc_ml.importances_coef_pd().sort_values( by = 'importance' )[::-1]
3. テストセットの検証と不均衡な手法 次に、先ほど保持および切り取られた 60 個のテスト データ ポイントを組み合わせて、トレーニング セットを抽出したときと同じ方法で特徴を抽出します。コードは次のとおりです。 - btc_test0 = btc_siblings_df(btc_test_raw)
- btc_test1 = btc_siblings_df(btc_test_raw[1:])
- btc_test2 = btc_siblings_df(btc_test_raw[2:])
- btc_test = pd.concat([btc_test0, btc_test1, btc_test2])
- btc_test.index = np.arange(0, btc_test.shape[0])
- dummies_one_week = pd.get_dummies(btc_test[ 'one_date_week' ], プレフィックス= 'one_date_week' )
- dummies_two_week = pd.get_dummies(btc_test[ 'two_date_week' ], プレフィックス= 'two_date_week' )
- dummies_today_week = pd.get_dummies(btc_test[ 'today_date_week' ], プレフィックス= 'today_date_week' )
- btc_test.drop ([ 'one_date_week' , ' two_date_week' , 'today_date_week' ], inplace= True , axis=1)
- btc_test = pd.concat([btc_test、dummies_one_week、dummies_two_week、dummies_today_week]、軸=1)
- マトリックステスト = btc_test.as_matrix()
- y_test = 行列テスト[:, 0]
- x_test = マトリックステスト[:, 1:]
テスト セット データの精度は次のように評価されます。 - sklearnからメトリックをインポート
-
- y_predict = [btc_ml.predict(x_test[test_ind])[0]、 test_indがnp.arange (0、matrix_test.shape[0])]
-
- print( 'テストセットの精度 {: 3f}' .format(metrics.accuracy_score(y_test, y_predict)))
- テストセット精度 0.620690
上記のように、精度の結果は 60% 以上正確です。predict_proba を使用して確率の結果を確認してみましょう。 - y_prob = [btc_ml.predict_proba(x_test[test_ind])[0]、 test_indがnp.arange (0、matrix_test.shape[0])]
- y_確率[-10:]
- [配列([ 0.495, 0.505]),
- 配列([ 0.9075, 0.0925]),
- 配列([ 0.7875, 0.2125]),
- 配列([ 0.83, 0.17])、
- 配列([ 0.8375, 0.1625]),
- 配列([ 0.96, 0.04])、
- 配列([ 0.58, 0.42])、
- 配列([ 0.495, 0.505])、
- 配列([ 0.6575, 0.3425]),
- 配列([ 0.565, 0.435])]
このセクションの冒頭で、推定の決定は、時には合理的な解決策を解決できる限り、多くの場合満足できると述べました。決定は、非平衡技術を介して二次ロジックでフィルタリングできます。以下は、この文の意味を説明します。上記のy_predict出力を通じて、精度結果が60%以上であることがわかります。この決定に基づいてビットコインが今日大きな市場を持つかどうかのみを判断する場合、エラーの可能性はまだたくさんあります。上記のy_probは、各決定の確率を出力します。 では、意思決定モデルに非常に自信がある場合にのみビットコインを取引したい場合、そうでなければ取引するよりも利益が少ないほうがいい場合は、どうすればよいでしょうか。 上記の予測決定は、値が 0.5 を超える場合に判断されます。より正確に把握するには、この値を調整する必要があります。たとえば、0.55 を超える場合にのみ決定を下す必要があります。最初の質問は、このしきい値をどのように選択するかです。次の例では、search_match_pos_threshold を使用してしきい値を決定します。 - btc_ml.search_match_pos_threshold(精度マッチ=0.85)
- 0.580 要件を満たす、精度:0.854、効果率:0.879
結果は上記の通りです。search_match_pos_threshold の機能は、トレーニング セット データの不均衡な結果を測定し、決定しきい値を 0.5 から 0.99 まで継続的に調整することです。 たとえば、テストしきい値が 0.55 の場合、決定の確率が配列 ([0.5378, 0.4622]) であれば、しきい値のバイナリ分割後の結果は (0, 0) となり、この結果は精度統計に含まれません。つまり、有効な決定は行われなかったとみなされます。ただし、決定の確率が配列 ([0.9711, 0.0289]) であれば、しきい値のバイナリ分割後の結果は (1, 0) となり、有効な決定が行われたとみなされます。有効な決定の精度が、パラメータ acceleration_match によって渡された値 (この例では 0.85、つまり 85% の精度) に達すると、検索が停止します。この例で返される結果は 0.580 です。つまり、しきい値 0.580 では、非平衡決定に対して 85% の精度率を達成できます。 注: search_match_neg_threshold に対応して、閾値検索が実行され、決定閾値が 0.5 から 0.01 の範囲で継続的に下方に調整されます。詳細については、ソースコードを参照してください。 以下では、しきい値として 0.580 を使用し、predict_proba_threshold 関数を使用して決定を行います。コードは次のとおりです。 - y_prob_threshold = [btc_ml.predict_proba_threshold(x_test[test_ind], 0.580, 0)
-
- test_indがnp.arange(0, matrix_test.shape[0])の場合]
上記のpredict_proba_thresholdで渡される3番目のパラメータ0は、有効な決定が行われなかった場合、つまり閾値を2進数で割って結果が(0, 0)になった後に返される決定結果です。ここでは0が返されます。なぜなら、ビットコインの例では、トレーダーが今日がデイトレードに適しているかどうかについて保守的な決定を下したい場合、高い確率、つまりトレードに適している場合にのみ1が返されることが期待されるからです。それ以外の場合、確実性があまりない場合は、すべて0が返される可能性があります。以下は、precision_scoreを使用して精度率を計算します。 - metrics.precision_score(y_test、y_prob_threshold) の精度スコア。
- 1.0
上記のように、精度は 100% 正確ですが、再現率スコアは非常に低く、これはビットコインが保守的であるために多くの大きな市場状況でデイトレードをあきらめ、状況を十分に把握した場合にのみ行動を起こすことを意味します。 - metrics.recall_score(y_test、y_prob_threshold) の値を、
- 0.200000000000000001
上記の状況とは対照的に、積極的なトレーダーの中には、今日市場がないと確信が持てない限り、取引をするという決断を下したいと考える人もいます。 以下では、しきい値として 0.90 を使用し、predict_proba_threshold 関数を使用して決定を行います。3 番目のパラメータ 1 は、有効な決定が行われなかった場合に返される決定結果が 1 であることを意味します。結果のほとんどの決定が 1 として決定されていることがわかります。コードは次のとおりです。 - y_prob_threshold = [btc_ml.predict_proba_threshold(x_test[test_ind], 0.90, 1)
-
- test_indがnp.arange(0, matrix_test.shape[0])の場合]
-
- pd.Series(y_prob_threshold).value_counts()
- 1 49
-
- 0 9
-
- データ型: int64
4. AbuMLPdを継承してデータ処理をカプセル化する abupyでは、構築にAbuMLクラスを直接使用することは推奨されていません。AbuMLPdを継承した後、make_xyメソッドを実装することをお勧めします。make_xyでは、データのトレーニングセットとテストセットが組み立てられます。AbuMLPd基本クラスは、プロキシメソッドを介してAbuMLのすべてのメソッドをプロキシします。つまり、インターフェース操作は、AbuMLのメソッドを使用するものと同じです。このセクションで使用される例は、abupyプロジェクトのBtcBigWaveClfクラスに組み込まれています。具体的な実装については、BtcBigWaveClfを直接読んでください。 要約: abupy に組み込まれているサンドボックス データにはタイムシェアリング データがないため、この例では日次データを分析対象として使用します。実際の戦略では分単位のデータを使用する必要があります。このセクションの例は主に abupy の機械学習モジュールの使用例に合わせて書かれていますが、実際の日中取引の決定とは大きく異なります。 |