示例#1
0
def main():
    import coloredlogs
    coloredlogs.install(level='DEBUG',
                        fmt='[%(asctime)s] %(levelname)s %(message)s')

    # Load the yahoo feed from CSV files.
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("aeti", "./tests/data/aeti-2011-yahoofinance.csv")
    feed.addBarsFromCSV("egan", "./tests/data/egan-2011-yahoofinance.csv")
    feed.addBarsFromCSV("glng", "./tests/data/glng-2011-yahoofinance.csv")
    feed.addBarsFromCSV("simo", "./tests/data/simo-2011-yahoofinance.csv")

    # Evaluate the strategy with the feed's bars.
    myStrategy = MyStrategy(feed)

    # Attach returns and sharpe ratio analyzers.
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)

    # Run the strategy
    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)))
示例#2
0
    def testBounded(self):
        tmpFeed = TemporarySQLiteFeed(SQLiteFeedTestCase.dbName,
                                      bar.Frequency.DAY,
                                      maxLen=2)
        with tmpFeed:
            # Load bars using a Yahoo! feed.
            yahooFeed = yahoofeed.Feed(maxLen=1)
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2000-yahoofinance.csv"),
                marketsession.USEquities.timezone)
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2001-yahoofinance.csv"),
                marketsession.USEquities.timezone)

            # Fill the database using the bars from the Yahoo! feed.
            sqliteFeed = tmpFeed.getFeed()
            sqliteFeed.getDatabase().addBarsFromFeed(yahooFeed)

            # Load the SQLite feed and process all bars.
            sqliteFeed.loadBars("orcl")

            for bars in sqliteFeed:
                pass

            barDS = sqliteFeed["orcl"]
            self.assertEqual(len(barDS), 2)
            self.assertEqual(len(barDS.getDateTimes()), 2)
            self.assertEqual(len(barDS.getCloseDataSeries()), 2)
            self.assertEqual(len(barDS.getCloseDataSeries().getDateTimes()), 2)
            self.assertEqual(len(barDS.getOpenDataSeries()), 2)
            self.assertEqual(len(barDS.getHighDataSeries()), 2)
            self.assertEqual(len(barDS.getLowDataSeries()), 2)
            self.assertEqual(len(barDS.getAdjCloseDataSeries()), 2)
示例#3
0
    def loadDailyBarFeed(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            StrategyTestCase.TestInstrument,
            common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        return barFeed
示例#4
0
    def testCumulativeReturn(self):
        initialCash = 33.06
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = position_test.MyTestStrategy(barFeed,
                                             AnalyzerTestCase.TestInstrument,
                                             initialCash)

        strat.addPosEntry(datetime.datetime(2001, 1, 12), strat.enterLong,
                          AnalyzerTestCase.TestInstrument, 1)  # 33.06
        strat.addPosExitMarket(datetime.datetime(2001, 11, 27))  # 14.32

        stratAnalyzer = returns.Returns(maxLen=10)
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                initialCash + (14.32 - 33.06), 2))
        self.assertTrue(
            round(33.06 *
                  (1 + stratAnalyzer.getCumulativeReturns()[-1]), 2) == 14.32)
        self.assertEqual(len(stratAnalyzer.getCumulativeReturns()), 10)
        self.assertEqual(len(stratAnalyzer.getReturns()), 10)
示例#5
0
    def testFirstBar(self):
        initialCash = 1000
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.MyTestStrategy(barFeed, initialCash)
        strat.addOrder(datetime.datetime(2001, 1, 2),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       AnalyzerTestCase.TestInstrument, 1,
                       False)  # 2001-01-03 Open: 25.25 Close: 32.00

        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()

        self.assertEqual(stratAnalyzer.getReturns()[0], 0)
        self.assertEqual(stratAnalyzer.getReturns()[1], (32.00 - 25.25) / 1000)

        # Check date times.
        datetimes = barFeed[AnalyzerTestCase.TestInstrument].getDateTimes()

        for i in [0, -1]:
            self.assertEqual(stratAnalyzer.getReturns().getDateTimes()[i],
                             datetimes[i])
            self.assertEqual(
                stratAnalyzer.getCumulativeReturns().getDateTimes()[i],
                datetimes[i])
示例#6
0
    def testResampledBarFeed(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "spy", common.get_data_file_path("spy-2010-yahoofinance.csv"))
        barFeed.addBarsFromCSV(
            "nikkei",
            common.get_data_file_path("nikkei-2010-yahoofinance.csv"))
        resampledBarFeed = resampled_bf.ResampledBarFeed(
            barFeed, bar.Frequency.MONTH)

        disp = dispatcher.Dispatcher()
        disp.addSubject(barFeed)
        disp.addSubject(resampledBarFeed)
        disp.run()

        weeklySpyBarDS = resampledBarFeed["spy"]
        weeklyNikkeiBarDS = resampledBarFeed["nikkei"]

        # Check first bar
        self.assertEqual(weeklySpyBarDS[0].getDateTime().date(),
                         datetime.date(2010, 1, 1))
        self.assertEqual(weeklyNikkeiBarDS[0].getDateTime().date(),
                         datetime.date(2010, 1, 1))

        # Check last bar
        self.assertEqual(weeklySpyBarDS[-1].getDateTime().date(),
                         datetime.date(2010, 11, 1))
        self.assertEqual(weeklyNikkeiBarDS[-1].getDateTime().date(),
                         datetime.date(2010, 11, 1))
示例#7
0
    def testOneBarReturn(self):
        initialCash = 1000
        barFeed = yahoofeed.Feed()
        barFeed.setBarFilter(
            csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 7),
                                    datetime.datetime(2001, 12, 7)))
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.MyTestStrategy(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)
示例#8
0
    def testDownloadAndParseDaily(self):
        instrument = "orcl"
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            instrument,
            common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        strat = sma_crossover.SMACrossOver(barFeed, instrument, 20)

        plt = plotter.StrategyPlotter(strat, True, True, True)
        plt.getInstrumentSubplot(instrument).addDataSeries(
            "sma", strat.getSMA())

        strat.run()

        with common.TmpDir() as tmpPath:
            fig, subplots = plt.buildFigureAndSubplots()

            self.assertIsNotNone(fig)
            self.assertIsNotNone(subplots)

            # fig = plt.buildFigure()
            fig, _ = plt.buildFigureAndSubplots()
            fig.set_size_inches(10, 8)

            png = os.path.join(tmpPath, "plotter_test.png")
            fig.savefig(png)
示例#9
0
    def testIGE_BrokerWithCommission(self):
        commision = 0.5
        initialCash = 42.09 + commision
        # This testcase is based on an example from Ernie Chan's book:
        # 'Quantitative Trading: How to Build Your Own Algorithmic Trading Business'
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV("ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
        strat = strategy_test.MyTestStrategy(barFeed, initialCash)
        strat.getBroker().setCommission(backtesting.FixedPerTrade(commision))
        strat.setUseAdjustedValues(True)
        strat.setBrokerOrdersGTC(True)
        stratAnalyzer = sharpe.SharpeRatio()
        strat.attachAnalyzer(stratAnalyzer)

        # Disable volume checks to match book results.
        strat.getBroker().getFillStrategy().setVolumeLimit(None)

        # Manually place the order to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(broker.Order.Action.BUY, "ige", 1, True)  # Adj. Close: 42.09
        order.setGoodTillCanceled(True)
        strat.getBroker().submitOrder(order)
        strat.addOrder(datetime.datetime(2007, 11, 13), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, "ige", 1, True)  # Adj. Close: 127.64

        strat.run()
        self.assertTrue(round(strat.getBroker().getCash(), 2) == initialCash + (127.64 - 42.09 - commision*2))
        self.assertEqual(strat.orderUpdatedCalls, 6)
        # The results are slightly different only because I'm taking into account the first bar as well,
        # and I'm also adding commissions.
        self.assertEqual(round(stratAnalyzer.getSharpeRatio(0.04, True), 6), 0.776443)
 def __test(self, strategyClass, finalValue):
     feed = yahoofeed.Feed()
     feed.addBarsFromCSV("orcl", common.get_data_file_path("orcl-2001-yahoofinance.csv"))
     myStrategy = strategyClass(feed, 10, 25)
     myStrategy.run()
     myStrategy.printDebug("Final result:", round(myStrategy.getFinalValue(), 2))
     self.assertTrue(round(myStrategy.getFinalValue(), 2) == finalValue)
示例#11
0
    def testNoEvents(self):
        feed = yahoofeed.Feed()
        feed.addBarsFromCSV(
            "orcl", common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        predicate = Predicate([])
        eventProfiler = eventprofiler.Profiler(predicate, 5, 5)
        eventProfiler.run(feed, True)
        self.assertEqual(eventProfiler.getResults().getEventCount(), 0)
示例#12
0
    def testFailingStrategy(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "orcl", common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        res = local.run(FailingStrategy,
                        barFeed,
                        parameters_generator("orcl", 5, 100),
                        logLevel=logging.DEBUG)

        self.assertIsNone(res)
示例#13
0
    def testOneEvent(self):
        feed = yahoofeed.Feed()
        feed.addBarsFromCSV(
            "orcl", common.get_data_file_path("orcl-2000-yahoofinance.csv"))
        predicate = Predicate([datetime.date(2000, 1, 11)])
        eventProfiler = eventprofiler.Profiler(predicate, 5, 5)
        eventProfiler.run(feed, True)

        self.assertEqual(eventProfiler.getResults().getEventCount(), 1)
        self.assertEqual(eventProfiler.getResults().getValues(0)[0], 1.0)
        self.assertEqual(round(eventProfiler.getResults().getValues(5)[0], 5),
                         round(1.016745541, 5))
示例#14
0
    def testNoTrades(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV("ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
        strat = strategy_test.MyTestStrategy(barFeed, 1000)
        stratAnalyzer = sharpe.SharpeRatio()
        strat.attachAnalyzer(stratAnalyzer)

        strat.run()
        self.assertTrue(strat.getBroker().getCash() == 1000)
        self.assertTrue(stratAnalyzer.getSharpeRatio(0.04, True) == 0)
        self.assertTrue(stratAnalyzer.getSharpeRatio(0) == 0)
        self.assertTrue(stratAnalyzer.getSharpeRatio(0, True) == 0)
示例#15
0
    def testLocal(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "orcl", common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        res = local.run(SMACrossOver,
                        barFeed,
                        parameters_generator("orcl", 5, 100),
                        logLevel=logging.DEBUG)

        self.assertEqual(round(res.getResult(), 2), 1295462.6)
        self.assertEqual(res.getParameters()[1], 20)
示例#16
0
def main(plot):
    instruments = ["orcl", ]

    feed = yahoofeed.Feed()
    feed.addBarsFromCSV(instruments[0], "./tests/data/orcl-2000.csv")

    predicate = BuyOnGap(feed)
    eventProfiler = eventprofiler.Profiler(predicate, 5, 5)
    eventProfiler.run(feed, True)

    results = eventProfiler.getResults()
    print("%d events found" % (results.getEventCount()))

    if plot:
        eventprofiler.plot(results)
示例#17
0
def main():
    # Load the orders file.
    ordersFile = OrdersFile("./tests/data/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") is 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)))
    def testDifferentTimezones(self):
        # Market times in UTC:
        # - TSE: 0hs ~ 6hs
        # - US: 14:30hs ~ 21hs
        feed = yahoofeed.Feed()

        for year in [2010, 2011]:
            feed.addBarsFromCSV(
                "^n225",
                common.get_data_file_path("nikkei-%d-yahoofinance.csv" % year),
                marketsession.TSE.getTimezone())
            feed.addBarsFromCSV(
                "spy",
                common.get_data_file_path("spy-%d-yahoofinance.csv" % year),
                marketsession.USEquities.getTimezone())

        self.__testDifferentTimezonesImpl(feed)
示例#19
0
    def testNoTrades(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
        barFeed.addBarsFromCSV(
            "spy", common.get_data_file_path("sharpe-ratio-test-spy.csv"))
        strat = strategy_test.MyTestStrategy(barFeed, 1000)
        strat.setBrokerOrdersGTC(True)
        strat.setUseAdjustedValues(True)
        stratAnalyzer = drawdown.DrawDown()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()

        self.assertTrue(strat.getBroker().getCash() == 1000)
        self.assertEqual(strat.orderUpdatedCalls, 0)
        self.assertTrue(stratAnalyzer.getMaxDrawDown() == 0)
        self.assertTrue(
            stratAnalyzer.getLongestDrawDownDuration() == datetime.timedelta())
示例#20
0
    def testMultipleInstrumentsInterleaved(self):
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "spy", common.get_data_file_path("spy-2010-yahoofinance.csv"),
            marketsession.NYSE.getTimezone())
        barFeed.addBarsFromCSV(
            "nikkei",
            common.get_data_file_path("nikkei-2010-yahoofinance.csv"),
            marketsession.TSE.getTimezone())

        strat = strategy_test.MyTestStrategy(barFeed, 1000)
        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)

        strat.marketOrder("spy", 1)
        strat.run()

        # The cumulative return should be the same if we load nikkei or not.
        self.assertEqual(round(stratAnalyzer.getCumulativeReturns()[-1], 5),
                         0.01338)
示例#21
0
    def testGoogle2011(self):
        initialValue = 1000000
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("goog-2011-yahoofinance.csv"))

        strat = strategy_test.MyTestStrategy(barFeed, initialValue)
        order = strat.getBroker().createMarketOrder(
            broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1654,
            True)  # 2011-01-03 close: 604.35
        strat.getBroker().submitOrder(order)

        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        finalValue = strat.getBroker().getEquity()

        self.assertEqual(
            round(stratAnalyzer.getCumulativeReturns()[-1], 4),
            round((finalValue - initialValue) / float(initialValue), 4))
示例#22
0
    def testBaseFeedInterface(self):
        tmpFeed = TemporarySQLiteFeed(SQLiteFeedTestCase.dbName,
                                      bar.Frequency.DAY)
        with tmpFeed:
            # Load bars using a Yahoo! feed.
            yahooFeed = yahoofeed.Feed()
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2000-yahoofinance.csv"),
                marketsession.USEquities.timezone)
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2001-yahoofinance.csv"),
                marketsession.USEquities.timezone)

            # Fill the database using the bars from the Yahoo! feed.
            sqliteFeed = tmpFeed.getFeed()
            sqliteFeed.getDatabase().addBarsFromFeed(yahooFeed)

            # Load the SQLite feed and process all bars.
            sqliteFeed.loadBars("orcl")
            feed_test.tstBaseFeedInterface(self, sqliteFeed)
示例#23
0
    def testLoadDailyBars(self):
        tmpFeed = TemporarySQLiteFeed(SQLiteFeedTestCase.dbName,
                                      bar.Frequency.DAY)
        with tmpFeed:
            # Load bars using a Yahoo! feed.
            yahooFeed = yahoofeed.Feed()
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2000-yahoofinance.csv"),
                marketsession.USEquities.timezone)
            yahooFeed.addBarsFromCSV(
                "orcl",
                common.get_data_file_path("orcl-2001-yahoofinance.csv"),
                marketsession.USEquities.timezone)

            # Fill the database using the bars from the Yahoo! feed.
            sqliteFeed = tmpFeed.getFeed()
            sqliteFeed.getDatabase().addBarsFromFeed(yahooFeed)

            # Load the SQLite feed and process all bars.
            sqliteFeed.loadBars("orcl")
            for bars in sqliteFeed:
                pass

            # Check that both dataseries have the same bars.
            yahooDS = yahooFeed["orcl"]
            sqliteDS = sqliteFeed["orcl"]
            self.assertEqual(len(yahooDS), len(sqliteDS))

            for i in range(len(yahooDS)):
                self.assertEqual(yahooDS[i].getDateTime(),
                                 sqliteDS[i].getDateTime())
                self.assertEqual(yahooDS[i].getOpen(), sqliteDS[i].getOpen())
                self.assertEqual(yahooDS[i].getHigh(), sqliteDS[i].getHigh())
                self.assertEqual(yahooDS[i].getLow(), sqliteDS[i].getLow())
                self.assertEqual(yahooDS[i].getClose(), sqliteDS[i].getClose())
                self.assertEqual(yahooDS[i].getAdjClose(),
                                 sqliteDS[i].getAdjClose())
示例#24
0
    def testEventsOnBoundary(self):
        feed = yahoofeed.Feed()
        feed.addBarsFromCSV(
            "orcl", common.get_data_file_path("orcl-2000-yahoofinance.csv"))

        dates = []
        dates.append(datetime.date(2000, 1, 3))
        dates.append(datetime.date(2000, 1, 4))
        dates.append(datetime.date(2000, 1, 5))
        dates.append(datetime.date(2000, 1, 6))
        dates.append(datetime.date(2000, 1, 7))
        dates.append(datetime.date(2000, 1, 10))
        dates.append(datetime.date(2000, 12, 22))
        dates.append(datetime.date(2000, 12, 26))
        dates.append(datetime.date(2000, 12, 27))
        dates.append(datetime.date(2000, 12, 28))
        dates.append(datetime.date(2000, 12, 29))

        predicate = Predicate(dates)
        eventProfiler = eventprofiler.Profiler(predicate, 5, 5)
        eventProfiler.run(feed, True)

        self.assertEqual(eventProfiler.getResults().getEventCount(), 0)
示例#25
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(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.MyTestStrategy(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,
            False)  # Open: 15.61
        strat.getBroker().submitOrder(order)
        strat.addOrder(datetime.datetime(2001, 12, 6),
                       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.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)
示例#26
0
    def __testIGE_BrokerImpl(self, quantity):
        initialCash = 42.09 * quantity
        # This testcase is based on an example from Ernie Chan's book:
        # 'Quantitative Trading: How to Build Your Own Algorithmic Trading Business'
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
        strat = strategy_test.MyTestStrategy(barFeed, initialCash)
        strat.setUseAdjustedValues(True)
        strat.setBrokerOrdersGTC(True)
        stratAnalyzer = drawdown.DrawDown()
        strat.attachAnalyzer(stratAnalyzer)

        # Disable volume checks to match book results.
        strat.getBroker().getFillStrategy().setVolumeLimit(None)

        # Manually place the order to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(broker.Order.Action.BUY,
                                                    "ige", quantity,
                                                    True)  # Adj. Close: 42.09
        order.setGoodTillCanceled(True)
        strat.getBroker().submitOrder(order)
        strat.addOrder(datetime.datetime(2007, 11, 13),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, "ige", quantity,
                       True)  # Adj. Close: 127.64
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == initialCash +
            (127.64 - 42.09) * quantity)
        self.assertEqual(strat.orderUpdatedCalls, 6)
        self.assertTrue(round(stratAnalyzer.getMaxDrawDown(), 5) == 0.31178)
        self.assertTrue(
            stratAnalyzer.getLongestDrawDownDuration() == datetime.timedelta(
                days=623))
示例#27
0
 def __getFeed(self):
     # Load the feed and process all bars.
     barFeed = yahoofeed.Feed()
     barFeed.addBarsFromCSV(VWAPTestCase.Instrument, common.get_data_file_path("orcl-2001-yahoofinance.csv"))
     
     return barFeed
# from . import sma_crossover
from mooquant.analyzer import drawdown, returns, sharpe, trades
from mooquant.barfeed import yahoofeed

from samples import sma_crossover

if __name__ == '__main__':
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("orcl", "./tests/data/orcl-2000.csv")

    # Evaluate the strategy with the feed's bars.
    myStrategy = sma_crossover.SMACrossOver(feed, "orcl", 20)

    # Attach different analyzers to a strategy before executing it.
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

    # Run the strategy.
    myStrategy.run()

    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    print("Cumulative returns: %.2f %%" %
          (retAnalyzer.getCumulativeReturns()[-1] * 100))
    print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05)))
    print("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100))