116回目のオリジナル記事は、「個人の成長と富の自由、世界の運用の論理、AIの定量的投資」に焦点を当てています。
北京の流行状況はまだ変曲点に達していないようですが、この3日間が終わった後に来るはずです。
今日は、機械学習モデルをバックテスト フレームワークに統合し、バックテストのためにバックトレーダーと接続することに焦点を当てます。
データのラベリング、特徴量エンジニアリング、データセットの分割、モデルの準備、トレーニングと評価などを完了しました。ソート用のテスト セットで pred_score を生成します。
01 ソーティングオペレーター
ソーティング演算子は、候補プールまたは選択されたターゲット プールの上位 K を特定の要因順序に従って選択します。たとえば、大きいものから小さいものへの上位 2 つを選択するか、またはソート演算子によって推定されたスコア値に従って上位 K を選択します。マシン モデル ブランチ。このアルゴリズムは qlib の TopK に似ており、qlib のほうがより複雑です. 市場全体で銘柄を選択することを目的としています. 流動性を確保するために、下位 5 銘柄の排除を重視しますが、原理は似ています.
クラス SelectTopK: def __init__(self, K=1, order_by='order_by', b_ascending=False): 自己.K = K self.order_by = order_by self.b_ascending = b_ascending def __call__(自己、コンテキスト): stra = コンテキスト['戦略'] 機能 = コンテキスト['機能'] feature.columns に self.order_by がない場合: logger.error('ソートフィールド{}は計算されません'.format(self.order_by)) 戻る バー = get_current_bar(コンテキスト) バーがなしの場合: logger.error('バーを取得できません') 真を返す bar.sort_values(self.order_by、ascending=self.b_ascending、inplace=True) 選択済み = [] pre_selected = なし コンテキストで「選択」された場合: pre_selected = コンテキスト['選択済み'] デルコンテキスト['選択'] # 現在の完全な候補セット # 順番に K ダウンを選択 リスト内のコード (bar.code): pre_selected の場合: コードが pre_selected の場合: selected.append(コード) それ以外: selected.append(コード) len(selected) >= self.K の場合: 壊す context['selected'] = 選択済み
メインロジックの __call__ 関数では、呼び出されるたびに計算されます。
1. データに order_by セクションがあることを確認します。
2. 現在の日付のバーを取り、order_by フィールドをソートします (アップグレードがデフォルトで、降順を指定できます)。
3. 以前にスクリーニングサブセットがある場合は、このサブセットを使用し、そうでない場合は、アセット候補プール全体を使用します。
前から順にKを選んでください。
02 機械学習計算 pred_score
私たちのエンジン本体には add_features 関数があり、
1.バックトレーダーの脳に追加されました。
2. データの特徴量エンジニアリングとデータのラベル付けは、データローダーによって自動的に実行されます。
def add_features(自己、シンボル、名前、フィールド): # 1. データセット、アセット候補セットを追加します 記号の s: self.add_data(s) # 2. 機能エンジニアリング self.features = self.loader.load_one_df(シンボル、名前、フィールド)
3. 次のステップは、データを推定することです。
def add_model (self、モデル、split_date、feature_names): self.dataset = Dataset(dataloader=self.loader, split_date=split_date, feature_names=feature_names) model.fit(self.dataset) self.features['pred_score'] = model.predict(self.dataset) print(self.features['pred_score'])
データセットを使用してデータローダーをラップすると、時系列データセットを自動的に分割し、モデルを使用してデータセットをトレーニングおよびスコアリングできます。次に、データを予測し、pred_score 列を生成します。
その後のトレーニング プロセスは同じです。
e.add_model(SklearnModel(RandomForestRegressor()), split_date='2020-01-01', feature_names=feature_names)
トレーニング セットのスコアは高いですが、テスト セットのスコアはマイナスです。(明らかにオーバーフィッティング)
ソートには SelectTopK 演算子 order_by='pred_score' を使用します。
e.run_algo_strategy([SelectTopK(K=1, order_by='pred_score',b_ascending=False), WeightEqually()]) e.analysis(pyfolio=False)
概要: 今日フレームワーク プロセスを実行し、明日も最適化を続けます。
コードとデータは、planet-quantification 列に同期されています。
ETF ローテーション + RSRS タイミング、およびカマン フィルター: 年率 48.41%、シャープ レシオ 1.89