def testSqlDam(self): dam = SqlDAM(echo=False) dam.setup({"db": 'sqlite:////tmp/sqldam.sqlite'}) dam.setSymbol("test") quotes = [ Quote(*[ '1320676200', '32.59', '32.59', '32.58', '32.58', '65213', None ]), Quote(*[ '1320676201', '32.60', '32.60', '32.59', '32.59', '65214', None ]) ] ticks = [ Tick(*['1320676200', '32.59', '32.59', '32.58', '32.58', '65213']), Tick(*['1320676201', '32.60', '32.60', '32.59', '32.59', '65214']) ] dam.writeQuotes(quotes) dam.writeTicks(ticks) dam.commit() print([ str(quotes) for symbol, quotes in dam.readBatchTupleQuotes( ["test"], 0, None).items() ]) print([str(quote) for quote in dam.readQuotes(0, None)]) print([str(tick) for tick in dam.readTicks(0, "1320676201")]) print([str(tick) for tick in dam.readTicks(0, "1320676202")])
def __rowResultToQuote(self, row): ''' convert rowResult from Hbase to Quote''' keyValues = row.columns for field in QUOTE_FIELDS: key = "%s:%s" % (HBaseDAM.QUOTE, field) if 'time' != field and keyValues[key].value: keyValues[key].value = float(keyValues[key].value) return Quote(*[keyValues["%s:%s" % (HBaseDAM.QUOTE, field)].value for field in QUOTE_FIELDS])
def testTotalValue(self): share = 10 price = 9.1 curPrice = 10.1 account = Account(1000, 1) account._Account__holdings = {'stock1': (share, price)} account.setLastTickDict({'stock1': Quote(0, 0, 0, 0, curPrice, 0, 0)}) totalValue = account.getTotalValue() self.assertAlmostEquals(1000 + share * curPrice, totalValue)
def testWriteExcel(self): writeDam = ExcelDAM() writeDam.setDir(self.targetPath) writeDam.setSymbol(self.symbol) for f in [ writeDam.targetPath(ExcelDAM.QUOTE), writeDam.targetPath(ExcelDAM.TICK) ]: if os.path.exists(f): os.remove(f) quote1 = Quote('1320676200', '32.58', '32.58', '32.57', '32.57', '65212', None) quote2 = Quote('1320676201', '32.59', '32.59', '32.58', '32.58', '65213', None) tick1 = Tick('1320676200', '32.58', '32.58', '32.57', '32.57', '65212') tick2 = Tick('1320676201', '32.59', '32.59', '32.58', '32.58', '65213') writeDam.writeQuotes([quote1, quote2]) writeDam.writeTicks([tick1, tick2])
def testLoadTicks_quote(self): time1 = datetime.now() time2 = datetime.now() quoteTime1Dam1 = Quote(time1, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0) quoteTime2Dam1 = Quote(time2, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0) quoteTime1Dam2 = Quote(time1, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0) quoteTime2Dam2 = Quote(time2, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0) dam1 = self.mock.CreateMock(BaseDAM) dam1.readQuotes(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( [quoteTime1Dam1, quoteTime2Dam1]) dam2 = self.mock.CreateMock(BaseDAM) dam2.readQuotes(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( [quoteTime1Dam2, quoteTime2Dam2]) tf = TickFeeder() tf.inputType = QUOTE appGlobal[TRADE_TYPE] = QUOTE tf._TickFeeder__source = {'s1': dam1, 's2': dam2} self.mock.ReplayAll() timeTicks = tf.loadTicks() self.mock.VerifyAll() self.assertEquals( { time1: { 's1': quoteTime1Dam1, 's2': quoteTime1Dam2 }, time2: { 's1': quoteTime2Dam1, 's2': quoteTime2Dam2 } }, timeTicks)
def getQuotes(self, symbol, start, end): """ Get historical prices for the given ticker symbol. Date format is 'YYYYMMDD' Returns a nested list. """ try: url = 'http://www.google.com/finance/historical?q=%s&startdate=%s&enddate=%s&output=csv' % ( symbol, start, end) try: page = self.__request(url) except UfException as ufExcep: ##if symol is not right, will get 400 if Errors.NETWORK_400_ERROR == ufExcep.getCode: raise UfException( Errors.STOCK_SYMBOL_ERROR, "Can find data for stock %s, symbol error?" % symbol) raise ufExcep days = page.readlines() values = [day.split(',') for day in days] # sample values:[['Date', 'Open', 'High', 'Low', 'Close', 'Volume'], \ # ['2009-12-31', '112.77', '112.80', '111.39', '111.44', '90637900']...] data = [] for value in values[1:]: date = convertGoogCSVDate(value[0]) try: data.append( Quote(date, value[1].strip(), value[2].strip(), value[3].strip(), value[4].strip(), value[5].strip(), None)) except Exception: LOG.warning( "Exception when processing %s at date %s for value %s" % (symbol, date, value)) #dateValues = sorted(data, key=itemgetter(0)) dateValues = sorted(data, key=lambda x: x.time) return dateValues except BaseException: raise UfException( Errors.UNKNOWN_ERROR, "Unknown Error in GoogleFinance.getHistoricalPrices %s" % traceback.format_exc())
def getQuotes(self, symbol, start, end): """ Get historical prices for the given ticker symbol. Date format is 'YYYY-MM-DD' Returns a nested list. """ try: start = str(start).replace('-', '') end = str(end).replace('-', '') url = 'http://ichart.yahoo.com/table.csv?s=%s&' % symbol + \ 'd=%s&' % str(int(end[4:6]) - 1) + \ 'e=%s&' % str(int(end[6:8])) + \ 'f=%s&' % str(int(end[0:4])) + \ 'g=d&' + \ 'a=%s&' % str(int(start[4:6]) - 1) + \ 'b=%s&' % str(int(start[6:8])) + \ 'c=%s&' % str(int(start[0:4])) + \ 'ignore=.csv' days = urllib.urlopen(url).readlines() values = [day[:-2].split(',') for day in days] # sample values:[['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos'], \ # ['2009-12-31', '112.77', '112.80', '111.39', '111.44', '90637900', '109.7']...] data = [] for value in values[1:]: data.append( Quote(value[0], value[1], value[2], value[3], value[4], value[5], value[6])) dateValues = sorted(data, key=lambda q: q.time) return dateValues except IOError: raise UfException(Errors.NETWORK_ERROR, "Can't connect to Yahoo server") except BaseException: raise UfException( Errors.UNKNOWN_ERROR, "Unknown Error in YahooFinance.getHistoricalPrices %s" % traceback.format_exc())
def readTicks(self, start, end): ''' read ticks ''' rows = self.__hbase.scanTable(self.tableName(HBaseDAM.TICK), [HBaseDAM.TICK], start, end) return [self.__rowResultToTick(row) for row in rows] def writeTicks(self, ticks): ''' read quotes ''' tName = self.tableName(HBaseDAM.TICK) if tName not in self.__hbase.getTableNames(): self.__hbase.createTable(tName, [ColumnDescriptor(name=HBaseDAM.TICK, maxVersions=5)]) for tick in ticks: self.__hbase.updateRow(self.tableName(HBaseDAM.TICK), tick.time, [Mutation(column = "%s:%s" % (HBaseDAM.TICK, field), value = getattr(tick, field) ) for field in TICK_FIELDS]) if __name__ == '__main__': dam = HBaseDAM() dam.setSymbol("test") quotes = [Quote(*['1320676200', '32.59', '32.59', '32.58', '32.58', '65213', None]), Quote(*['1320676201', '32.60', '32.60', '32.59', '32.59', '65214', None])] ticks = [Tick(*['1320676200', '32.59', '32.59', '32.58', '32.58', '65213']), Tick(*['1320676201', '32.60', '32.60', '32.59', '32.59', '65214'])] dam.writeQuotes(quotes) dam.writeTicks(ticks) print(dam.readQuotes("0", None)) print(dam.readTicks("0", "1320676201")) print(dam.readTicks("0", "1320676202"))
def readQuotes(self, start, end): ''' read quotes ''' quotes = self.__readData(self.targetPath(ExcelDAM.QUOTE), start, end) return [Quote(*quote) for quote in quotes]
def __sqlToQuote(self, row): ''' convert row result to Quote ''' return Quote(row.time, row.open, row.high, row.low, row.close, row.volume, row.adjClose)