def testLiveBrokerDonchianAlgorithm2014WithoutDataProvider(self): feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() cash = self.initialCash shares = {} orders = {} for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=cash, orders=orders, shares=shares) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) cash = broker.getAvailableCash() shares = broker.getAllShares() orders = broker.getAllActiveOrders() self.assertEqual(broker.getEquity(), 36922.16)
def testLiveBrokerDonchianAlgorithm2014WithMemoryDataProvider(self): feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() dataProvider = MemoryDataProvider() dataProvider.persistCash(cash=self.initialCash) for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=dataProvider.loadCash(), orders=dataProvider.loadOrders(), shares=dataProvider.loadShares()) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) dataProvider.persistCash(cash=broker.getAvailableCash()) dataProvider.persistShares(shares=broker.getAllShares()) dataProvider.persistOrders(orders=broker.getAllActiveOrders()) self.assertEqual(broker.getEquity(), 36922.16)
def setUpClass(cls): feed = DynamicFeed(cls.db, cls.codes) days = feed.getAllDays() if len(days) == 247: return rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \ row["Volume"] == "-" googleFeed = googlefinance.build_feed(cls.codes, 2014, 2014, storage=cls.csvStorage, skipErrors=True, rowFilter=rowFilter) feed = DynamicFeed(cls.db, cls.codes, maxLen=10) feed.getDatabase().addBarsFromFeed(googleFeed)
def testCliDonchianAlgorithmWithSpecificDates(self): api = PytradeApi(dbfilepah=self.db) api.reinitializeUser(username=self.username, cash=self.initialCash) tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05) utc = pytz.utc specificdays = [ utc.localize(datetime.datetime(2014, 2, 7)), utc.localize(datetime.datetime(2014, 2, 11)), utc.localize(datetime.datetime(2014, 9, 18)), utc.localize(datetime.datetime(2014, 10, 23)), utc.localize(datetime.datetime(2014, 10, 28)), utc.localize(datetime.datetime(2014, 12, 29))] feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) alldays = feed.getAllDays() for day in specificdays: cli = PytradeCli(dbfilepah=self.db, date=day, maxlen=self.maxLen, codes=self.codes, tradingAlgorithmGenerator=tradingAlgorithmGenerator) orders = cli.executeAnalysis() nextDay = alldays[alldays.index(day) + 1] for order in orders: open = cli.getLastValuesForInstrument(order.getInstrument(), nextDay)[1] if not cli.confirmOrder(orderId=order.getId(), quantity=order.getQuantity(), price=open, commission=10, date=nextDay): cli.cancelOrder(order.getId()) cli.save() maxlen = (datetime.datetime.now() - datetime.datetime(2014, 12, 1)).days cli = PytradeCli(dbfilepah=self.db, maxlen=maxlen) self.assertEqual(cli.getAccountInfo()[1], 36922.16)
def testCliDonchianAlgorithm2014(self): api = PytradeApi(dbfilepah=self.db) api.reinitializeUser(username=self.username, cash=self.initialCash) tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05) feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() for i in range(len(days)): day = days[i] cli = PytradeCli(dbfilepah=self.db, date=day, maxlen=self.maxLen, codes=self.codes, tradingAlgorithmGenerator=tradingAlgorithmGenerator) orders = cli.executeAnalysis() if i == (len(days) - 1): continue nextDay = days[i+1] for order in orders: open = cli.getLastValuesForInstrument(order.getInstrument(), nextDay)[1] if not cli.confirmOrder(orderId=order.getId(), quantity=order.getQuantity(), price=open, commission=10, date=nextDay): cli.cancelOrder(order.getId()) cli.save() maxlen=(datetime.datetime.now() - datetime.datetime(2014, 12, 1)).days cli = PytradeCli(dbfilepah=self.db, maxlen=maxlen) self.assertEqual(cli.getAccountInfo()[1], 36922.16)
def testApiDonchianAlgorithm2014WithSQLiteDataProvider(self): feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) days = feed.getAllDays() api = PytradeApi(dbfilepah=self.db) api.reinitializeUser(username=self.username, cash=self.initialCash) tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, self.donchianEntry, self.donchianExit, self.riskFactor) for i in range(len(days)): day = days[i] api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False) api.executeAnalysis() api.persistData() if i == (len(days) - 1): continue day = days[i + 1] api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False) for order in api.getActiveMarketOrders() + api.getStopOrdersToConfirm(): bar = api.getCurrentBarForInstrument(order.getInstrument()) if bar is None: continue if not api.confirmOrder(order, bar.getDateTime(), order.getQuantity(), bar.getOpen(), 10): api.cancelOrder(order) api.persistData() self.assertEqual(api.getEquity(), 36922.16)
def testLiveBrokerDonchianAlgorithmWithSpecificDatesAndSQLiteDataProvider(self): username = "******" utc = pytz.utc days = [ utc.localize(datetime.datetime(2014, 2, 7)), utc.localize(datetime.datetime(2014, 2, 11)), utc.localize(datetime.datetime(2014, 9, 18)), utc.localize(datetime.datetime(2014, 10, 23)), utc.localize(datetime.datetime(2014, 10, 28)), utc.localize(datetime.datetime(2014, 12, 31))] dataProvider = SQLiteDataProvider(self.db) dataProvider.createSchema() dataProvider.initializeUser(username, self.initialCash) for day in days: fromDate = day - timedelta(days=self.maxLen) toDate = day + timedelta(days=5) feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen) feed.positionFeed(day) broker = PytradeBroker(feed, cash=dataProvider.loadCash(username), orders=dataProvider.loadOrders(username), shares=dataProvider.loadShares(username)) self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor) dataProvider.persistCash(username, broker.getAvailableCash()) dataProvider.persistShares(username, broker.getAllShares()) dataProvider.persistOrders(username, broker.getAllActiveOrders()) self.assertEqual(broker.getEquity(), 36922.16)
def setUpClass(cls): rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \ row["Volume"] == "-" instruments = ["PETR4", "PETR3"] googleFeed = googlefinance.build_feed(instruments, 2015, 2015, storage="./googlefinance", skipErrors=True, rowFilter=rowFilter) cls.dynamicFeed = DynamicFeed("./sqlitedb", instruments, maxLen=10) cls.dynamicFeed.getDatabase().addBarsFromFeed(googleFeed)
def initializeFeed(self): assert self.__dbFilePath is not None assert self.__currentDate is not None assert self.__maxLen is not None fromDate = self.__currentDate - timedelta(days=self.__maxLen) toDate = self.__currentDate + timedelta(days=5) self.__feed = DynamicFeed(self.__dbFilePath, self.__codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.__maxLen) self.__feed.positionFeed(dt.as_utc(self.__currentDate))
def testApiDonchianAlgorithmWithSpecificDatesAndSQLiteDataProvider(self): utc = pytz.utc specificdays = [ utc.localize(datetime.datetime(2014, 2, 7)), utc.localize(datetime.datetime(2014, 2, 11)), utc.localize(datetime.datetime(2014, 9, 18)), utc.localize(datetime.datetime(2014, 10, 23)), utc.localize(datetime.datetime(2014, 10, 28)), utc.localize(datetime.datetime(2014, 12, 29))] feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen) alldays = feed.getAllDays() api = PytradeApi(dbfilepah=self.db) api.reinitializeUser(username=self.username, cash=self.initialCash) tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, self.donchianEntry, self.donchianExit, self.riskFactor) for day in specificdays: api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False) api.executeAnalysis() api.persistData() index = alldays.index(day) day = alldays[index+1] api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False) for order in api.getActiveMarketOrders() + api.getStopOrdersToConfirm(): bar = api.getCurrentBarForInstrument(order.getInstrument()) if bar is None: continue if not api.confirmOrder(order, bar.getDateTime(), order.getQuantity(), bar.getOpen(), 10): api.cancelOrder(order) api.persistData() self.assertEqual(api.getEquity(), 36922.16)
backtest.run() backtest.generateHtmlReport('/tmp/stock_analysis.html') ############################################################################################################################ # rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \ # row["Volume"] == "-" # instruments = ["PETR4", "PETR3"] # googleFeed = googlefinance.build_feed(codes, 2014, 2014, storage="./googlefinance", skipErrors=True, # rowFilter=rowFilter) db = "./sqliteddb" # feed = DynamicFeed (db, codes, maxLen=10) # feed.getDatabase().addBarsFromFeed(googleFeed) ################################################################################################ maxLen=int(26*1.4) feed = DynamicFeed(db, codes, maxLen=maxLen) days = feed.getAllDays() username="******" api = pytradeapi.PytradeApi(dbfilepah=db) api.reinitializeUser(username=username, cash=10000) tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05) # utc = pytz.utc # days = [ # utc.localize(datetime.datetime(2014, 2, 7)), # utc.localize(datetime.datetime(2014, 2, 11))] for i in range(len(days)): day = days[i]
# #dbFeed.reset() with this, maybe I don't need to use DB # # for instrument in dbFeed.getRegisteredInstruments(): # series = dbFeed.getDataSeries(instrument) # print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)]) import pytz, datetime from pyalgotrade.tools import googlefinance from pytrade.feed import DynamicFeed rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row[ "High"] == "-" or row["Low"] == "-" or row["Volume"] == "-" instruments = ["PETR4", "PETR3"] # googleFeed = googlefinance.build_feed(instruments, 2015, 2015, storage="./googlefinance", skipErrors=True, rowFilter=rowFilter) dynamicFeed = DynamicFeed("./sqlitedb", instruments, maxLen=10) dynamicFeed.positionFeed(datetime.datetime(2015, 1, 2, tzinfo=pytz.UTC)) print dynamicFeed.getCurrentDateTime() for instrument in dynamicFeed.getRegisteredInstruments(): series = dynamicFeed.getDataSeries(instrument) print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)]) #2015-01-01 #datetime: None #PETR4: #close value: #close series [] #PETR3 # close value