机器学习太热门,如今搞量化投资而不提机器学习,人工智能,就显得太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中文技术教程,