def main(): # Load the orders file. ordersFile = OrdersFile("./OrderFiles/orders.csv") print "First date", ordersFile.getFirstDate() print "Last date", ordersFile.getLastDate() print "Symbols", ordersFile.getInstruments() qsPath = "/Users/LunaFire/Anaconda/lib/python2.7/site-packages/QSTK" feed = yahoofeed.Feed() feed.setBarFilter(csvfeed.DateRangeFilter(ordersFile.getFirstDate(), ordersFile.getLastDate())) feed.setDailyBarTime(datetime.time(0, 0, 0)) # This is to match the dates loaded with the ones in the orders file. for symbol in ordersFile.getInstruments(): feed.addBarsFromCSV(symbol, os.path.join(qsPath, "QSData", "Yahoo", symbol + ".csv")) # Run the strategy. cash = 1000000 useAdjustedClose = True myStrategy = MyStrategy(feed, cash, ordersFile, useAdjustedClose) # Attach returns and sharpe ratio analyzers. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) myStrategy.run() # Print the results. print "Final portfolio value: $%.2f" % myStrategy.getResult() print "Anual return: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100) print "Average daily return: %.2f %%" % (stats.mean(retAnalyzer.getReturns()) * 100) print "Std. dev. daily return: %.4f" % (stats.stddev(retAnalyzer.getReturns())) print "Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0))
def backtest(strategyClass, is_optimization, is_tick, start_date, end_date, symbol, frequency, position_size, lb, i): if is_tick: feed = bitbf.CSVTradeFeed() feed.addBarsFromCSV("../xbtusd_trades.csv", 'XBTUSD', fromDateTime=start_date, toDateTime=end_date) else: feed = GenericBarFeed(bar.Frequency.MINUTE, maxLen=10000) feed.setColumnName('datetime', 'Date') feed.setDateTimeFormat('%Y-%m-%dT%H:%M:%S.%fZ') feed.setBarFilter(csvfeed.DateRangeFilter(start_date, end_date)) feed.addBarsFromCSV("XBTUSD", "../BITMEX_SPOT_BTC_USD_1MIN.csv") if is_optimization: strat = local.run(strategyClass, feed, parameters_generator(), workerCount=None, logLevel=10, batchSize=1) print(strat.getResult(), strat.getParameters()) else: strat = strategyClass(feed, None, symbol, int(frequency), position_size, lb, i) strat.run()
def testOneBarReturn(self): initialCash = 1000 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 0o7), datetime.datetime(2001, 12, 0o7))) barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.TestStrategy(barFeed, initialCash) # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56 # Manually place the orders to get them filled on the first (and only) bar. order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1, False) # Open: 15.74 strat.getBroker().submitOrder(order) order = strat.getBroker().createMarketOrder( broker.Order.Action.SELL, AnalyzerTestCase.TestInstrument, 1, True) # Close: 15.91 strat.getBroker().submitOrder(order) stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getCash() == initialCash + (15.91 - 15.74)) finalValue = 1000 - 15.74 + 15.91 rets = (finalValue - initialCash) / float(initialCash) self.assertEqual(stratAnalyzer.getReturns()[-1], rets)
def testTwoBarReturns_CloseClose(self): initialCash = 15.90 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 0o6), datetime.datetime(2001, 12, 0o7))) barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.TestStrategy(barFeed, initialCash) # 2001-12-06,15.61,16.03,15.50,15.90,66944900,15.55 # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56 # Manually place the entry order, to get it filled on the first bar. order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1, True) # Close: 15.90 strat.getBroker().submitOrder(order) strat.addOrder(datetime.datetime(2001, 12, 0o6), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, AnalyzerTestCase.TestInstrument, 1, True) # Close: 15.91 stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getCash() == initialCash + (15.91 - 15.90)) # First day returns: 0 self.assertTrue(stratAnalyzer.getReturns()[0] == 0) # Second day returns: Open vs Prev. day's close self.assertTrue(stratAnalyzer.getReturns()[1] == (15.91 - 15.90) / 15.90)
def addBarsFromCSV(self, instrument, path, timezone=None, fromDateTime=None, toDateTime=None): if timezone is None: timezone = self.__timezone rowParser = PoloniexCSVRowParser(self.__columnNames, self.__dateTimeFormat, self.getDailyBarTime(), self.getFrequency(), timezone) #startTimestamp = calendar.timegm(startDateTime.utctimetuple()) if startDateTime else None #endTimestamp = calendar.timegm(endDateTime.utctimetuple()) if endDateTime else None # Save the barfilter to restore it later. prevBarFilter = self.getBarFilter() try: if fromDateTime or toDateTime: self.setBarFilter( csvfeed.DateRangeFilter(to_utc_if_naive(fromDateTime), to_utc_if_naive(toDateTime))) super(CSVTradeFeed, self).addBarsFromCSV(instrument, path, rowParser) finally: self.setBarFilter(prevBarFilter) assert not rowParser.barsHaveAdjClose()
def testTwoBarReturns_OpenClose(self): initialCash = 15.61 barFeed = yahoofeed.Feed() barFeed.setBarFilter(csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 6), datetime.datetime(2001, 12, 7))) barFeed.addBarsFromCSV( INSTRUMENT, common.get_data_file_path("orcl-2001-yahoofinance.csv") ) strat = strategy_test.TestStrategy(barFeed, {PRICE_CURRENCY: initialCash}) # 2001-12-06,15.61,16.03,15.50,15.90,66944900,15.55 # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56 # Manually place the entry order, to get it filled on the first bar. order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, INSTRUMENT, 1, False ) # Open: 15.61 strat.getBroker().submitOrder(order) strat.addOrder( datetime.datetime(2001, 12, 6), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, INSTRUMENT, 1, True ) # Close: 15.91 stratAnalyzer = returns.Returns(PRICE_CURRENCY) strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getBalance(PRICE_CURRENCY) == initialCash + (15.91 - 15.61)) # First day returns: Open vs Close self.assertTrue(stratAnalyzer.getReturns()[0] == (15.90 - 15.61) / 15.61) # Second day returns: Close vs Prev. day's close self.assertTrue(stratAnalyzer.getReturns()[1] == (15.91 - 15.90) / 15.90)
def main(): # Load the orders file. ordersFile = OrdersFile("orders.csv") print "First date", ordersFile.getFirstDate() print "Last date", ordersFile.getLastDate() print "Symbols", ordersFile.getInstruments() # Load the data from QSTK storage. QS environment variable has to be defined. if os.getenv("QS") == None: raise Exception("QS environment variable not defined") feed = yahoofeed.Feed() feed.setBarFilter(csvfeed.DateRangeFilter(ordersFile.getFirstDate(), ordersFile.getLastDate())) feed.setDailyBarTime(datetime.time(0, 0, 0)) # This is to match the dates loaded with the ones in the orders file. for symbol in ordersFile.getInstruments(): feed.addBarsFromCSV(symbol, os.path.join(os.getenv("QS"), "QSData", "Yahoo", symbol + ".csv")) # Run the strategy. cash = 1000000 useAdjustedClose = True myStrategy = MyStrategy(feed, cash, ordersFile, useAdjustedClose) # Attach returns and sharpe ratio analyzers. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) myStrategy.run() # Print the results. print "Final portfolio value: $%.2f" % myStrategy.getResult() print "Anual return: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100) print "Average daily return: %.2f %%" % (stats.mean(retAnalyzer.getReturns()) * 100) print "Std. dev. daily return: %.4f" % (stats.stddev(retAnalyzer.getReturns())) print "Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0, 252))
def load_intraday_bars(): global feed print "Loading bars from file" feed = ninjatraderfeed.Feed(bar.Frequency.MINUTE) # feed.setBarFilter(csvfeed.DateRangeFilter(dt.as_utc(datetime.datetime(2008, 1, 1)), dt.as_utc(datetime.datetime(2008, 12, 31)))) feed.setBarFilter(csvfeed.DateRangeFilter(dt.as_utc(datetime.datetime(2008, 1, 1)), dt.as_utc(datetime.datetime(2008, 3, 31)))) feed.addBarsFromCSV(instrument, "/Users/gabo/Downloads/etf-quotes/SPY.Last.txt")
def __testFilteredRangeImpl(self, fromDate, toDate): barFeed = yahoofeed.Feed() barFeed.setBarFilter(csvfeed.DateRangeFilter(fromDate, toDate)) barFeed.addBarsFromCSV(INSTRUMENT, common.get_data_file_path("orcl-2000-yahoofinance.csv")) barFeed.addBarsFromCSV(INSTRUMENT, common.get_data_file_path("orcl-2001-yahoofinance.csv")) # Dispatch and handle events. handler = BarFeedEventHandler_TestFilterRange(self, INSTRUMENT, fromDate, toDate) barFeed.getNewValuesEvent().subscribe(handler.onBars) while not barFeed.eof(): barFeed.dispatch() self.assertTrue(handler.getEventCount() > 0)
def __testFilteredRangeImpl(self, fromDate, toDate): barFeed = csvfeed.YahooFeed() barFeed.setBarFilter(csvfeed.DateRangeFilter(fromDate, toDate)) barFeed.addBarsFromCSV(YahooTestCase.TestInstrument, common.get_data_file_path("orcl-2000-yahoofinance.csv")) barFeed.addBarsFromCSV(YahooTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) # Dispatch and handle events. handler = BarFeedEventHandler_TestFilterRange(self, YahooTestCase.TestInstrument, fromDate, toDate) barFeed.getNewBarsEvent().subscribe(handler.onBars) while not barFeed.stopDispatching(): barFeed.dispatch() self.assertTrue(handler.getEventCount() > 0)
def __testFilteredRangeImpl(self, fromDate, toDate): barFeed = ibfeed.CSVFeed() barFeed.setBarFilter(csvfeed.DateRangeFilter(fromDate, toDate)) barFeed.addBarsFromCSV(IBTestCase.TestInstrument, common.get_data_file_path("ib-spy-5min-20120627.csv")) barFeed.addBarsFromCSV(IBTestCase.TestInstrument, common.get_data_file_path("ib-spy-5min-20120628.csv")) barFeed.addBarsFromCSV(IBTestCase.TestInstrument, common.get_data_file_path("ib-spy-5min-20120629.csv")) # Dispatch and handle events. handler = BarFeedEventHandler_TestFilterRange(self, IBTestCase.TestInstrument, fromDate, toDate) barFeed.getNewBarsEvent().subscribe(handler.onBars) while not barFeed.stopDispatching(): barFeed.dispatch() self.assertTrue(handler.getEventCount() > 0)
def addBarsFromCSV(self, path, instrument="BTC/USD", timezone=None, fromDateTime=None, toDateTime=None): """Loads bars from a trades CSV formatted file. :param path: The path to the file. :type path: string. :param instrument: The instrument identifier. :type instrument: A :class:`pyalgotrade.instrument.Instrument` or a string formatted like QUOTE_SYMBOL/PRICE_CURRENCY. :param timezone: An optional timezone to use to localize bars. By default bars are loaded in UTC. :type timezone: A pytz timezone. :param fromDateTime: An optional datetime to use to filter bars to load. If supplied only those bars whose datetime is greater than or equal to fromDateTime are loaded. :type fromDateTime: datetime.datetime. :param toDateTime: An optional datetime to use to filter bars to load. If supplied only those bars whose datetime is lower than or equal to toDateTime are loaded. :type toDateTime: datetime.datetime. .. note:: * Every file that you load bars from must have trades in the same currency. * If fromDateTime or toDateTime are naive, they are treated as UTC. """ if timezone is None: timezone = self.__timezone instrument = build_instrument(instrument) rowParser = RowParser(instrument, self.__unixTimeFix, timezone) # Save the barfilter to restore it later. prevBarFilter = self.getBarFilter() try: if fromDateTime or toDateTime: self.setBarFilter( csvfeed.DateRangeFilter(to_utc_if_naive(fromDateTime), to_utc_if_naive(toDateTime))) super(CSVTradeFeed, self).addBarsFromCSV(path, rowParser) finally: self.setBarFilter(prevBarFilter)
def main(plot): feed = alphavantagefeed.Feed() start_date = datetime.datetime(2012, 1, 1) end_date = datetime.datetime(2015, 12, 31) data_filter = csvfeed.DateRangeFilter(fromDate=start_date, toDate=end_date) feed.setBarFilter(data_filter) feed.addBarsFromCSV("AAPL", "./data/daily_adjusted_AAPL.csv") feed.addBarsFromCSV("MSFT", "./data/daily_adjusted_MSFT.csv") feed.addBarsFromCSV("SPY", "./data/daily_adjusted_SPY.csv") market = "SPY" predicate = BuyOnEvent(feed, market) event_study = eventstudy.EventStudy(predicate, 20, 20) event_study.run(feed, False) results = event_study.getResults() print(results) print("%d events found" % (results.getEventCount())) if plot: eventstudy.plot_to_file(results, 'eventstudyAV.pdf')