バックトレーダー フレームワークと統合された機械学習モデル

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

金融機械学習: データセット分割とベースライン モデル

ETF モメンタム ローテーション + 市場のタイミング: 年率 30% の戦略

おすすめ

転載: blog.csdn.net/weixin_38175458/article/details/128052333
おすすめ