バックトレーダーと機械学習の組み合わせはとても簡単です!

チュートリアルをダウンロードするには、ここをクリックしてください

機械学習はあまりにも人気があります。現在、量的投資は機械学習について言及していません。人工知能は低すぎます。効果については、へへへ。

では、定量的なバックテストに機械学習を導入するのは複雑ですか?実際、複雑で単純なものがあります。今日は、機械学習とバックトレーダーを組み合わせる方法を紹介します。

たとえば、特定の機械学習アルゴリズムを使用して、利益を得るために株価予測を取引できるかどうかをテストしたいと思います。ルーチンは次のようになります。架空のケースを使用して説明します。

(1)機械学習アルゴリズム「サポートベクターマシンSVM」を使用してモデルをトレーニングしました。このモデルは、過去n日間の株価の毎日の収益率を使用して、株価が上昇する(状態1)、フラットになる(状態)を予測できます。 0)、または落ちる(状態1)。-1)どの状態。次に、予測結果を次のように市場データテーブルに入れます。予測の最後の列は、機械学習予測の結果です。(このステップに興味がある場合は、こちらを参照してください

(2)上記の表に基づいて、戦略を提案します。明日上昇すると予測される場合は、ポジション全体で購入します。下降すると、すべての株が破棄され、フラットの場合は、その後、それは移動しません。機械学習戦略クラスのサンプルは次のとおりです。

class MLStrategy(bt.Strategy):
    params = dict(
    )

    def __init__(self):
        # 跟踪股票open, close价和predicted值
        self.data_predicted = self.datas[0].predicted  # 这就是机器学习算法的预测值
        self.data_open = self.datas[0].open
        self.data_close = self.datas[0].close

        # 跟踪未决订单/buy price/buy commission
        self.order = None
        self.price = None
        self.comm = None
    # logging function

    def log(self, txt):
        '''Logging function'''
        dt = self.datas[0].datetime.date(0).isoformat()
        print(f'{dt}, {txt}')

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            # order already submitted/accepted - no action required
            return
        # report executed order
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(f'BUY EXECUTED - -- Price: {order.executed.price: .2f},
                         Cost: {order.executed.value: .2f}, Commission: {order.executed.comm: .2f}')
                self.price = order.executed.price
                self.comm = order.executed.comm
            else:
                self.log(f'SELL EXECUTED - -- Price: {order.executed.price: .2f},
                         Cost: {order.executed.value: .2f}, Commission: {order.executed.comm: .2f}')
        # 报告失败订单
        elif order.status in [order.Canceled, order.Margin,
                              order.Rejected]:
            self.log('Order Failed')
        # 现在没有未决订单了
        self.order = None

    def notify_trade(self, trade):
        if not trade.isclosed:
            return
        self.log(
            f'OPERATION RESULT --- Gross: {trade.pnl:.2f}, Net: {trade.pnlcomm:.2f}')

    def next(self):
        # 如果有未决订单,则无动作,不再生成新订单
        if self.order:
            return
        
        if not self.position:
            if self.data_predicted > 0:  # 如果预测明天会涨,就买
                # 全仓买入 ('all-in')
                size = int(self.broker.getcash() / self.datas[0].open)
                # buy order
                self.log( f'BUY CREATED --- Size: {size}, Cash: {self.broker.getcash():.2f}, 
                    Open: {self.data_open[0]}, Close: {self.data_close[0]}')
                self.order = self.buy(size=size)
        else:
            if self.data_predicted < 0:  # 如果预测明天会跌,就卖
                # sell order
                self.log(f'SELL CREATED --- Size: {self.position.size}')
                self.order = self.sell(size=self.position.size)

(3)次に、サンプルデータで上記の戦略をバックテストできます。大きな発見があるかもしれません。

要約すると、上記のプロセスでは、最初のステップでデータの前処理に機械学習アルゴリズムのみを使用し、予測されたフィールドを市場テーブルに追加します。残りの手順は、一般的なバックトレーダーのバックテストプロセスです。ジェーンは単純ではなく、興奮しているかどうか?ついに機械学習の定量的バックテストを取得しました。次のインタビューでそれについて話すことができます、ハハハ!

backtraderの使用方法については、これを参照してください。なぜ私は体系的Backtrader中国の技術的なチュートリアルが必要なのか

おすすめ

転載: blog.csdn.net/qtbgo/article/details/110419095