Example #1
0
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()
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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()
Example #6
0
    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)
Example #7
0
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")
Example #9
0
    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)
Example #10
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)
Example #11
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)
Example #12
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)
Example #13
0
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')