backtrader与机器学习的结合,就这么简单!

点此下载教程

机器学习太热门,如今搞量化投资而不提机器学习,人工智能,就显得太low了,至于效果麽,嘿嘿嘿。

那么是不是在量化回测中,引入机器学习会很复杂呢?其实有复杂,也有简单的。今天就给大家介绍一种用backtrader结合机器学习的思路。

比如说,我想测试能否利用某个机器学习算法对股价的预测进行交易,以获取利润。套路可能是这样的,我们用一个假想的案例来说明。

(1)我利用机器学习算法“支持向量机SVM”训练了一个模型,它能够利用股票过去n天的日收益率,预测明日股票处于涨(状态1)、平(状态0)、跌(状态-1)中的哪种状态。然后,我把预测结果放到行情数据表中,如下,其中最后一列predict就是机器学习预测的结果。(如果你对这一步感兴趣,请参考这里)

(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)然后,我们就可以在样本数据上回测上述策略,指不定有啥大发现呢。

综上所述,以上过程只在第1步使用了机器学习算法进行了数据预处理,在行情表增加了一个字段predicted。剩下的步骤就是典型的backtrader回测过程。简不简单,激不激动?终于搞定机器学习量化回测了,下次面试可以聊两句了,哈哈哈!

至于backtrader怎么用,看这:为什么需要一本系统化的Backtrader中文技术教程

猜你喜欢

转载自blog.csdn.net/qtbgo/article/details/110419095