In [1]:
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
assets = ["BVMF:ABEV3", "BVMF:ITUB3"]
bvmf_data = pd.DataFrame()
for t in assets:
bvmf_data[t] = wb.DataReader(t, data_source='google', start='2009-1-1')['Close']
In [3]:
bvmf_data.head()
Out[3]:
In [4]:
log_returns = np.log(bvmf_data / bvmf_data.shift(1)) # Normalizing returns by using log
In [5]:
def rand_weights(n):
''' Produces n random weights that sum to 1 '''
weights = np.random.rand(n)
weights /= np.sum(weights)
return weights
# Create a random portfolio distribution weigths, that sums 100%
print(rand_weights(len(assets)))
In [6]:
pfolio_returns = []
pfolio_volatilities = []
for x in range (10000):
weights = rand_weights(len(assets))
pfolio_returns.append(np.sum(weights * log_returns.mean()) * 250)
pfolio_volatilities.append(np.sqrt(np.dot(weights.T,np.dot(log_returns.cov() * 250, weights))))
pfolio_returns = np.array(pfolio_returns)
pfolio_volatilities = np.array(pfolio_volatilities)
pfolio_returns, pfolio_volatilities
Out[6]:
In [7]:
portfolios = pd.DataFrame({'Return': pfolio_returns, 'Volatility': pfolio_volatilities})
In [8]:
portfolios.plot(x='Volatility', y='Return', kind='scatter', figsize=(10, 6));
plt.xlabel('Expected Volatility')
plt.ylabel('Expected Return')
Out[8]:
In [ ]: