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]:
BVMF:ABEV3 BVMF:ITUB3
Date
2013-11-11 17.40 22.92
2013-11-12 17.06 22.89
2013-11-13 17.03 23.50
2013-11-14 17.47 23.73
2013-11-18 17.65 24.05

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)))


[ 0.71139326  0.28860674]

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]:
(array([ 0.04001752,  0.05976357,  0.02573214, ...,  0.06399491,
         0.07472444,  0.0497893 ]),
 array([ 0.20796799,  0.22082588,  0.21376254, ...,  0.22646838,
         0.24456425,  0.21139891]))

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]:
<matplotlib.text.Text at 0x7fceef6f7160>

In [ ]: