In [2]:
import pandas as pd
from matplotlib.pyplot import show
from pandas.io.data import DataReader
from datetime import datetime, timedelta

In [3]:
%matplotlib inline

In [4]:
end = datetime.today()
start = end - timedelta(days=365)

# stock list
ticker = ['AAPL', 'AMZN', 'ATVI', 'BBBY', 'BRK.B', 'COST', 'DDD', 'DIS', 'DISCK', 'F', 'GLD', 'SBUX', 'SPY']
share = [635, 850, 12313, 1104, 840, 2115, 922, 2007, 1840, 5000, 1124, 2542, 165]

#set up DataFrames
daily_stock_price  = pd.DataFrame(index=pd.bdate_range(start, end)) # business days
daily_stock_share = pd.DataFrame(index=pd.bdate_range(start, end), columns=ticker)
daily_stock_value = pd.DataFrame(index=pd.bdate_range(start, end), columns=ticker)
daily_portfolio_value = pd.DataFrame(index=pd.bdate_range(start, end))

In [5]:
daily_stock_price = DataReader(ticker, 'yahoo', start, end)['Adj Close']

In [6]:
for i, s in enumerate(ticker):
    daily_stock_share[s] = share[i]
daily_stock_value = daily_stock_price * daily_stock_share
daily_portfolio_value = daily_stock_value.sum(axis=1)

In [11]:
daily_stock_price.head()


Out[11]:
AAPL AMZN ATVI BBBY BRK.B COST DDD DIS DISCK F GLD SBUX SPY
Date
2013-01-22 492.40 270.19 11.25 56.49 95.91 101.07 46.53 52.09 61.80 13.80 163.67 54.27 146.18
2013-01-23 501.41 268.11 11.16 56.52 96.48 101.04 45.57 53.29 61.79 13.52 163.21 53.75 146.41
2013-01-24 439.46 273.46 11.20 58.99 97.31 101.81 46.44 53.29 62.20 13.51 161.42 53.86 146.45
2013-01-25 429.10 283.99 11.24 59.78 97.39 101.28 46.05 53.72 62.80 13.33 160.65 56.07 147.28
2013-01-28 438.81 276.04 11.25 58.51 97.12 101.41 39.67 53.70 63.01 13.52 160.29 55.29 147.10

5 rows × 13 columns


In [12]:
daily_stock_price.tail()


Out[12]:
AAPL AMZN ATVI BBBY BRK.B COST DDD DIS DISCK F GLD SBUX SPY
Date
2014-01-13 535.73 390.98 17.87 68.30 114.01 114.77 91.58 73.27 75.21 16.11 121.02 75.12 181.69
2014-01-14 546.39 397.54 17.49 66.69 114.96 116.23 91.21 74.45 75.72 16.40 119.89 75.46 183.67
2014-01-15 557.36 395.87 17.39 67.34 115.85 116.24 89.76 74.28 75.85 16.70 119.66 76.19 184.66
2014-01-16 554.25 395.80 17.33 67.15 115.24 115.56 92.17 74.21 75.32 16.73 119.79 75.29 184.42
2014-01-17 540.67 399.61 16.96 66.05 115.07 116.29 90.53 73.98 74.53 16.52 120.93 74.90 183.64

5 rows × 13 columns


In [13]:
daily_stock_share.head()


Out[13]:
AAPL AMZN ATVI BBBY BRK.B COST DDD DIS DISCK F GLD SBUX SPY
2013-01-21 635 850 12313 1104 840 2115 922 2007 1840 5000 1124 2542 165
2013-01-22 635 850 12313 1104 840 2115 922 2007 1840 5000 1124 2542 165
2013-01-23 635 850 12313 1104 840 2115 922 2007 1840 5000 1124 2542 165
2013-01-24 635 850 12313 1104 840 2115 922 2007 1840 5000 1124 2542 165
2013-01-25 635 850 12313 1104 840 2115 922 2007 1840 5000 1124 2542 165

5 rows × 13 columns


In [14]:
daily_stock_value.dropna().plot()
show()



In [15]:
daily_portfolio_value = daily_portfolio_value.dropna()

In [16]:
daily_portfolio_value.plot()
show()



In [17]:
year_return = daily_portfolio_value[-1:] - daily_portfolio_value[0]

In [18]:
percent_return = year_return / daily_portfolio_value[0]

In [19]:
print("Start: ${:,.2f} on {:%Y-%m-%d}".format(daily_portfolio_value[0], daily_portfolio_value.index[0]))
print("  End: ${:,.2f} on {:%Y-%m-%d}".format(daily_portfolio_value[-1], daily_portfolio_value.index[-1]))
print("  Min: ${:,.2f} on {:%Y-%m-%d}".format(daily_portfolio_value.min(), daily_portfolio_value.idxmin()))
print("  Max: ${:,.2f} on {:%Y-%m-%d}".format(daily_portfolio_value.max(), daily_portfolio_value.idxmax()))
print("Total return for the year is ${:,.2f} for a return of {:.2%}".format(year_return[0], percent_return[0]))


Start: $1,713,745.57 on 2013-01-22
  End: $2,115,657.22 on 2014-01-17
  Min: $1,666,887.17 on 2013-02-04
  Max: $2,187,013.09 on 2013-12-26
Total return for the year is $401,911.65 for a return of 23.45%

In [ ]: