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 get_benchmark(self, benchmark_ticker='^GSPC'): self.min_date = self.data.index.min() self.max_date = min(self.data.index.max(), datetime.datetime.now()) 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', uselogs=True) self.benchmark = _benchmark
def add_security(self, ticker): if ticker in self.securities_archive: self.securities[ticker] = self.securities_archive[ticker] self.tickers.append(ticker) else: _security = Security(ticker) self.securities[_security.ticker] = _security self.tickers.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 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.")
def add_security_archive(self, ticker): _security = Security(ticker) self.securities_archive[_security.ticker] = _security self.tickers_archive.append(ticker)
def add_security(self, ticker): _security = Security(ticker) self.securities[_security.ticker] = _security self.tickers.append(ticker)