def load(self, datadir="../data/", start=None, end=None): """ Tries to load from csv first, then pulls from Yahoo! """ filepath = "{0}{1}.csv".format(datadir, self.ticker) print("Checking {}".format(filepath)) if start is None: start = self.start else: start = standard_date_format(last_trading_day(start)) if end is None: end = self.end else: end = standard_date_format(last_trading_day(end)) if path.isfile(filepath): self.data = read_yahoo_csv(path=filepath) csv_start = standard_date_format(self.data.index.min()) csv_end = standard_date_format(self.data.index.max()) if (pd.to_datetime(csv_end) < pd.to_datetime(end)) | ( pd.to_datetime(csv_start) > pd.to_datetime(start) ): _refresh_success = self.refresh( datadir=datadir, start=min(start, csv_start), end=max(end, csv_end) ) else: _refresh_success = 1 if _refresh_success: self.data = read_yahoo_csv(path=filepath, startdate=start, enddate=end) else: self.data = retrieve_yahoo_data( ticker=self.ticker, startdate=start, enddate=end ) self.save(filename="{}.csv".format(self.ticker), datadir=datadir)
def load(self, datadir="../data/", start="2000-01-01", end="2100-01-01"): """ Tries to load from csv first, then pulls from Yahoo! """ start = standard_date_format(start) end = standard_date_format(end) filepath = "{0}{1}.csv".format(datadir, self.name) print("Checking {}".format(filepath)) if path.isfile(filepath): self.data = read_treasury_csv(path=filepath, startdate=start, enddate=end) csv_start = standard_date_format(self.data.index.min()) csv_end = standard_date_format(self.data.index.max()) if (csv_end < end) | (csv_start > start): _refresh_success = self.refresh( url=self.url, datadir=datadir, start=min(start, csv_start), end=max(end, csv_end), ) if _refresh_success: self.data = read_treasury_csv(path=filepath, startdate=start, enddate=end) else: self.data = retrieve_treasury_yield_curve_rates(url=self.url, startdate=start, enddate=end) self.save(filename="{}.csv".format(self.name), datadir=datadir)
def read_treasury_csv(path=None, startdate="2000-01-01", enddate=None): """ Read locally stored csv with data from US Deparment of the Treasury. """ if enddate == None: enddate = todays_date() # convert dates to pandas format startdate = standard_date_format(startdate) enddate = standard_date_format(enddate) _df = pd.read_csv(path, index_col="Date", parse_dates=True) return _df.loc[(_df.index >= startdate) & (_df.index <= enddate)]
def read_yahoo_csv(path=None, startdate="2000-01-01", enddate=None): """ Read locally stored csv with data from Yahoo! Finance for a security. """ if enddate == None: enddate = todays_date() # convert dates to pandas format startdate = standard_date_format(startdate) enddate = standard_date_format(enddate) df = pd.read_csv(path, index_col="Date", parse_dates=True) return df.loc[(df.index >= startdate) & (df.index <= enddate)]
def refresh(self, url, datadir="../data/", start="1900-01-01", end="2100-01-01"): """ Tries to load from csv first, then pulls from Yahoo! """ start = standard_date_format(start) end = standard_date_format(end) try: self.data = retrieve_treasury_yield_curve_rates(url=url, startdate=start, enddate=end) self.save(filename="{}.csv".format(self.name), datadir=datadir) return 1 except: print("Refresh failed") return 0
def __init__(self, name, start=None, end=None): super().__init__(name) if start is None: self.start = standard_date_format(last_trading_day("2000-01-01")) else: self.start = standard_date_format(last_trading_day(start)) if end is None: self.end = standard_date_format(last_trading_day(todays_date())) else: self.end = standard_date_format(last_trading_day(end)) self.ticker = name self.set_name(name) self.load(start=self.start, end=self.end) self.get_last_price() self.get_max_price() self.get_min_price() self.get_median_price() self.get_mean_price() self.get_std_price() self.dividends = 0.0 self.benchmark_ticker = "sp500" self.benchmark = None
def refresh(self, datadir="../data/", start=None, end=None): """ Tries to load from csv first, then pulls from Yahoo! """ if start is None: start = self.start else: start = standard_date_format(last_trading_day(start)) if end is None: end = self.end else: end = standard_date_format(last_trading_day(end)) try: self.data = retrieve_yahoo_data( ticker=self.ticker, startdate=start, enddate=end ) self.save(filename="{}.csv".format(self.ticker), datadir=datadir) return 1 except: print("Refresh failed") return 0
def retrieve_treasury_yield_curve_rates( url="https://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yieldAll", startdate="20000101", enddate=None, ): """ Download yield curve rates data from US Deparment of the Treasury. """ if enddate == None: enddate = todays_date() # convert dates to pandas format startdate = standard_date_format(startdate) enddate = standard_date_format(enddate) _headers = { "User-Agent": "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11" } # use request to retrieve data req = urllib.request.Request(url, headers=_headers) f = urllib.request.urlopen(req) html_data = f.read().decode("utf-8") soup = BeautifulSoup(html_data, "lxml") table = soup.find("table", {"class": "t-chart"}) _df = pd.read_html(str(table), header=0, index_col="Date", parse_dates=True)[0] return _df.loc[(_df.index >= startdate) & (_df.index <= enddate)]
def __init__(self, name): super().__init__(name) self.securities = {} self.securities_archive = {} self.tickers = [] self.tickers_archive = [] self.dividends = pd.DataFrame(columns=["Date", "Ticker", "Amount"]) self.payments = pd.DataFrame(columns=["Date", "In", "Out"]) self.wallet = pd.DataFrame(columns=["Date", "Change"]) self.total_portfolio_value = 0.0 self.total_security_value = 0.0 self.cash = 0.0 self.return_value = 0.0 self.return_rate = 0.0 self.prices = {} self.prices_fifo = {} self.prices_lifo = {} self.index = 0 self.benchmark_ticker = "sp500" self.benchmark = None self.transactions = pd.DataFrame(columns=[ "Date", "Transaction", "Ticker", "Currency", "Price", "Quantity" ]) self.date = standard_date_format(todays_date())
def get_cash(self, date="2100-01-01"): date = standard_date_format(date) return self.wallet.loc[(self.wallet.Date <= date), "Change"].sum()