如何使用Python在QuantConnect中实现基本交易算法
有没有想过如何将您的机器学习/数据科学技能应用于算法交易?
如果您已经了解Python和数据科学的基本统计原理(如训练 - 测试 - 拆分,过度拟合等),那么您已经走在了前面。
将机器学习模型转换为交易算法非常简单,只要您知道在这些环境中数据是如何处理和执行的。
让我们看一下超级基本的机器学习模型(适用于Quantopian平台的QuantConnect)。
转到此处为QuantConnect创建帐户(https://www.quantconnect.com/)。
1.导入Python必需的库
import numpy as np from sklearn.ensemble import GradientBoostingRegressor
2.了解基本的QuantConnect结构
这是算法的代码框架:
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这样的平台中,算法是在类中构建的。这就是你设置你的设置,实例化变量,并安排其他您想要运行的函数。
3.设置
让我们填写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))
- self.SetStartDate():回测的开始日期(YYYY,MM,DD)。
- self.SetEndDate():回测的结束日期(YYYY,MM,DD)。
- self.SetCash(100000):交易金额。
- self.AddEquity('AMZN',Resolution.Daily):添添加任何我们想要的数据。有关在QuantConnect文档中添 instruments的更多信息。
- self.model:实例化我们的模型。
- self.lookback:要训练的过去样本数。
- self.history_range:我们将训练的历史范围。
- self.X:我们的特征的空列表(在这种情况下,过去返回)。
- self.y:目标的空列表(第二天的返回)。
- self.Schedule.On():这就是我们调用我们定义的函数的方式。
注意,我们在一周的第一个交易日,即收盘前10分钟调用create_model函数。然后,我们每天在开盘10分钟后对模型进行预测和权衡。
4. OnData
OnData处理algo的实时数据。这只在你的算法在较低的时间帧下执行(比如HTF算法)时使用。我们不需要这个,因为我们每天只做一次交易。
def OnData(self, data): pass
5.编写建模函数
这部分应该看起来很熟悉。这里重要的是知道如何读取历史的价格数据。
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)
- recent_prices = self.History():这就是我们在过去数据中调用我们在算法顶部添加的任何工具的方式。这将返回dataframe的open, high, low, and close,用于出价和询价,以及您指定的时间范围内的数量。选择['close']只选择每天的收盘价。(请记住,我们在顶部指定了Resolution.Daily。)
- price_changes = np.diff(recent_prices).to_list():我们将预测从每日收盘价到每日收盘价的百分比价格变化。
- for loop:对于我们历史上的每一天,X将是我们回顾的天数。y是那天的回报。我们循环查看历史上的天数,减少回顾次数。
- 拟合模型。
6.写交易执行
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)
- if len(self.y) > self.lookback:这是一项检查,确保我们的y至少是我们lookback的数量。
- prediction:使用我们的模型预测,以最新的价格进行价格变动。
如果我们的预测是积极的,我们就全力以赴!如果没有,我们是平的。
结果:
以下是QuantConnect平台上的结果。虽然它击败了市场,但在这段时间内,您可能会做出72%的买入并持有AMZN。
完整Python代码:
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)
相关推荐
机器学习之家 2020-11-10
mori 2020-11-06
夜斗不是神 2020-11-17
huavhuahua 2020-11-20
Yasin 2020-11-16
xiaoseyihe 2020-11-16
千锋 2020-11-15
diyanpython 2020-11-12
chunjiekid 2020-11-10
wordmhg 2020-11-06
YENCSDN 2020-11-17
lsjweiyi 2020-11-17
houmenghu 2020-11-17
Erick 2020-11-17
HeyShHeyou 2020-11-17
以梦为马不负韶华 2020-10-20
lhtzbj 2020-11-17
pythonjw 2020-11-17
dingwun 2020-11-16