LITElric 2018-10-19
有没有想过如何将您的机器学习/数据科学技能应用于算法交易?
如果您已经了解Python和数据科学的基本统计原理(如训练 - 测试 - 拆分,过度拟合等),那么您已经走在了前面。
将机器学习模型转换为交易算法非常简单,只要您知道在这些环境中数据是如何处理和执行的。
让我们看一下超级基本的机器学习模型(适用于Quantopian平台的QuantConnect)。
转到此处为QuantConnect创建帐户(https://www.quantconnect.com/)。
import numpy as np from sklearn.ensemble import GradientBoostingRegressor
这是算法的代码框架:
class SimpleML(QCAlgorithm): def Initialize(self): # Set settings here. # Instantiate variables here. # Schedule events here. def OnData(self, data): # Handle data live. def scheduled_event(self): # Scheduled event function.
在QuantConnect和Quantopian这样的平台中,算法是在类中构建的。这就是你设置你的设置,实例化变量,并安排其他您想要运行的函数。
让我们填写def Initialize(self)部分。
def Initialize(self): self.SetStartDate(2018,1,1) self.SetEndDate(2018,9,1) self.SetCash(100000) self.AddEquity('AMZN', Resolution.Daily) self.model = GradientBoostingRegressor() self.lookback = 30 self.history_range = 200 self.X = [] self.y = [] self.Schedule.On(self.DateRules.WeekStart(), self.TimeRules.BeforeMarketClose('AMZN', minutes=10), Action(self.create_model)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen('AMZN', minutes=1), Action(self.trade))
注意,我们在一周的第一个交易日,即收盘前10分钟调用create_model函数。然后,我们每天在开盘10分钟后对模型进行预测和权衡。
OnData处理algo的实时数据。这只在你的算法在较低的时间帧下执行(比如HTF算法)时使用。我们不需要这个,因为我们每天只做一次交易。
def OnData(self, data): pass
这部分应该看起来很熟悉。这里重要的是知道如何读取历史的价格数据。
def create_model(self): recent_prices = self.History(['AMZN'], self.history_range)['close'].values price_changes = np.diff(recent_prices).tolist() for i in range(self.history_range-self.lookback-1): self.X.append(price_changes[i:i+self.lookback]) self.y.append(price_changes[i+self.lookback]) self.model.fit(self.X, self.y)
Python代码如下!
def trade(self): if len(self.y) > self.lookback: recent_prices = self.History(['AMZN'], self.lookback+1)['close'].values price_changes = np.diff(recent_prices) prediction = self.model.predict(price_changes.reshape(1, -1)) if prediction > 0: self.SetHoldings('AMZN', 1.0) else: self.SetHoldings('AMZN', 0)
如果我们的预测是积极的,我们就全力以赴!如果没有,我们是平的。
以下是QuantConnect平台上的结果。虽然它击败了市场,但在这段时间内,您可能会做出72%的买入并持有AMZN。
import numpy as np from sklearn.ensemble import GradientBoostingRegressor # Adapted from https://www.quantopian.com/posts/simple-machine-learning-example-mk-ii class SimpleML(QCAlgorithm): def Initialize(self): self.SetStartDate(2018,1,1) self.SetEndDate(2018,9,1) self.SetCash(100000) self.AddEquity('AMZN', Resolution.Daily) self.model = GradientBoostingRegressor() self.lookback = 30 self.history_range = 200 self.X = [] self.y = [] self.Schedule.On(self.DateRules.WeekStart(), self.TimeRules.BeforeMarketClose('AMZN', minutes=10), Action(self.create_model)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen('AMZN', minutes=1), Action(self.trade)) def OnData(self, data): pass def create_model(self): recent_prices = self.History(['AMZN'], self.history_range)['close'].values price_changes = np.diff(recent_prices).tolist() for i in range(self.history_range-self.lookback-1): self.X.append(price_changes[i:i+self.lookback]) self.y.append(price_changes[i+self.lookback]) self.model.fit(self.X, self.y) def trade(self): if len(self.y) > self.lookback: recent_prices = self.History(['AMZN'], self.lookback+1)['close'].values price_changes = np.diff(recent_prices) prediction = self.model.predict(price_changes.reshape(1, -1)) if prediction > 0: self.SetHoldings('AMZN', 1.0) else: self.SetHoldings('AMZN', 0)