Files
quantconnect--lean/Algorithm.Python/KerasNeuralNetworkAlgorithm.py
T
2019-07-09 09:05:27 -07:00

99 lines
4.2 KiB
Python

# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
class KerasNeuralNetworkAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2013, 10, 7) # Set Start Date
self.SetEndDate(2013, 10, 8) # Set End Date
self.SetCash(100000) # Set Strategy Cash
spy = self.AddEquity("SPY", Resolution.Minute)
self.symbols = [spy.Symbol] # This way can be easily extended to multiply symbols
self.lookback = 30 # day of lookback for historical data
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday), self.TimeRules.AfterMarketOpen("SPY", 28), self.NetTrain) # train Neural Network
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday), self.TimeRules.AfterMarketOpen("SPY", 30), self.Trade) # trading
def NetTrain(self):
# get daily historical data
history = self.History(self.symbols, self.lookback + 1, Resolution.Daily)
# dicts that store prices for training
self.prices_x = {}
self.prices_y = {}
# dicts that store prices for sell and buy
self.sell_prices = {}
self.buy_prices = {}
for symbol in self.symbols:
if not history.empty:
# x: pridictors; y: response
self.prices_x[symbol.Value] = list(history.loc[symbol.Value]['open'])[:-1]
self.prices_y[symbol.Value] = list(history.loc[symbol.Value]['open'])[1:]
for symbol in self.symbols:
if symbol.Value in self.prices_x:
# convert the original data to np array for fitting the keras NN model
x_data = np.array(self.prices_x[symbol.Value])
y_data = np.array(self.prices_y[symbol.Value])
# build a neural network from the 1st layer to the last layer
model = Sequential()
model.add(Dense(10, input_dim = 1))
model.add(Activation('relu'))
model.add(Dense(1))
sgd = SGD(lr = 0.01) # learning rate = 0.01
# choose loss function and optimizing method
model.compile(loss='mse', optimizer=sgd)
# pick an iteration number large enough for convergence
for step in range(701):
# training the model
cost = model.train_on_batch(x_data, y_data)
# get the final predicted price
y_pred_final = model.predict(y_data)[0][-1]
# Follow the trend
self.buy_prices[symbol.Value] = y_pred_final + np.std(y_data)
self.sell_prices[symbol.Value] = y_pred_final - np.std(y_data)
def Trade(self):
for holding in self.Portfolio.Values:
# liquidate
if self.CurrentSlice[holding.Symbol.Value].Open < self.sell_prices[holding.Symbol.Value] and holding.Invested:
self.Liquidate(i.Symbol)
# buy
if self.CurrentSlice[holding.Symbol.Value].Open > self.buy_prices[holding.Symbol.Value] and not holding.Invested:
self.SetHoldings(holding.Symbol, 1 / len(self.symbols))