def get_benchmark(self, benchmark_ticker="^GSPC"): if benchmark_ticker == "sp500" or benchmark_ticker == "^GSPC": _ticker = "^GSPC" else: _ticker = "^GSPC" # S&P 500 as default # create security class object for benchmark ticker _benchmark = Security(_ticker, start=self.min_date, end=self.max_date) # calculate returns for the benchmark _benchmark.data, _ = returns_column(df=_benchmark.data, column="Close") self.benchmark = _benchmark
def add_security_archive(self, ticker, min_date="2000-01-01"): if ticker in self.securities: self.securities_archive[ticker] = self.securities[ticker] self.tickers_archive.append(ticker) else: _security = Security(ticker, start=min_date, end=self.date) self.securities_archive[_security.ticker] = _security self.tickers_archive.append(ticker) self.prices[ticker] = deque() self.prices_lifo[ticker] = deque() self.prices_fifo[ticker] = deque()
def positions(self): # you have to have one security in the portfolio for meaningful output if len(self.securities) > 0: # sum up by ticker _df = self.transactions.loc[self.transactions.Transaction.isin( ("buy", "sell")), :].copy() _df.loc[_df.Transaction == "sell", "Quantity"] = _df.loc[_df.Transaction == "sell", "Quantity"].apply(lambda x: -x) _df.loc[_df.Transaction == "sell", "TradeValue"] = _df.loc[_df.Transaction == "sell", "TradeValue"].apply(lambda x: -x) self.positions_df = _df.groupby(by=["Ticker"])["Quantity", "TradeValue"].sum() # sum up purchases self.positions_df["Bought"] = ( _df.loc[_df.Transaction == "buy", :].groupby( by=["Ticker"])["Quantity"].sum()) self.positions_df["Invested"] = ( _df.loc[_df.Transaction == "buy", :].groupby( by=["Ticker"])["TradeValue"].sum()) # sum up sales self.positions_df["Sold"] = ( _df.loc[_df.Transaction == "sell", :].groupby( by=["Ticker"])["Quantity"].sum()) self.positions_df["Devested"] = ( _df.loc[_df.Transaction == "sell", :].groupby( by=["Ticker"])["TradeValue"].sum()) # check if sum over volume of a security is < 0 for index, row in self.positions_df.iterrows(): if row["Quantity"] < 0.0: print("Negative volume encountered: {0:5}\t{1}".format( index, row["Quantity"])) # join in last price and names of securities for ticker in set(self.positions_df.index): if ticker in self.tickers: self.positions_df.loc[self.positions_df.index == ticker, "LastPrice"] = self.securities[ ticker].get_last_price() self.positions_df.loc[ self.positions_df.index == ticker, "Description"] = self.securities[ticker].name elif ticker in self.tickers_archive: self.positions_df.loc[ self.positions_df.index == ticker, "LastPrice"] = self.securities_archive[ ticker].get_last_price() self.positions_df.loc[ self.positions_df.index == ticker, "Description"] = self.securities_archive[ticker].name else: _security = Security(ticker) self.positions_df.loc[ self.positions_df.index == ticker, "LastPrice"] = _security.get_last_price() self.positions_df.loc[self.positions_df.index == ticker, "Description"] = _security.name self.positions_df["CurrentValue"] = ( self.positions_df["LastPrice"] * self.positions_df["Quantity"]) # sum up dividends by ticker self.positions_df["Dividends"] = self.dividends.groupby( by="Ticker")["Amount"].sum() # self.positions_df['AvgPrice'] = self.positions_df['TradeValue'] / (1.0*self.positions_df['Quantity']) self.positions_df.fillna(0.0, inplace=True) self.positions_df["Return"] = (self.positions_df["CurrentValue"] - self.positions_df["TradeValue"] + self.positions_df["Dividends"]) self.positions_df["PercentGrowth"] = ( 100.0 * self.positions_df["Return"] / self.positions_df["Invested"]) self.positions_df.PercentGrowth.replace([np.inf, -np.inf], np.nan, inplace=True) print(self.positions_df[[ "Quantity", "Bought", "Sold", "CurrentValue", "Invested", "Devested", "Dividends", "Return", "PercentGrowth", "Description", ]].sort_values(by=["CurrentValue", "Invested"], ascending=False)) else: print("No positions in portfolio.")