Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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.")