Beispiel #1
0
    def testInvalidDateTimes(self):
        b1 = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, 5,
                          bar.Frequency.DAY)
        b2 = bar.BasicBar(datetime.datetime.now() + datetime.timedelta(days=1),
                          2, 3, 1, 2.1, 10, 5, bar.Frequency.DAY)

        with self.assertRaises(Exception):
            bar.Bars({"a": b1, "b": b2})
Beispiel #2
0
def main():
    bf = TestBarFeed(bar.Frequency.DAY)
    bars = [
        bar.BasicBar(datetime.datetime(2000, 1, 1), 10, 10, 10, 10, 10, 10,
                     bar.Frequency.DAY),
        bar.BasicBar(datetime.datetime(2000, 1, 2), 10, 10, 10, 10, 10, 10,
                     bar.Frequency.DAY),
    ]

    bf.addBarsFromSequence("orcl", bars)
    logger.getLogger().setLevel(logging.DEBUG)

    strat = BacktestingStrategy(bf, 1)
    strat.run()
Beispiel #3
0
def get_bar_list(df, frequency, date=None):
    bar_list = []

    end_time = df.ix[0].time
    if date is None:
        date = datetime.datetime.now()
    slice_start_time = to_market_datetime(
        datetime.datetime(date.year, date.month, date.day, 9, 30, 0))

    while slice_start_time.strftime("%H:%M:%S") < end_time:
        slice_end_time = slice_start_time + datetime.timedelta(
            seconds=frequency)

        ticks_slice = df.ix[(df.time < slice_end_time.strftime("%H:%M:%S")) &
                            (df.time >= slice_start_time.strftime("%H:%M:%S"))]

        if not ticks_slice.empty:
            open_ = ticks_slice.price.get_values()[-1]
            high = max(ticks_slice.price)
            low = min(ticks_slice.price)
            close = ticks_slice.price.get_values()[0]
            volume = sum(ticks_slice.volume)
            amount = sum(ticks_slice.amount)

            bar_list.append(
                bar.BasicBar(slice_start_time, open_, high, low, close, volume,
                             0, frequency, amount))
        else:
            bar_list.append(None)
        slice_start_time = slice_end_time

    return bar_list
Beispiel #4
0
    def testBaseBarFeedNoAdjClose(self):
        bars = [
            bar.Bars({
                "orcl":
                bar.BasicBar(datetime.datetime(2001, 1, 1), 1, 1, 1, 1, 1,
                             None, bar.Frequency.DAY)
            }),
            bar.Bars({
                "orcl":
                bar.BasicBar(datetime.datetime(2001, 1, 2), 1, 1, 1, 1, 1,
                             None, bar.Frequency.DAY)
            }),
        ]

        barFeed = barfeed.OptimizerBarFeed(bar.Frequency.DAY, ["orcl"], bars)
        check_base_barfeed(self, barFeed, False)
Beispiel #5
0
    def getBars(self, instrument, frequency, timezone=None, fromDateTime=None, toDateTime=None):
        instrument = normalize_instrument(instrument)

        sql = "SELECT bar.timestamp, bar.open, bar.high, bar.low, bar.close, bar.volume, bar.adj_close, bar.frequency" \
              " FROM bar JOIN instrument ON (bar.instrument_id = instrument.instrument_id)" \
              " WHERE instrument.name = ? AND bar.frequency = ?"

        args = [instrument, frequency]

        if fromDateTime is not None:
            sql += " AND bar.timestamp >= ?"
            args.append(dt.datetime_to_timestamp(fromDateTime))

        if toDateTime is not None:
            sql += " AND bar.timestamp <= ?"
            args.append(dt.datetime_to_timestamp(toDateTime))

        ret = []
        sql += " ORDER by bar.timestamp ASC"

        cursor = self.__connection.cursor()
        cursor.execute(sql, args)

        for row in cursor:
            dateTime = dt.timestamp_to_datetime(row[0])

            if timezone:
                dateTime = dt.localize(dateTime, timezone)

            ret.append(bar.BasicBar(dateTime, row[1], row[2], row[3], row[4], row[5], row[6], row[7]))

        cursor.close()

        return ret
Beispiel #6
0
    def testBasic(self):
        dt = datetime.datetime.now()
        b1 = bar.BasicBar(dt, 1, 1, 1, 1, 10, 1, bar.Frequency.DAY)
        b2 = bar.BasicBar(dt, 2, 2, 2, 2, 10, 2, bar.Frequency.DAY)

        bars = bar.Bars({"a": b1, "b": b2})

        self.assertEqual(bars["a"].getClose(), 1)
        self.assertEqual(bars["b"].getClose(), 2)
        self.assertTrue("a" in bars)

        self.assertEqual(list(bars.items()), [("a", b1), ("b", b2)])
        self.assertEqual(list(bars.keys()), ["a", "b"])
        self.assertEqual(bars.getInstruments(), ["a", "b"])
        self.assertEqual(bars.getDateTime(), dt)
        self.assertEqual(bars.getBar("a").getClose(), 1)
Beispiel #7
0
    def testGetPrice(self):
        b = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, 5,
                         bar.Frequency.DAY)
        self.assertEqual(b.getPrice(), b.getClose())

        b.setUseAdjustedValue(True)
        self.assertEqual(b.getPrice(), b.getAdjClose())
Beispiel #8
0
def build_bar(barDict, identifier, frequency):
    # "StartDate": "3/19/2014"
    # "StartTime": "9:55:00 AM"
    # "EndDate": "3/19/2014"
    # "EndTime": "10:00:00 AM"
    # "UTCOffset": 0
    # "Open": 31.71
    # "High": 31.71
    # "Low": 31.68
    # "Close": 31.69
    # "Volume": 2966
    # "Trades": 19
    # "TWAP": 31.6929
    # "VWAP": 31.693

    startDate = barDict["StartDate"]
    startTime = barDict["StartTime"]

    startDateTimeStr = startDate + " " + startTime
    startDateTime = datetime.datetime.strptime(startDateTimeStr,
                                               "%m/%d/%Y %I:%M:%S %p")

    instrument, exchange = api.parse_instrument_exchange(identifier)
    startDateTime = api.to_market_datetime(startDateTime, exchange)

    return bar.BasicBar(startDateTime, barDict["Open"], barDict["High"],
                        barDict["Low"], barDict["Close"], barDict["Volume"],
                        None, frequency)
Beispiel #9
0
    def testAppendInvalidDatetime(self):
        ds = bards.BarDataSeries()

        for i in range(10):
            now = datetime.datetime.now() + datetime.timedelta(seconds=i)
            ds.append(bar.BasicBar(now, 0, 0, 0, 0, 0, 0,
                                   bar.Frequency.SECOND))

            # Adding the same datetime twice should fail
            with self.assertRaises(Exception):
                ds.append(
                    bar.BasicBar(now, 0, 0, 0, 0, 0, 0, bar.Frequency.SECOND))

            # Adding a previous datetime should fail
            with self.assertRaises(Exception):
                ds.append(
                    bar.BasicBar(now - datetime.timedelta(seconds=i), 0, 0, 0,
                                 0, 0, 0, bar.Frequency.SECOND))
Beispiel #10
0
    def getGrouped(self):
        """Return the grouped value."""
        ret = bar.BasicBar(
            self.getDateTime(),
            self.__open, self.__high, self.__low, self.__close, self.__volume, self.__adjClose,
            self.__frequency
        )

        ret.setUseAdjustedValue(self.__useAdjValue)
        return ret
Beispiel #11
0
def main():
    bf = TestBarFeed(bar.Frequency.DAY)
    bars = [
        bar.BasicBar(datetime.datetime(2000, 1, 1), 10, 10, 10, 10, 10, 10,
                     bar.Frequency.DAY),
    ]
    bf.addBarsFromSequence("orcl", bars)

    strat = BacktestingStrategy(bf, 1000)
    strat.run()
Beispiel #12
0
    def parseBar(self, csvRowDict):
        dateTime = self.__parseDateTime(csvRowDict["Date Time"])
        close = float(csvRowDict["Close"])
        open_ = float(csvRowDict["Open"])
        high = float(csvRowDict["High"])
        low = float(csvRowDict["Low"])
        volume = float(csvRowDict["Volume"])

        return bar.BasicBar(dateTime, open_, high, low, close, volume, None,
                            self.__frequency)
Beispiel #13
0
    def testInvalidConstruction(self):
        with self.assertRaises(Exception):
            bar.BasicBar(datetime.datetime.now(), 2, 1, 1, 1, 1, 1,
                         bar.Frequency.DAY)

        with self.assertRaises(Exception):
            bar.BasicBar(datetime.datetime.now(), 1, 1, 1, 2, 1, 1,
                         bar.Frequency.DAY)

        with self.assertRaises(Exception):
            bar.BasicBar(datetime.datetime.now(), 1, 2, 1.5, 1, 1, 1,
                         bar.Frequency.DAY)

        with self.assertRaises(Exception):
            bar.BasicBar(datetime.datetime.now(), 2, 2, 1.5, 1, 1, 1,
                         bar.Frequency.DAY)

        with self.assertRaises(Exception):
            bar.BasicBar(datetime.datetime.now(), 1, 1, 1.5, 1, 1, 1,
                         bar.Frequency.DAY)
Beispiel #14
0
    def testDateTimesNotInOrder(self):
        bars = [
            bar.Bars({
                "orcl":
                bar.BasicBar(datetime.datetime(2001, 1, 2), 1, 1, 1, 1, 1, 1,
                             bar.Frequency.DAY)
            }),
            bar.Bars({
                "orcl":
                bar.BasicBar(datetime.datetime(2001, 1, 1), 1, 1, 1, 1, 1, 1,
                             bar.Frequency.DAY)
            }),
        ]

        f = barfeed.OptimizerBarFeed(bar.Frequency.DAY, ["orcl"], bars)

        with self.assertRaisesRegex(Exception,
                                    "Bar date times are not in order.*"):
            for dt, b in f:
                pass
Beispiel #15
0
    def testNonEmpty(self):
        ds = bards.BarDataSeries()

        for i in range(10):
            ds.append(
                bar.BasicBar(
                    datetime.datetime.now() + datetime.timedelta(seconds=i), 0,
                    0, 0, 0, 0, 0, bar.Frequency.SECOND))

        for i in range(0, 10):
            self.assertTrue(ds[i].getOpen() == 0)
Beispiel #16
0
    def __loadSarTestBarDs(self):
        seconds = 0

        ret = bards.BarDataSeries()

        for i in range(len(SAR_HIGH)):
            dateTime = datetime.datetime.now() + datetime.timedelta(seconds=seconds)
            ret.append(bar.BasicBar(dateTime, SAR_LOW[i], SAR_HIGH[i], SAR_LOW[i], SAR_HIGH[i], 0, SAR_LOW[i], bar.Frequency.DAY))
            seconds += 1
            
        return ret
Beispiel #17
0
    def __loadBarDS(self):
        seconds = 0

        ret = bards.BarDataSeries()
        
        for i in range(len(OPEN_VALUES)):
            dateTime = datetime.datetime.now() + datetime.timedelta(seconds=seconds)
            ret.append(bar.BasicBar(dateTime, OPEN_VALUES[i], HIGH_VALUES[i], LOW_VALUES[i], CLOSE_VALUES[i], VOLUME_VALUES[i], CLOSE_VALUES[i], bar.Frequency.DAY))
            seconds += 1

        return ret
Beispiel #18
0
    def testResample(self):
        barDs = bards.BarDataSeries()
        resampledDS = resampled_ds.ResampledDataSeries(
            barDs.getCloseDataSeries(), bar.Frequency.MINUTE, sum)
        resampledBarDS = resampled_ds.ResampledBarDataSeries(
            barDs, bar.Frequency.MINUTE)

        barDs.append(
            bar.BasicBar(datetime.datetime(2011, 1, 1, 1, 1, 1), 2.1, 3, 1, 2,
                         10, 1, bar.Frequency.SECOND))
        barDs.append(
            bar.BasicBar(datetime.datetime(2011, 1, 1, 1, 1, 2), 2, 3, 1, 2.3,
                         10, 2, bar.Frequency.SECOND))
        barDs.append(
            bar.BasicBar(datetime.datetime(2011, 1, 1, 1, 2, 1), 2, 3, 1, 2,
                         10, 2, bar.Frequency.SECOND))

        self.assertEqual(len(resampledBarDS), 1)
        self.assertEqual(resampledBarDS[0].getDateTime(),
                         datetime.datetime(2011, 1, 1, 1, 1))
        self.assertEqual(resampledBarDS[0].getOpen(), 2.1)
        self.assertEqual(resampledBarDS[0].getHigh(), 3)
        self.assertEqual(resampledBarDS[0].getLow(), 1)
        self.assertEqual(resampledBarDS[0].getClose(), 2.3)
        self.assertEqual(resampledBarDS[0].getVolume(), 20)
        self.assertEqual(resampledBarDS[0].getAdjClose(), 2)
        self.assertEqual(resampledDS[-1], 2 + 2.3)

        resampledBarDS.pushLast()
        self.assertEqual(len(resampledBarDS), 2)
        self.assertEqual(resampledBarDS[1].getDateTime(),
                         datetime.datetime(2011, 1, 1, 1, 2))
        self.assertEqual(resampledBarDS[1].getOpen(), 2)
        self.assertEqual(resampledBarDS[1].getHigh(), 3)
        self.assertEqual(resampledBarDS[1].getLow(), 1)
        self.assertEqual(resampledBarDS[1].getClose(), 2)
        self.assertEqual(resampledBarDS[1].getVolume(), 10)
        self.assertEqual(resampledBarDS[1].getAdjClose(), 2)

        resampledDS.pushLast()
        self.assertEqual(resampledDS[1], 2)
def build_bars_from_closing_prices(closingPrices):
    ret = []

    nextDateTime = datetime.datetime.now()

    for closePrice in closingPrices:
        bar_ = bar.BasicBar(nextDateTime, closePrice, closePrice, closePrice,
                            closePrice, closePrice, closePrice,
                            bar.Frequency.DAY)
        ret.append(bar_)
        nextDateTime = nextDateTime + datetime.timedelta(days=1)

    return ret
Beispiel #20
0
    def testDateTimes(self):
        ds = bards.BarDataSeries()
        firstDt = datetime.datetime.now()

        for i in range(10):
            ds.append(
                bar.BasicBar(firstDt + datetime.timedelta(seconds=i), 2, 4, 1,
                             3, 10, 3, bar.Frequency.SECOND))

        for i in range(10):
            self.assertEqual(ds[i].getDateTime(), ds.getDateTimes()[i])
            self.assertEqual(ds.getDateTimes()[i],
                             firstDt + datetime.timedelta(seconds=i))
Beispiel #21
0
def build_bar(dateTime, ds):
    prices = ds.getPriceDS()
    volumes = ds.getVolumeDS()
    amounts = ds.getAmountDS()

    open_ = float(prices[0])
    close = float(prices[-1])
    high = float(max(prices))
    low = float(min(prices))

    volume = sum(int(v) for v in volumes)
    amount = sum(float(a) for a in amounts)

    return bar.BasicBar(dateTime, open_, high, low, close, volume, None,
                        Frequency.DAY, amount)
Beispiel #22
0
    def parseBar(self, csvRowDict):
        dateTime = self.__parseDate(csvRowDict["Date"])
        close = float(csvRowDict["Close"])
        open_ = float(csvRowDict["Open"])
        high = float(csvRowDict["High"])
        low = float(csvRowDict["Low"])
        volume = float(csvRowDict["Volume"])
        adjClose = None

        if self.__sanitize:
            open_, high, low, close = common.sanitize_ohlc(
                open_, high, low, close)

        return bar.BasicBar(dateTime, open_, high, low, close, volume,
                            adjClose, self.__frequency)
Beispiel #23
0
    def testNestedDataSeries(self):
        ds = bards.BarDataSeries()

        for i in range(10):
            ds.append(
                bar.BasicBar(
                    datetime.datetime.now() + datetime.timedelta(seconds=i), 2,
                    4, 1, 3, 10, 3, bar.Frequency.SECOND))

        self.__testGetValue(ds.getOpenDataSeries(), 10, 2)
        self.__testGetValue(ds.getCloseDataSeries(), 10, 3)
        self.__testGetValue(ds.getHighDataSeries(), 10, 4)
        self.__testGetValue(ds.getLowDataSeries(), 10, 1)
        self.__testGetValue(ds.getVolumeDataSeries(), 10, 10)
        self.__testGetValue(ds.getAdjCloseDataSeries(), 10, 3)
        self.__testGetValue(ds.getPriceDataSeries(), 10, 3)
Beispiel #24
0
    def testSeqLikeOps(self):
        seq = []
        ds = bards.BarDataSeries()

        for i in range(10):
            bar_ = bar.BasicBar(
                datetime.datetime.now() + datetime.timedelta(seconds=i), 2, 4,
                1, 3, 10, 3, bar.Frequency.SECOND)
            ds.append(bar_)
            seq.append(bar_)

        self.assertEqual(ds[-1], seq[-1])
        self.assertEqual(ds[-2], seq[-2])
        self.assertEqual(ds[0], seq[0])
        self.assertEqual(ds[1], seq[1])
        self.assertEqual(ds[-2:][-1], seq[-2:][-1])
Beispiel #25
0
    def testNoAdjClose(self):
        b = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, None,
                         bar.Frequency.DAY)

        with self.assertRaises(Exception):
            b.setUseAdjustedValue(True)

        with self.assertRaises(Exception):
            b.getOpen(True)

        with self.assertRaises(Exception):
            b.getHigh(True)

        with self.assertRaises(Exception):
            b.getLow(True)

        with self.assertRaises(Exception):
            b.getClose(True)
Beispiel #26
0
    def testPickle(self):
        b1 = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, 5,
                          bar.Frequency.DAY)
        b2 = pickle.loads(pickle.dumps(b1))

        self.assertEqual(b1.getDateTime(), b2.getDateTime())
        self.assertEqual(b1.getOpen(), b2.getOpen())
        self.assertEqual(b1.getHigh(), b2.getHigh())
        self.assertEqual(b1.getLow(), b2.getLow())
        self.assertEqual(b1.getClose(), b2.getClose())
        self.assertEqual(b1.getVolume(), b2.getVolume())
        self.assertEqual(b1.getAdjClose(), b2.getAdjClose())
        self.assertEqual(b1.getFrequency(), b2.getFrequency())
        self.assertEqual(b1.getPrice(), b2.getPrice())
        self.assertEqual(b1.getOpen(True), b2.getOpen(True))
        self.assertEqual(b1.getHigh(True), b2.getHigh(True))
        self.assertEqual(b1.getLow(True), b2.getLow(True))
        self.assertEqual(b1.getClose(True), b2.getClose(True))
Beispiel #27
0
    def testStockChartsATRAdjusted(self):
        # Test data from http://stockcharts.com/help/doku.php?id=chart_school:technical_indicators:average_true_range_a
        high = [
            48.70, 48.72, 48.90, 48.87, 48.82, 49.05, 49.20, 49.35, 49.92,
            50.19, 50.12, 49.66, 49.88, 50.19, 50.36, 50.57, 50.65, 50.43,
            49.63, 50.33, 50.29, 50.17, 49.32, 48.50, 48.32, 46.80, 47.80,
            48.39, 48.66, 48.79
        ]
        low = [
            47.790, 48.140, 48.390, 48.370, 48.240, 48.635, 48.940, 48.860,
            49.500, 49.870, 49.200, 48.900, 49.430, 49.725, 49.260, 50.090,
            50.300, 49.210, 48.980, 49.610, 49.200, 49.430, 48.080, 47.640,
            41.550, 44.283, 47.310, 47.200, 47.900, 47.730
        ]
        close = [
            48.160, 48.610, 48.750, 48.630, 48.740, 49.030, 49.070, 49.320,
            49.910, 50.130, 49.530, 49.500, 49.750, 50.030, 50.310, 50.520,
            50.410, 49.340, 49.370, 50.230, 49.238, 49.930, 48.430, 48.180,
            46.570, 45.410, 47.770, 47.720, 48.620, 47.850
        ]
        expected = [
            None, None, None, None, None, None, None, None, None, None, None,
            None, None, 0.555000, 0.593929, 0.585791, 0.568949, 0.615452,
            0.617920, 0.642354, 0.674329, 0.692770, 0.775429, 0.781470,
            1.209229, 1.302620, 1.380290, 1.366698, 1.336219, 1.316482
        ]

        # Build a bar dataseries using the test data.
        barDataSeries = bards.BarDataSeries()
        atrDS = atr.ATR(barDataSeries, 14, True)
        now = datetime.datetime(2000, 1, 1)

        for i in range(len(high)):
            b = bar.BasicBar(now + datetime.timedelta(days=i), close[i],
                             high[i], low[i], close[i], 100, close[i] / 2,
                             bar.Frequency.DAY)
            barDataSeries.append(b)

            if expected[i] is None:
                self.assertEqual(atrDS[-1], None)
            else:
                self.assertEqual(common.safe_round(atrDS[-1], 2),
                                 round(expected[i] / 2, 2))
Beispiel #28
0
    def testCheckNow(self):
        barDs = bards.BarDataSeries()
        resampledBarDS = resampled_ds.ResampledBarDataSeries(
            barDs, bar.Frequency.MINUTE)

        barDateTime = datetime.datetime(2014, 7, 7, 22, 46, 28, 10000)
        barDs.append(
            bar.BasicBar(barDateTime, 2.1, 3, 1, 2, 10, 1,
                         bar.Frequency.MINUTE))
        self.assertEqual(len(resampledBarDS), 0)

        resampledBarDS.checkNow(barDateTime + datetime.timedelta(minutes=1))
        self.assertEqual(len(resampledBarDS), 1)
        self.assertEqual(barDs[0].getOpen(), resampledBarDS[0].getOpen())
        self.assertEqual(barDs[0].getHigh(), resampledBarDS[0].getHigh())
        self.assertEqual(barDs[0].getLow(), resampledBarDS[0].getLow())
        self.assertEqual(barDs[0].getClose(), resampledBarDS[0].getClose())
        self.assertEqual(barDs[0].getVolume(), resampledBarDS[0].getVolume())
        self.assertEqual(barDs[0].getAdjClose(),
                         resampledBarDS[0].getAdjClose())
        self.assertEqual(resampledBarDS[0].getDateTime(),
                         datetime.datetime(2014, 7, 7, 22, 46))
 def __buildBar(self, openPrice, highPrice, lowPrice, closePrice):
     dateTime = datetime.datetime.now() + datetime.timedelta(seconds=self.__currSeconds)
     self.__currSeconds += 1
     
     return bar.BasicBar(dateTime, openPrice, highPrice, lowPrice, closePrice, closePrice*10, closePrice, bar.Frequency.DAY)
Beispiel #30
0
 def testTypicalPrice(self):
     b = bar.BasicBar(datetime.datetime.now(), 2, 3, 1, 2.1, 10, 5,
                      bar.Frequency.DAY)
     self.assertEqual(b.getTypicalPrice(), (3 + 1 + 2.1) / 3)