class HistData(object): ''' a class for working with yahoo finance data ''' def __init__(self, autoAdjust=True): self.startDate = (2008,1,1) self.autoAdjust=autoAdjust self.wp = Panel() def load(self,dataFile): """load data from HDF""" if os.path.exists(dataFile): store = HDFStore(dataFile) symbols = [str(s).strip('/') for s in list(store.keys()) ] data = dict(list(zip(symbols,[store[symbol] for symbol in symbols]))) self.wp = Panel(data) store.close() else: raise IOError('Data file does not exist') def save(self,dataFile): """ save data to HDF""" print(('Saving data to', dataFile)) store = HDFStore(dataFile) for symbol in self.wp.items: store[symbol] = self.wp[symbol] store.close() def downloadData(self,symbols='all'): ''' get data from yahoo ''' if symbols == 'all': symbols = self.symbols #store = HDFStore(self.dataFile) p = ProgressBar(len(symbols)) for idx,symbol in enumerate(symbols): try: df = getSymbolData(symbol,sDate=self.startDate,verbose=False) if self.autoAdjust: df = _adjust(df,removeOrig=True) if len(self.symbols)==0: self.wp = Panel({symbol:df}) else: self.wp[symbol] = df except Exception as e: print(e) p.animate(idx+1) def getDataFrame(self,field='close'): ''' return a slice on wide panel for a given field ''' return self.wp.minor_xs(field) @property def symbols(self): return self.wp.items.tolist() def __repr__(self): return str(self.wp)
class Market(object): ''' System object holds several data frames containing market information for each stock it comprises. ''' def __init__(self, tickers, start_date, end_date): ''' Constructor ''' self.start = start_date self.end = end_date self.downloader = Data.Handler( "/home/mark/Data/MarketData/Stocks/Python/") self.instruments = Panel( {ticker: DataFrame(None) for ticker in sorted(tickers)}) @property def tickers(self): return list(self.instruments.items) def __setitem__(self, key, val): instruments = dict(self.instruments) instruments[key] = val self.instruments = Panel.from_dict(instruments) def __getitem__(self, key): return self.instruments[key] @property def open(self): return self.get_series("Open") @property def high(self): return self.get_series("High") @property def low(self): return self.get_series("Low") @property def close(self): return self.get_series("Close") @property def volume(self): return self.get_series("Volume") def get_series(self, name): return self.instruments.minor_xs(name) @property def status(self): download_status = {} for ticker in self.tickers: download_status[ticker] = False if len(self[ticker]) is 0 else True return download_status def download_data(self): for ticker in self.tickers: self[ticker] = self.downloader.get(ticker + ".AX", self.start, self.end) def returns(self, indexer): returns = indexer.market_returns(self) return AverageReturns(returns)
class Market(object): ''' System object holds several data frames containing market information for each stock it comprises. ''' def __init__(self, tickers, start_date, end_date): ''' Constructor ''' self.start = start_date self.end = end_date self.downloader = Data.Handler("/home/mark/Data/MarketData/Stocks/Python/") self.instruments = Panel({ticker:DataFrame(None) for ticker in sorted(tickers)}) @property def tickers(self): return list(self.instruments.items) def __setitem__(self, key, val): instruments = dict(self.instruments) instruments[key] = val self.instruments = Panel.from_dict(instruments) def __getitem__(self, key): return self.instruments[key] @property def open(self): return self.get_series("Open") @property def high(self): return self.get_series("High") @property def low(self): return self.get_series("Low") @property def close(self): return self.get_series("Close") @property def volume(self): return self.get_series("Volume") def get_series(self, name): return self.instruments.minor_xs(name) @property def status(self): download_status = {} for ticker in self.tickers: download_status[ticker] = False if len(self[ticker]) is 0 else True return download_status def download_data(self): for ticker in self.tickers: self[ticker] = self.downloader.get(ticker + ".AX", self.start, self.end) def returns(self, indexer): returns = indexer.market_returns(self) return AverageReturns(returns)